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 |
* | Все потоки | 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
должно использоваться. Дополнительные сведения см. в -gt
about_Comparison_Operators оператора.