Конвейеризация работает фактически везде в оболочке 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, выбирая определенные элементы и форматируя их для более удобного отображения, и как послать эту информацию в альтернативные места вывода, такие как файлы и принтеры.




Содержание