介绍如何将 PowerShell 的输出重定向到文本文件。
默认情况下,PowerShell 将输出发送到 PowerShell 主机。 通常,这是控制台应用程序。 但是,可以将输出重定向到文本文件,也可以将错误输出重定向到常规输出流。
可以使用以下方法重定向输出:
Out-File
使用 cmdlet,它将命令输出发送到文本文件。
通常,
Out-File
在需要使用其参数(如 、
Force
、
Width
或
NoClobber
参数)时,
Encoding
可以使用 cmdlet。
Tee-Object
使用 cmdlet,它将命令输出发送到文本文件,然后将其发送到管道。
使用 PowerShell 重定向运算符。 将重定向运算符与文件目标一起使用在功能上等效于不带额外参数的管道。
Out-File
有关流的详细信息,请参阅
about_Output_Streams
。
可重定向的输出流
PowerShell 支持以下输出流的重定向。
已引入的版本
写入 Cmdlet
成功
流和
错误
流与其他 shell 的 stdout 和 stderr 流类似。 但是,stdin 未连接到 PowerShell 管道进行输入。
PowerShell 重定向运算符
PowerShell 重定向运算符如下所示,其中
n
表示流号。 如果未
指定流,
则成功流
1
() 为默认值。
dir 'C:\', 'fakepath' 2>&1 > .\dir.log
它使用 2>&1
将错误流重定向到 Success 流,并将>
生成的 Success 流发送到名为 的文件dir.log
示例 2:将所有成功流数据发送到文件
此示例将所有 Success 流数据发送到名为 的文件 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
此示例禁止显示所有信息流数据。 若要详细了解 信息 流 cmdlet,请参阅 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'
运行此脚本时,当 设置为 Inquire
时$ErrorActionPreference
,系统会收到提示。
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
Error caught!
Ignore
Inquire
不追加数据 (>
和 n>
) 不发出警告的重定向运算符覆盖指定文件的当前内容。
但是,如果文件是只读、隐藏或系统文件,重定向 将失败。 追加重定向运算符 (>>
和 n>>
) 不会写入只读文件,而是将内容追加到系统文件或隐藏文件。
若要强制将内容重定向到只读、隐藏或系统文件,请使用 Out-File
cmdlet 及其 Force
参数。
写入文件时,重定向运算符使用 UTF8NoBOM
编码。 如果文件具有不同的编码,则输出的格式可能不正确。 若要以不同的编码写入文件,请使用 Out-File
cmdlet 及其 Encoding
参数。
写入文件时的输出宽度
使用 Out-File
或 重定向运算符写入文件时,PowerShell 会根据运行该文件的控制台的宽度设置表输出的格式。 例如,在控制台宽度设置为 80 列的系统上,使用等 Get-ChildItem Env:\Path > path.log
命令将表输出记录到文件时,文件中的输出将被截断为 80 个字符:
Name Value
---- -----
Path C:\Program Files\PowerShell\7;C:\WINDOWS…
考虑到可以在运行脚本的系统上任意设置控制台宽度,你可能更愿意将 PowerShell 格式表输出设置为基于你指定的宽度的文件。
cmdlet Out-File
提供了一个 Width 参数,可用于设置想要用于表输出的宽度。 无需在调用 Out-File
的所有位置添加 -Width 2000
,可以使用 $PSDefaultParameterValues
变量为脚本中 cmdlet 的所有用法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
尝试使用反向比较 <
(小于) 会产生系统错误:
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 中的 运算符。
about_Command_Syntax
about_Operators
about_Output_Streams
about_Path_Syntax
Out-File
Tee-Object
Write-Debug
Write-Error
Write-Host
Write-Information
Write-Output
Write-Progress
Write-Verbose
Write-Warning