我的桌面上有一个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。我怎么能做到这一点?
答案 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