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


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

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

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

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

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