Поделиться через


Перенаправление выходных данных

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

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

Во-вторых, эти командлеты используют команду PowerShell Out , так как они отправляют информацию из PowerShell в другое место.

Вывод на консоль

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

Get-Command | Out-Host -Paging

Окно узла находится за пределами PowerShell. Это важно, так как при отправке данных из PowerShell он фактически удаляется. Это можно увидеть, если попытаться создать конвейер, выводящий страницы данных в основное окно, а затем попробовать отформатировать их в виде списка, как показано ниже:

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

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-Null предназначен для немедленного удаления всех получаемых входных данных. Это удобно для удаления посторонних данных, получаемых при выполнении команды. При вводе следующей команды вы не получите ничего обратно из команды:

Get-Command | Out-Null

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

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

Печать данных

Out-Printer доступен только на платформах Windows.

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

Get-Command -Name Get-* | Out-Printer -Name 'Microsoft Office Document Image Writer'

Сохранение данных

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

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

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

В окне PowerShell 5.1 Out-File командлет создает файл Юникода. Некоторые средства, ожидающие файлы ASCII, не работают правильно с форматом выходных данных по умолчанию. Формат выходных данных по умолчанию можно изменить на ASCII с помощью параметра кодировки :

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

Out-file форматирует содержимое файлов, чтобы оно было похоже на выходные данные консоли. Это приводит к усечению выходных данных так же, как в окне консоли в большинстве случаев. Например, если выполнить следующую команду:

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-разрядное целое число, его максимальное значение равно 2147483647. Введите следующую команду, чтобы установить ширину строки в максимальное значение:

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

Командлет Out-File наиболее полезен, если требуется сохранить выходные данные в том виде, в котором они отображались бы на консоли.