В статье «Использование объектных методов PowerShell», опубликованной в предыдущем номере журнала, мы начали знакомиться с методами, которые предусмотрены в объектах PowerShell. Продолжая изучение этих методов, с помощью PowerShell мы заставим компьютер говорить.
В упомянутой статье мы рассматривали команду Get-Date, возвращающую текущую дату и время. Подавая по конвейеру выход этой команды на вход Get-Member, мы видим, что Get-Date возвращает не просто строку символов, а объект типа дата/время:
PS C:\> get-date | get-member TypeName: System.DateTime
Выше показана лишь первая строка выходных данных Get-Member, по которой видно, что Get-Member сообщает о типе TypeName строкой, состоящей из двух и более частей. В нашем примере это System и DateTime. Обычно TypeName именуют по его правой части, поэтому будем называть его объектом DateTime, а не объектом System.DateTime.
Результатом выполнения данной команды является выдаваемый на экран список методов под первой строкой TypeName: System.DateTime, включая методы AddHours и AddDays, с которыми мы познакомились в прошлый раз. Вспомним, что для вызова метода объекта нужно поставить точку, указать имя метода и заключенное в скобки значение, передаваемое методу, например:
(get-date).AddMinutes (4)
Результатом такого запроса будет текущая дата, к которой добавлены четыре минуты. Некоторые методы не требуют передачи значения, но и в этом случае скобки должны присутствовать. Например, Get-Date выдает укороченную дату, если вызвать метод ToShortTimeString:
PS C:\> (get-date).ToShortTimestring () 11:08 AM
Рассмотрим другой пример. В системах начиная с Windows 7 встроен речевой синтезатор, а среда выполнения. NET имеет набор классов, позволяющих управлять им. Из этих классов построим объект по имени $talker:
Add-Type -AssemblyName System.speech $talker = New-Object System.Speech.Synthesis.SpeechSynthesizer
Эти две строки очень интересны, поскольку технология. NET, на которой построены многие команды PowerShell, включает класс, наделяющий компьютер способностью говорить. К сожалению, разработчики не предусмотрели встроенной команды с соответствующим именем, например speak-text. Однако команды Add-Type и New-Object позволяют получить доступ к синтезатору речи.
Итак, если вам не терпится услышать голос своей системы, введите следующий запрос:
$talker.speak («hello there»)
Очевидно, что объект типа System.Speech.Synthesis.SpeechSynthesizer (или SpeechSynthesizer) включает метод по имени speak, которому можно передавать текст для произнесения. Что еще может делать этот объект? Здесь опять же неоспорима ценность Get-Member, особенно когда средствами PowerShell исследуется класс. NET, для которого на данный момент не существует встроенных команд. С помощью запроса
$talker | get-member
выведем список методов, в котором, в частности, присутствует GetInstalledVoices (). Исследуем этот метод, для чего введем запрос
$talker.GetInstalledVoices ()
В моей системе Windows 8.1 он возвращает лишь три строки System.Speech.Synthesis.VoiceInfo. Не слишком информативно, поэтому попытаемся вновь применить Get-Member, но на этот раз вместо элементов и свойств объекта SpeechSynthesizer выведем данные об объекте System.Speech.Synthesis.VoiceInfo:
$talker.GetInstalledVoices () | Get-Member
В ответ получаем два свойства: Enabled и VoiceInfo. Исследуем Voiceinfo, для чего добавим точку и voiceinfo к первой части предыдущего запроса:
$talker.GetInstalledVoices ().voiceinfo
Заметим, что в этом запросе мы указываем элемент (один из методов) $talker, а именно. GetInstalledVoices (), а затем элемент (одно из свойств) данного элемента. Результатом этого запроса является информация обо всех голосах системы. У моей системы три голоса: Дэвид, Зира и Хэйзел. Продолжая «точечное» исследование структуры $talker, добавим. name:
$talker.GetInstalledVoices ().voiceinfo.name
и получим четкий список имен. Схема проста: запрос с $talker возвращает объект синтезатора речи, а именно. GetInstalledVoices (). Добавляя к методу.GetInstalledVoices () свойство voiceinfo, получаем информацию об установленных голосах, а добавление. name позволяет извлечь из результатов имена. На каждом этапе нашего исследования мы с помощью Get-Member выясняем возможности, существующие на данном уровне, что позволяет выбрать направление для дальнейших исследований. Конечно, когда мы доходим до name, то дальше идти уже некуда.
Как я узнал, что для GetInstalledVoices () не нужно ничего указывать в скобках? Просто попробовал! Такие эксперименты обычно дают результат. Однако в действительности методу GetInstalledVoices можно передавать параметр, что я выяснил, изучая документацию по. NET, но об этом речь пойдет в следующий раз.