Windows PowerShell предоставляет несколько командлетов, которые позволяют напрямую управлять выводом данных. Эти командлеты обладают двумя общими важными характеристиками.

Во-первых, они обычно преобразуют данные в некоторое текстовое представление. Преобразование выполняется, поскольку данные выводятся в системные компоненты, ожидающие текстовый ввод. Это означает, что объекты должны быть представлены в текстовом виде. Поэтому текст форматируется в виде, пригодном для отображения в окне консоли Windows PowerShell.

Во-вторых, эти командлеты используют команду Windows PowerShell Out, поскольку отправляют сведения из Windows PowerShell за пределы оболочки. Командлет Out-Host не является исключением: окно ведущего приложения отображается вне Windows PowerShell. Это важно, поскольку при передаче из Windows PowerShell данные в действительности удаляются. Убедиться в этом можно, если попытаться создать конвейер, который постранично передает данные в окно главного приложения и пытается отформатировать их в виде списка, как показано ниже:

PS> Get-Process | Out-Host -Paging | Format-List

Можно было бы ожидать, что команда отобразит страницы сведений о процессе в виде списка. Вместо этого она выводит их в виде табличного списка по умолчанию:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    101       5     1076       3316    32     0.05   2888 alg
...
    618      18    39348      51108   143   211.20    740 explorer
    257       8     9752      16828    79     3.02   2560 explorer
...
<SPACE> next page; <CR> next line; Q quit
...

Командлет Out-Host передает данные напрямую консоли, поэтому команда Format-List так и не получает ничего для форматирования.

Чтобы правильно структурировать эту команду, нужно поместить командлет Out-Host в конец конвейера, как показано ниже. При этом данные процесса форматируются в виде списка перед разбиением на страницы и отображением.

PS> Get-Process | Format-List | Out-Host -Paging


Id      : 2888
Handles : 101
CPU     : 0.046875
Name    : alg
...

Id      : 740
Handles : 612
CPU     : 211.703125
Name    : explorer

Id      : 2560
Handles : 257
CPU     : 3.015625
Name    : explorer
...
<SPACE> next page; <CR> next line; Q quit
...

Это относится ко всем командлетам Out. Командлет Out всегда должен находиться в конце конвейера.

Примечание.

Все командлеты Out подготавливают вывод в виде текста, используя текущее форматирование для окна консоли, включая ограничения на длину строки.

Разбивка вывода консоли на страницы (командлет Out-Host)

По умолчанию Windows PowerShell передает данные в окно главного приложения, что и является функцией командлета Out-Host. Как было описано ранее, основное назначение командлета Out-Host заключается в разбивке данных на страницы. Например, следующая команда использует командлет Out-Host для разбивки на страницы вывода командлета Get-Command.

PS> Get-Command | Out-Host -Paging

Для разбивки данных на страницы можно также использовать функцию more. В Windows PowerShell функция more вызывает команду Out-Host -Paging. Следующая команда демонстрирует использование функции more для разбивки на страницы вывода командлета Get-Command:

PS> Get-Command | more

Если в качестве параметров этой функции указать одно или несколько имен файлов, функция прочитает указанные файлы и разобьет на страницы их содержимое при передаче в главное приложение:

PS> more c:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
...

Отмена вывода (командлет Out-Null)

Командлет Out-Null разработан для немедленной отмены каких-либо получаемых им входных данных. Это полезно при отбрасывании ненужных данных, полученных в качестве побочного эффекта выполнения команды. Если ввести следующую команду, ее выполнение не приведет к выдаче какого-либо результата:

PS> Get-Command | Out-Null

Командлет Out-Null не отбрасывает сообщения об ошибках. Например, если ввести следующую команду, будет отображено сообщение о том, что оболочка Windows PowerShell не распознала вызов Is-NotACommand:

PS> Get-Command Is-NotACommand | Out-Null
Get-Command : 'Is-NotACommand' is not recognized as a cmdlet, function, operabl
e program, or script file.
At line:1 char:12
+ Get-Command  <<<< Is-NotACommand | Out-Null

Печать данных (командлет Out-Printer)

Данные можно распечатать при помощи командлета Out-Printer. Командлет Out-Printer использует принтер по умолчанию, если не указано имя принтера. Можно использовать любой принтер Windows, указав его отображаемое имя. Отсутствует необходимость как в привязке порта принтера, так и в присутствии реального физического принтера. Например, если имеются установленные средства управления образами документов Microsoft Office, можно направить данные в файл изображения, введя следующее:

PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"

Сохранение данных (командлет Out-File)

Вывод можно направить в файл вместо окна консоли с помощью командлета Out-File. Следующая команда направляет список процессов в файл C:\temp\processlist.txt:

PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt 

Результаты использования командлета Out-File не всегда соответствуют ожидаемым, если пользователь привык к традиционному перенаправлению вывода. Чтобы разобраться в его действии, нужно учесть контекст, в котором выполняется командлет Out-File.

По умолчанию командлет Out-File создает файл в формате Юникод. Это наилучшее долговременное решение, но средства, которые принимают на входе файлы ASCII, не будут корректно работать с таким форматом вывода по умолчанию. Формат вывода по умолчанию можно изменить на ASCII с помощью параметра Encoding:

PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII

Командлет Out-file форматирует содержимое файла так, чтобы оно выглядело аналогично выводу консоли. Это приводит к обрезанию вывода, как это чаще всего и происходит в окне консоли. Предположим, например, что выполняется следующая команда:

PS> Get-Command | Out-File -FilePath c:\temp\output.txt

Вывод будет выглядеть следующим образом:

CommandType     Name                            Definition                     
-----------     ----                            ----------                     
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
...

Чтобы получить вывод, который не использует переносы строк для обеспечения соответствия ширине экрана, можно воспользоваться параметром Width для указания ширины строки. Поскольку параметр Width представляет собой 32-разрядное целое число, его максимальное значение может быть равно 2 147 483 647. Чтобы установить ширину строки в максимальное значение, введите следующее:

Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647

Командлет Out-File наиболее полезен, когда нужно сохранить вывод в том же виде, в каком он отображается на консоли. Для более точного управления форматом вывода необходимо наличие дополнительных средств. Они, а также некоторые подробности работы с объектами, будут рассмотрены в следующей главе.




Содержание