Конвейеризация работает фактически везде в оболочке Windows PowerShell. Хотя на экране виден текст, Windows PowerShell не пропускает текст конвейером между командами. На самом деле оболочка пропускает по конвейеру объекты.
Форма записи конвейеров сходна с формой, используемой в других оболочках, так что на первый взгляд не очевидно, что тут Windows PowerShell вводит что-то новое. Например, при использовании командлета Out-Host для постраничного отображения вывода другой команды вывод выглядит как обычный текст, отображаемый на экране и разбитый на страницы:
PS> Get-ChildItem -Path C:\WINDOWS\System32 | Out-Host -Paging Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS\system32 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2005-10-22 11:04 PM 315 $winnt$.inf -a--- 2004-08-04 8:00 AM 68608 access.cpl -a--- 2004-08-04 8:00 AM 64512 acctres.dll -a--- 2004-08-04 8:00 AM 183808 accwiz.exe -a--- 2004-08-04 8:00 AM 61952 acelpdec.ax -a--- 2004-08-04 8:00 AM 129536 acledit.dll -a--- 2004-08-04 8:00 AM 114688 aclui.dll -a--- 2004-08-04 8:00 AM 194048 activeds.dll -a--- 2004-08-04 8:00 AM 111104 activeds.tlb -a--- 2004-08-04 8:00 AM 4096 actmovie.exe -a--- 2004-08-04 8:00 AM 101888 actxprxy.dll -a--- 2003-02-21 6:50 PM 143150 admgmt.msc -a--- 2006-01-25 3:35 PM 53760 admparse.dll <SPACE> next page; <CR> next line; Q quit ...
Команда Out-Host -Paging является полезным элементом конвейера там, где необходимо медленно отобразить большой объем данных. Она особенно полезна при очень большой загрузке ЦП. Так как обработка передается командлету Out-Host, когда в нем имеется полная готовая к отображению страница, командлеты, стоящие в конвейере ранее, останавливают свою работу, пока не будет подготовлена следующая страница вывода. Это можно наблюдать при использовании диспетчера задач Windows для контроля использования ЦП и памяти оболочкой Windows PowerShell.
Выполните следующую команду: Get-ChildItem C:\Windows -Recurse. Сравните использование ЦП и памяти с аналогичными показателями следующей команды: Get-ChildItem C:\Windows -Recurse | Out-Host -Paging. На экране виден текст, потому, что в окне консоли объекты необходимо представить в виде текста. Это представление того, что действительно происходит в оболочке Windows PowerShell. Например, рассмотрим командлет Get-Location. Если ввести Get-Location, когда текущим положением является корень диска С, будут выведены следующие данные:
PS> Get-Location Path ---- C:\
Если оболочка Windows PowerShell конвейеризует текст, выпуская такую команду как Get-Location | Out-Host, из Get-Location в Out-Host передается набор знаков в порядке их отображения на экране. Другими словами, если игнорировать данные заголовка, Out-Host вначале получит символ C', затем символ :', а затем символ \'. Командлет Out-Host не может определить, какой смысл связан с выходными знаками, выводимыми командлетом Get-Location.
Вместо использования текста для связи команд в конвейере Windows PowerShell использует объекты. С точки зрения пользователя, объекты упаковывают связанную информацию в форму, в которой информацией можно легче манипулировать как единым блоком, и они при необходимости извлекают оттуда определенные элементы.
Команда Get-Location не возвращает текст, содержащий текущий путь. Она возвращает пакет информации, называемый объектом PathInfo, содержащий текущий путь вместе с некоторой другой информацией. Затем командлет Out-Host пересылает этот объект PathInfo на экран, и оболочка Windows PowerShell решает, какую информацию следует отобразить и как ее надо отобразить на основании ее правил форматирования.
Фактически вывод информации заголовка командлета Get-Location добавляется только в конце процесса, как часть процесса форматирования данных, выводимых на экран. На экране видны сводные данные, а не полное представление выходного объекта.
Если выводом команды Windows PowerShell является большее количество информации, чем может быть отражено в окне консоли, каким образом можно извлечь невидимые элементы? Каким образом можно видеть дополнительные данные? И что делать в случае, если необходимо просмотреть данные в формате, отличном от формата, обычно используемого в оболочке Windows PowerShell?
В оставшейся части этой главы рассматривается, каким образом можно исследовать структуру определенных объектов Windows PowerShell, выбирая определенные элементы и форматируя их для более удобного отображения, и как послать эту информацию в альтернативные места вывода, такие как файлы и принтеры.