powershell 使用Write-Error改进捕获异常的输出格式

icnyk63a  于 2023-01-13  发布在  Shell
关注(0)|答案(1)|浏览(156)

假设我有以下脚本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
    }
}

我错过了什么还是这是唯一的解决办法

xmq68pz9

xmq68pz91#

正如您所注意到的,当您在catch块中调用Write-Error时,错误消息只显示Write-Error调用的来源,而不是异常的来源。
您可以从ErrorRecord.InvocationInfoPositionMessage属性中获取异常的来源,但更简单的方法是通过管道将ErrorRecord对象($_)传输到Out-String
此外,您还可以通过查询ErrorRecord.ScriptStackTrace属性来显示脚本堆栈跟踪,该属性包含导致错误的函数调用链。
最后,设置ErrorRecord.ErrorDetails属性以覆盖默认的错误消息,以便显示有关原始错误的所有信息。

try {
    1/0
} catch {
    $_.ErrorDetails = ($_ | Out-String) +
                      "`n------- SCRIPT STACKTRACE -------`n$($_.ScriptStackTrace)" +
                      "`n `n------- CAUGHT AT -------"
    Write-Error $_
}
    • 输出:**
C:\Test\ExceptionTest.ps1 : Attempted to divide by zero.
In C:\Test\ExceptionTest.ps1:4 Char:2
+     1/0
+     ~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException
 
------- SCRIPT STACKTRACE -------
at <ScriptBlock>, C:\Test\ExceptionTest.ps1: Line 4
at <ScriptBlock>, <no file>: Line 1
 
------- CAUGHT AT -------
In Line:1 Char:1
+ . 'C:\Test\ExceptionTest.ps1'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,ExceptionTest.ps1

在"CAUTHT AT"行之后显示的信息仍然非常无用,但我认为我们对此无能为力,因为它是由PowerShell自动添加的。至少相关信息现在显示在顶部。

相关问题