假设我有以下脚本test-exception.ps1
[CmdletBinding()]
param()
process {
1/0
}
如果我运行它,我会得到
Tentative de division par zéro.
Au caractère U:\test-exception.ps1:5 : 2
+ 1/0
+ ~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
如果现在我尝试/捕捉错误,
[CmdletBinding()]
param()
process {
try {
1/0
} catch {
write-error $_
}
}
我得到
Au caractère Ligne:1 : 1
+ U:\test-exception.ps1
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test-exception.ps1
我尝试了许多变体,但我发现在尝试/捕获代码(我希望能够使用一些自定义退出代码,而不是1退出)时,获得周围CMD错误流中的第一条错误消息的唯一方法是
[CmdletBinding()]
param()
process {
try {
1/0
} catch {
[Console]::Error.WriteLine(($_ | Out-String))
exit 99
}
}
我错过了什么还是这是唯一的解决办法
1条答案
按热度按时间xmq68pz91#
正如您所注意到的,当您在
catch
块中调用Write-Error
时,错误消息只显示Write-Error
调用的来源,而不是异常的来源。您可以从
ErrorRecord.InvocationInfo
的PositionMessage
属性中获取异常的来源,但更简单的方法是通过管道将ErrorRecord
对象($_
)传输到Out-String
。此外,您还可以通过查询
ErrorRecord.ScriptStackTrace
属性来显示脚本堆栈跟踪,该属性包含导致错误的函数调用链。最后,设置
ErrorRecord.ErrorDetails
属性以覆盖默认的错误消息,以便显示有关原始错误的所有信息。在"CAUTHT AT"行之后显示的信息仍然非常无用,但我认为我们对此无能为力,因为它是由PowerShell自动添加的。至少相关信息现在显示在顶部。