about_Redirection

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

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

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

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

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

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

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

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

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

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

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

Поток # Описание Представлено в Командлет write
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
* Все потоки PowerShell 3.0

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

Важно!

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

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

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

Оператор Описание Синтаксис
> Отправка указанного потока в файл. n>
>> Добавление указанного потока в файл. n>>
>&1 Перенаправляет указанный поток в поток успешности . 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.ps1 в файл. script.log

.\script.ps1 *> script.log

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

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

&{
   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
Cannot find path 'C:\not-here' because it does not 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 кодировку. Если файл имеет другую кодировку, выходные данные могут быть отформатированы неправильно. Для записи в файлы с другой кодировкой используйте 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.

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

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

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

См. также