Windows PowerShell — один из тех замечательных продуктов, которые постоянно удивляют новыми возможностями и функциями. Получение выходной информации — на экран или в любом другом виде — является одной областью, где замечательно видна глубина и многогранность Windows PowerShell.
Откройте экземпляр Windows PowerShell (предпочтительно версии 2, которая доступна для всех версий Windows, начиная с Windows XP) и выполните команду Gcm –verb Out. Вы увидите список всех командлетов, способных генерировать выходные данные в различных формах.
Как происходит вывод
Как и все остальное в Windows PowerShell, различные командлеты, название которых начинается с Out-, «потребляют» объекты. Это означает, что выходные данные отображаются в окне при выполнении команды, похожей на эту:
В действительности, часть с Out-Host не нужна, потому что в Windows PowerShell в конце конвейера есть жестко прописанный командлет Out-Default, которые переправляет все в Out-Host. Так что такая команда:
функционально равноценна команде:
«Под капотом» Out-Default переправит объекты в Out-Host. Интересная особенность всех командлетов, название которых начинается с Out-, в том, что они не в состоянии обрабатывать «реальные» объекты — только специальный тип объекта форматирования, созданного подсистемой форматирования оболочки.
Получая «нормальные» объекты, внутренние механизмы командлета вызывают один из Format-командлетов, используя набор внутренних правил и параметров конфигурации по умолчанию. Format-командлет предоставляет объекты форматирования, описывающие порядок построения выходных данных, а Out-командлет помещает их в указанное устройство. Так, при выполнении команды:
в действительности выполняется такая последовательность:
Суть в том, что Out-командлеты могут использовать только то, что предоставлено Format-командлетом. По большей части только Out-командлеты способны обработать то, что предоставляют Format-командлеты. Таким образом, ваша командная строка будет всегда завершаться Format-командлетом за исключением ситуаций, когда в конце стоит Out-командлет.
Out: конец истории
Поскольку предполагается, что Out-командлеты имеют дело с конечным результатом всех предыдущих команд, сами по себе (за одним исключением) они не производят никаких выходных данных. Если вы используете Out-командлет, он всегда будет стоять последним в командной строке. По завершении этого командлета в конвейере не остается ничего, с чем могли бы работать другие командлеты.
Единственное исключение из этого правила, по крайней мере, когда речь идет о встроенных командлетах, — Out-String. Поведение этого командлета сильно отличается от работы обычных Out-командлетов. Он помещает String-объекты в конвейер. Этот командлет и его исключения нас сейчас не интересуют — просто знайте, что они существуют. Чтобы узнать о нем поподробнее, выполните команду Help Out-String.
Минуточку — я сказал «встроенные Out-командлеты»? Все правильно, этим я хотел сказать, что есть другие Out-командлеты. В частности, есть платное расширение PowerGadgets, разработанное сторонней компанией и добавляющее в оболочку интересные командлеты, такие как Out-Chart и Out-Gauge. Дополнительные командлеты не обязаны соблюдать все описанные здесь правила, так что не забудьте предварительно прочитать относящиеся к ним страницы справки (если они есть), чтобы лучше понять, как они работают и что делают.
Варианты использования Out-командлетов
Windows PowerShell поддерживает много встроенных вариантов вывода информации:
- Out-Host используется по умолчанию, если не задать что-то другое;
- Out-Printer отправляет выходную информацию на принтер. Информация форматируется с использованием специально заданного Format-командлета или того, что задан по умолчанию в подсистеме форматирования;
- Out-File отправляет информацию в файл. С точки зрения функциональности это то же самое, что выполнение команды Dir > file.txt. Причем сокращенные команды > и >> фактически используют командлет Out-File. У Out-File масса вариантов определения ширины выходного файла (что влияет на то, как оболочка решает отформатировать выходные данные), кодировки символов, режима записи (добавление или перезапись) и т. п.
- Out-Grid появился в Windows PowerShell v2 и для своей работы требует Microsoft .NET Framework 3.5 SP1. Этот командлет отображает объекты в графической таблице, поддерживающей сортировку по щелчку столбцов и оснащенной полем фильтрации и поиска нужных результатов.
Очень полезно почитать справку этих командлетов. Например, знаете ли вы, что в Out-Host есть параметр –paging, заставляющий отображать выходную информацию по странице за раз? Он напоминает команду more в старой оболочке Cmd.exe. Попробуйте выполнить такую команду:
Параметр –width позволяет создавать исключительно широкие таблицы. С его помощью я создавал огромные таблицы и печатал полученные файлы на плоттере, получая наглядные плакаты, которые можно было вешать на стену. По умолчанию задана ширина в 80 столбцов, что недостаточно для очень широких таблиц. По умолчанию оболочка отобразит данные в виде таблицы, только если в них не больше четырех столбцов или если конфигурация по умолчанию предусматривает нестандартное размещение таблицы:
У Out-Printer есть параметр –name, позволяющий задать нужный принтер, если он отличается от текущего принтера Windows.
Наконец, параметр –title в командлете Out-Grid позволяет определить заголовок окна. Это полезно, когда сценарий отображает сетку, потому что удачный заголовок сильно помогает пользователю понять смысл.
Когда вывод не нужен
Командлету Out-Null. можно «скормить» выходные данные, которые отображать не надо. Например, большинство методов WMI возвращает объект, информирующий об успехе или неудаче операции. Если вы не хотите видеть эти сведения, просто передайте их по конвейеру в Out-Null:
«Играясь» с различными вариантами вывода, можно не только лучше разобраться, как работает и что умеет делать Windows PowerShell, но и понять, насколько можно облегчить себе работу и не тратить лишние усилия.
Связанные материалы
Invoke-WmiMethod –name reboot –class win32_operatingsystem |
Out-Null
Get-WmiObject Win32_Service | Format-Table * |
Out-File c:\services.txt –width 750
Get-Service | Out-Host –paging
Get-Process | Format-Table | Out-Host
Get-Process
Get-Process | Out-Default
Get-Process
Get-Process | Out-Host