about_Redirection
Краткое описание
Описание перенаправления выходных данных из PowerShell в текстовые файлы.
Подробное описание
По умолчанию PowerShell отправляет выходные данные на узел PowerShell. Обычно это консольное приложение. Однако вы можете перенаправить выходные данные в текстовый файл и перенаправить выходные данные ошибок в обычный выходной поток.
Для перенаправления выходных данных можно использовать следующие методы:
Используйте командлет, который отправляет выходные
Out-File
данные команды в текстовый файл. Как правило, командлет используетсяOut-File
при необходимости использовать его параметры, такие какEncoding
, ,Force
Width
илиNoClobber
параметры.Tee-Object
Используйте командлет, который отправляет выходные данные команды в текстовый файл, а затем отправляет его в конвейер.Используйте операторы перенаправления PowerShell. Перенаправление выходных данных команды PowerShell (командлета, функции, скрипта) с помощью оператора перенаправления (
>
) функционально эквивалентно пилингуOut-File
без дополнительных параметров. PowerShell 7.4 изменил поведение оператора перенаправления при использовании для перенаправления потока stdout собственной команды.
Дополнительные сведения о потоках см. в 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 .
Перенаправление выходных данных из собственных команд
PowerShell 7.4 изменил поведение операторов перенаправления при использовании для перенаправления потока stdout собственной команды. Теперь операторы перенаправления сохраняют данные байтового потока при перенаправлении выходных данных из собственной команды. PowerShell не интерпретирует перенаправленные данные или не добавляет дополнительное форматирование. Дополнительные сведения см. в примере #7.
Примеры
Пример 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
Пример 7. Перенаправление двоичных данных из собственной команды
Начиная с PowerShell 7.4, PowerShell сохраняет данные байтового потока при перенаправлении потока stdout собственной команды в файл или при передаче данных байт-потока в поток stdin собственной команды.
Например, с помощью собственной команды curl
можно скачать двоичный файл и сохранить его на диск с помощью перенаправления.
$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'
# native command redirected to a file
curl -s -L $uri > powershell.tar.gz
Вы также можете передать данные байт-потока в поток stdin другой собственной команды. В следующем примере скачивает zippped TAR-файл с помощью curl
.
Скачанные данные файла передаются в tar
команду, чтобы извлечь содержимое архива.
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
Вы также можете передать выходные данные байтового потока команды PowerShell в входные данные собственной команды. В следующих примерах используется Invoke-WebRequest
для скачивания того же TAR-файла, что и в предыдущем примере.
# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
Эта функция не поддерживает данные байтового потока при перенаправлении выходных данных stderr на stdout. При объединении потоков stderr и stdout объединенные потоки обрабатываются как строковые данные.
Примечания.
Операторы перенаправления, которые не добавляют данные (>
и 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.
Потенциальная путаница с операторами сравнения
Оператор >
не следует путать с оператором сравнения "Больше,чем " (часто обозначается как >
на других языках программирования).
В зависимости от сравниваемых объектов выходные данные, которые используются >
, могут быть правильными (так как 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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по