Сведения о перенаправлении

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

Объясняется, как перенаправлять выходные данные из 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
* Все потоки PowerShell 3.0

Примечание

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

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

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

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

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

В зависимости от сравниваемых объектов выходные данные с помощью > могут показаться правильными (так как значение 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" }
At line:1 char:8
+ if (36 < 42) { "true" } else { "false" }
+        ~
The '<' operator is reserved for future use.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RedirectionNotSupported

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

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