about_Redirection

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

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

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

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

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

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

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

  • Используйте операторы перенаправления PowerShell. Перенаправление выходных данных команды PowerShell (командлета, функции, скрипта) с помощью оператора перенаправления (>) функционально эквивалентно пилингу Out-File без дополнительных параметров. PowerShell 7.4 изменил поведение оператора перенаправления при использовании для перенаправления потока stdout собственной команды.

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

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

PowerShell 7.4 изменил поведение операторов перенаправления при использовании для перенаправления потока stdout собственной команды. Теперь операторы перенаправления сохраняют данные байтового потока при перенаправлении выходных данных из собственной команды. PowerShell не интерпретирует перенаправленные данные или не добавляет дополнительное форматирование. Дополнительные сведения см. в примере #7.

Примеры

Пример 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

Пример 7. Перенаправление двоичных данных из собственной команды

Начиная с PowerShell 7.4, PowerShell сохраняет данные байтового потока при перенаправлении потока stdout собственной команды в файл или при передаче данных байт-потока в поток stdin собственной команды.

Например, с помощью собственной команды curl можно скачать двоичный файл и сохранить его на диск с помощью перенаправления.

$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'

# native command redirected to a file
curl -s -L $uri > powershell.tar.gz

Вы также можете передать данные байт-потока в поток stdin другой собственной команды. В следующем примере скачивает zippped TAR-файл с помощью curl. Скачанные данные файла передаются в tar команду, чтобы извлечь содержимое архива.

# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .

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

# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .

Эта функция не поддерживает данные байтового потока при перенаправлении выходных данных stderr на stdout. При объединении потоков stderr и stdout объединенные потоки обрабатываются как строковые данные.

Примечания.

Операторы перенаправления, которые не добавляют данные (> и 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.

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

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

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

См. также