哪个流在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>&1warning 流 (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:从 Receive-Job 获取输出

IO流在C++中的应用

使用 powershell 在 Exchange Online 中查找邮件传递到哪个文件夹

Python、Powershell 和 Popen

如何使用批处理或PowerShell从文本文件中删除换行符

powershell 来自https://stackoverflow.com/questions/1862554/get-childitem-recurse-as-a-parameter-in-pow