about_Redirection

Краткое описание

Объясняется, как перенаправлять выходные данные из PowerShell в текстовые файлы.

Подробное описание

По умолчанию PowerShell отправляет выходные данные на узел PowerShell. Обычно это консольное приложение. Однако вы можете перенаправить выходные данные в текстовый файл, а выходные данные ошибок — в обычный поток вывода.

Для перенаправления выходных данных можно использовать следующие методы:

  • Out-File Используйте командлет , который отправляет выходные данные команды в текстовый файл. Как правило, командлет используется Out-File , когда необходимо использовать его параметры, такие как Encoding, Force, Widthили NoClobber .

  • Tee-Object Используйте командлет , который отправляет выходные данные команды в текстовый файл, а затем отправляет их в конвейер.

  • Используйте операторы перенаправления PowerShell. Использование оператора перенаправления с целевым объектом файла функционально эквивалентно конвейеру Out-File без дополнительных параметров.

Дополнительные сведения о потоках см. в разделе about_Output_Streams.

Перенаправляемые выходные потоки

PowerShell поддерживает перенаправление следующих потоков вывода.

Stream # Описание Представлено в Командлет Write
1 Успешное Stream PowerShell 2.0 Write-Output
2 Stream ошибок PowerShell 2.0 Write-Error
3 Предупреждение Stream PowerShell 3.0 Write-Warning
4 Подробные Stream PowerShell 3.0 Write-Verbose
5 Отладка Stream PowerShell 3.0 Write-Debug
6 Информационные Stream PowerShell 5.0 Write-Information, Write-Host
* Все потоки PowerShell 3.0

В PowerShell также есть поток Хода выполнения , но он не поддерживает перенаправление.

Важно!

Потоки Success и Error похожи на потоки stdout и stderr других оболочек. Однако stdin не подключен к конвейеру PowerShell для ввода данных.

Операторы перенаправления PowerShell

Операторы перенаправления PowerShell приведены ниже, где n представляет номер потока. Поток успешного выполнения ( 1 ) используется по умолчанию, если поток не указан.

Оператор Описание Синтаксис
> Отправка указанного потока в файл. n>
>> Добавьте указанный поток в файл. n>>
>&1 Перенаправляет указанный поток в поток Success . n>&1

Примечание

В отличие от некоторых оболочек Unix, другие потоки можно перенаправлять только в поток успешного выполнения.

Примеры

Пример 1. Перенаправление ошибок и выходных данных в файл

Этот пример выполняется dir для одного элемента, который выполняется успешно, и для одного из элементов, который завершается сбоем.

dir C:\, fakepath 2>&1 > .\dir.log

2>&1 Используется для перенаправления потока ошибок в поток успешного выполнения, а > результирующий поток успешности — в файл с именемdir.log

Пример 2. Отправка всех данных потока успешного выполнения в файл

В этом примере все данные потока успешно отправляются в файл с именем script.log.

.\script.ps1 > script.log

Пример 3. Отправка потоков успешного выполнения, предупреждений и ошибок в файл

В этом примере показано, как объединить операторы перенаправления для достижения желаемого результата.

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1 перенаправляет поток предупреждений в поток Успешно .
  • 2>&1 перенаправляет поток ошибок в поток успешного выполнения (который теперь также включает все данные потока предупреждений ).
  • > перенаправляет поток успешного выполнения (который теперь содержит потоки предупреждений и ошибок ) в файл с именем C:\temp\redirection.log.

Пример 4. Перенаправление всех потоков в файл

В этом примере все выходные данные потоков из скрипта с именем script.ps1 отправляются в файл с именем script.log.

.\script.ps1 *> script.log

Пример 5. Подавление всех данных Write-Host и информационных потоков

В этом примере подавляются все данные потока информации. Дополнительные сведения о командлетах потока данных см. в разделах Write-Host и Write-Information.

&{
   Write-Host "Hello"
   Write-Information "Hello" -InformationAction Continue
} 6> $null

Пример 6. Отображение эффекта параметров действия

Переменные и параметры предпочтения действия могут изменять то, что записывается в определенный поток. Скрипт в этом примере показывает, как значение $ErrorActionPreference влияет на то, что записывается в поток ошибок .

$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
    get-item /not-here 2>&1 >> log.txt
}
catch {
    "`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Continue'

При выполнении этого скрипта мы получаем запрос, если $ErrorActionPreference для задано значение Inquire.

PS C:\temp> .\test.ps1

Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
  23 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The running command stopped because the user selected the Stop option.

При изучении файла журнала мы видим следующее:

PS C:\temp> Get-Content .\log.txt
Continue

Get-Item: C:\temp\test.ps1:3
Line |
   3 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot find path 'C:\not-here' because it does not exist.

SilentlyContinue
Stop
    Error caught!
Ignore
Inquire

Примечания

Операторы перенаправления, которые не добавляют данные (> и n>), перезаписывают текущее содержимое указанного файла без предупреждения.

Однако если файл является файлом только для чтения, скрытым или системным файлом, перенаправление завершается ошибкой. Операторы перенаправления добавления (>> и n>>) не записываются в файл, доступный только для чтения, но добавляют содержимое в системный или скрытый файл.

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

При записи в файлы операторы перенаправления используют UTF8NoBOM кодировку. Если файл имеет другую кодировку, выходные данные могут быть отформатированы неправильно. Для записи в файлы с другой кодировкой используйте Out-File командлет со своим Encoding параметром .

Ширина выходных данных при записи в файл

При записи в файл с помощью Out-File операторов перенаправления или PowerShell форматирует выходные данные таблицы в файл в зависимости от ширины консоли, в которую он выполняется. Например, при записи выходных данных таблицы в файл с помощью такой команды, как Get-ChildItem Env:\Path > path.log в системе, где ширина консоли равна 80 столбцам, выходные данные в файле усекаются до 80 символов:

Name                         Value
----                         -----
Path                         C:\Program Files\PowerShell\7;C:\WINDOWS…

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

Командлет Out-File предоставляет параметр Width , который позволяет задать ширину, необходимую для выходных данных таблицы. Вместо того, чтобы добавлять -Width 2000 везде, где вызывается Out-File, можно использовать $PSDefaultParameterValues переменную , чтобы задать это значение для всех вариантов использования командлета Out-File в скрипте. А так как операторы перенаправления (> и >>) фактически являются псевдонимами для Out-File, установка Out-File:Width параметра для всего скрипта также влияет на ширину форматирования для операторов перенаправления. Поместите следующую команду в начало скрипта, чтобы задать Out-File:Width для всего скрипта:

$PSDefaultParameterValues['out-file:width'] = 2000

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

В некоторых случаях, например Get-Service выходных данных, чтобы использовать дополнительную ширину, необходимо передать выходные данные Format-Table -AutoSize перед выводом в файл.

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

Дополнительные сведения о $PSDefaultParameterValuesсм. в разделе about_Preference_Variables.

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

PowerShell не поддерживает перенаправление двоичных данных. Если вы перенаправляете данные байтового потока, PowerShell обрабатывает данные как строки. Это перенаправление приводит к повреждению данных.

Потенциальная путаница с операторами сравнения

Оператор > не следует путать с оператором сравнения "Больше чем " (часто обозначается как > в других языках программирования).

В зависимости от сравниваемых объектов выходные данные с помощью > могут показаться правильными (так как значение 36 не больше 42).

PS> if (36 > 42) { "true" } else { "false" }
false

Однако проверка локальной файловой системы может видеть, что файл с именем 42 был записан с содержимым 36.

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

Попытка использовать обратное сравнение < (меньше) приводит к системной ошибке:

PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

Если числовое сравнение является обязательной операцией, -lt следует использовать и -gt . Дополнительные сведения см. в описании -gt оператора в about_Comparison_Operators.

См. также раздел