about_Redirection

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

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

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

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

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

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

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

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

Дополнительные сведения о потоках см. в about_Output_Потоки.

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

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

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

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

Внимание

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

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

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

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

Примечание.

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

Примеры

Пример 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.ps1script.logв файл.

.\script.ps1 *> script.log

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

В этом примере все данные потока информации подавляются. Дополнительные сведения о командлетах потока сведений см. в разделе "Запись изапись"

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

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

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

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

При записи в файл с помощью операторов 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

Дополнительные сведения см. в $PSDefaultParameterValuesabout_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 оператора.

См. также