我正在使用 powershell 运行一个程序(pyinstaller),将其所有进度输出写入 STDERR。我希望该命令的输出既打印到控制台又保存到文件中。
首先,我用了这个:
COMMAND | tee compile.log
。控制台上一切看起来都很好,但日志文件是空的。所以,我尝试了这个:COMMAND 2>&1 | tee compile.log
。这使得日志文件能够正确写入,但却引发了巨大的问题:
那么,有什么我可以使用的东西既可以在控制台中显示进度并将其写入文件,但又不会看起来像错误?
那是因为您只捕获了第二个(
2
)错误流。
ErrorRecord
s:
$Output = Write-Error 'Something went wrong' 2>&1
$Output.GetType().FullName
System.Management.Automation.ErrorRecord
由此属性脚本定义的 PowerShell 默认显示视图着色:
$FormatData = Get-FormatData System.Management.Automation.ErrorRecord
$FormatData.FormatViewDefinition.Control.Entries.CustomItems.Expression.Value
(详情请参阅答案:Powershell 如何知道默认打印哪个属性)
要抑制
red
ANSI 代码,您可以简单地将输出通过管道传输到 Out-String cmdlet,因为它让 FormatViewDefinition
脚本相信它会写入不支持 ANSI 的内容:
Write-Error 'Something went wrong' 2>&1 | tee compile.log | Out-String
要捕获所有(不仅是红色
ErrorRecord
)流,请使用星号:
Write-Error 'Something went wrong' *>&1 | tee compile.log | Out-String
另一个问题可能与上述问题无关,而且确实太模糊,无法回答。如果这部分仍然是一个问题,我建议为此提出一个单独的问题,其中包含有关您实际获得的退出代码、您期望哪些退出代码以及如何尝试捕获它们的更多详细信息。