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