about_Redirection
Краткое описание
Описание перенаправления выходных данных из PowerShell в текстовые файлы.
Подробное описание
По умолчанию PowerShell отправляет выходные данные на узел PowerShell. Обычно это консольное приложение. Однако вы можете перенаправить выходные данные в текстовый файл и перенаправить выходные данные ошибок в обычный выходной поток.
Для перенаправления выходных данных можно использовать следующие методы:
Используйте командлет, который отправляет выходные
Out-File
данные команды в текстовый файл. Как правило, командлет используетсяOut-File
при необходимости использовать его параметры, такие какEncoding
, ,Force
Width
илиNoClobber
параметры.Tee-Object
Используйте командлет, который отправляет выходные данные команды в текстовый файл, а затем отправляет его в конвейер.Используйте операторы перенаправления PowerShell. Использование оператора перенаправления с целевым объектом файла функционально эквивалентно пилингу
Out-File
без дополнительных параметров.
Дополнительные сведения о потоках см. в about_Output_Потоки.
Перенаправленные выходные потоки
PowerShell поддерживает перенаправление следующих выходных потоков.
Поток # | Description | Представлено в | Командлет записи |
---|---|---|---|
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 также существует поток хода выполнения , но он не поддерживает перенаправление.
Важно!
Потоки успешности и ошибки похожи на потоки stdout и stderr других оболочк. Однако stdin не подключен к конвейеру PowerShell для ввода.
Операторы перенаправления PowerShell
Операторы перенаправления PowerShell приведены следующим образом, где n
представляет номер потока. Поток успешного выполнения ( 1
) — это значение по умолчанию, если поток не указан.
Operator | Описание | Синтаксис |
---|---|---|
> |
Отправьте указанный поток в файл. | n> |
>> |
Добавление указанного потока в файл. | n>> |
>&1 |
Перенаправляет указанный поток в поток success . | 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 "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
Can't find path 'C:\not-here' because it doesn't 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
кодировку. Если файл имеет другую кодировку, выходные данные могут быть отформатированы неправильно. Чтобы записать в файлы с другой кодировкой, используйте командлет с его Encoding
параметромOut-File
.
Ширина выходных данных при записи в файл
При записи в файл с помощью операторов 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.
Перенаправление двоичных данных
PowerShell не поддерживает перенаправление двоичных данных. При перенаправлении данных байт-потока PowerShell обрабатывает данные как строки. Это перенаправление приводит к повреждению данных.
Потенциальная путаница с операторами сравнения
Оператор >
не следует путать с оператором сравнения "Больше,чем " (часто обозначается как >
на других языках программирования).
В зависимости от сравниваемых объектов выходные данные, которые используются >
, могут быть правильными (так как 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 оператора.
См. также
PowerShell feedback
PowerShell is an open source project. Select a link to provide feedback:
Обратная связь
Отправить и просмотреть отзыв по