哪个流在powershell中记录输出文件?
Posted
技术标签:
【中文标题】哪个流在powershell中记录输出文件?【英文标题】:which stream does out-file record in powershell? 【发布时间】:2021-12-18 17:35:38 【问题描述】:默认情况下,out-file 记录流 1 还是流 6?
如果我有命令:
invoke-expression $cmd *>&1 |
out-file -encoding ASCII -Append FilePath $log
out-file 将哪些流记录到文件中?
1 Success stream PowerShell 2.0 Write-Output
2 Error stream PowerShell 2.0 Write-Error
3 Warning stream PowerShell 3.0 Write-Warning
4 Verbose stream PowerShell 3.0 Write-Verbose
5 Debug stream PowerShell 3.0 Write-Debug
6 Information stream PowerShell 5.0 Write-Information
只是流 1 吗?还是流 6?我有点困惑,因为大多数 shell 只有 1 和 2,而 powershell 添加了 6,就像 1?
【问题讨论】:
只有流 1 被传送到Out-File
,但由于您已将流 2 到 6 的内容合并到上游流 1,Invoke-Expression
输出的所有 6 个流的内容将结束正在写入磁盘
顺便说一句:Invoke-Expression
(iex
) should generally be avoided;绝对是don't use it to invoke an external program or PowerShell script。
【参考方案1】:
您正在使用 管道 (|
) 向 Out-File
提供输入。
仅流1
,成功(数据)输出流默认通过pipeline发送。
您引用的概念性 about_Redirection 帮助主题记录了所有 6 个 PowerShell 流。
可选地 - 正如您所做的那样 - 您可以将其他流合并到流 1
中,这会导致它们的输出也被包含在内。
你可以合并:
个人个流按他们的数量;例如3>&1
将 warning 流 (3
) 合并到成功流中; 多个可以使用这样的重定向。
所有(其他) 流,由*
表示,即使用*>&1
由于您使用的是*>&1
,来自所有流的输出通过管道发送,因此Out-File
保存到目标文件。
顺便说一句:>
,redirection operator(连同>>
)是Out-File
的有效别名,所以你可以使用它单独保存到文件 - 假设Out-File
的默认字符编码是可以接受的:[1]
& 'success'; Write-Warning 'warning' *> allstreams.txt
使用>
定位文件还允许您将单个流保存到单独文件:
& 'success'; Write-Warning 'warning' > data.txt 3> warnings.txt
[1] 在 PowerShell 5.1 及更高版本中,您可以通过preference variable $PSDefaultParameterValues
更改Out-File
的默认编码方式,该方式也对>
生效 - 请参阅this answer。支持>
【讨论】:
以上是关于哪个流在powershell中记录输出文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 powershell 在 Exchange Online 中查找邮件传递到哪个文件夹
powershell 来自https://stackoverflow.com/questions/1862554/get-childitem-recurse-as-a-parameter-in-pow