about_Redirection
Краткое описание
Объясняется, как перенаправлять выходные данные из PowerShell в текстовые файлы.
Подробное описание
По умолчанию PowerShell отправляет выходные данные на узел PowerShell. Обычно это консольное приложение. Однако вы можете перенаправить выходные данные в текстовый файл, а выходные данные ошибок — в обычный поток вывода.
Для перенаправления выходных данных можно использовать следующие методы:
Out-File
Используйте командлет , который отправляет выходные данные команды в текстовый файл. Как правило, командлет используетсяOut-File
, когда необходимо использовать его параметры, такие какEncoding
,Force
,Width
илиNoClobber
.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 , Write-Host |
* | Все потоки | PowerShell 3.0 |
В PowerShell также есть поток Хода выполнения , но он не поддерживает перенаправление.
Важно!
Потоки Success и Error похожи на потоки stdout и stderr других оболочек. Однако stdin не подключен к конвейеру 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 > 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 и 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
параметром .
Ширина выходных данных при записи в файл
При записи в файл с помощью 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
. Дополнительные сведения см. в -gt
разделе оператор в about_Comparison_Operators.