PowerShell:致命错误没有发送到STDERR,如何记录它们?

时间:2014-06-28 02:00:05

标签: exception powershell cmd pipe stderr

我的桌面上有一个PowerShell脚本:

Write-Output "Some output"
Write-Error "Non-fatal error"
$ErrorActionPreference = "Stop" # Any further errors should be treated as fatal
Write-Output "Some more output"
Write-Error "Fatal error"

我从powershell.exe

这样称呼它
PS C:\Users\me\Desktop> .\test.ps1 2> err.txt 1> out.txt

输出:

C:\Users\vmadmin\Desktop\test.ps1 : Fatal error
At line:1 char:1
+ .\test.ps1 2> err.txt 1> out.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

out.txt:

Some output
Some more output

err.txt:

C:\Users\vmadmin\Desktop\test.ps1 : Non-fatal error
At line:1 char:1
+ .\test.ps1 2> err.txt 1> out.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

我想将致命错误记录到err.txt。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

PowerShell有两个不同的错误处理通道:第一个是STDERR,写入非致命错误。第二种是异常机制,类似于您在C#或Java等编程语言中看到的。

这里有诀窍:任何错误都在一个频道或另一个频道,而不是两个。这意味着致命错误不会通过STDERR

这是一种解决方法:将您的PowerShell调用包装在cmd调用中。由于cmd语言没有异常,因此通过它的任何PowerShell异常都会被传送到STDERR

使用示例:

PS C:\Users\me\Desktop> cmd.exe /c "powershell.exe .\test.ps1" 2> err.txt 1> out.txt