使用不同的输出创建 table

Create table with different output

Write-Host "Errors" -BackgroundColor Red
$Error.Clear()
{Some 1200 lines code}

如果上面的代码有任何错误,我想在执行代码后创建一个包含两列的 table:"Error" 和 "Line"。但是我使用 PSCustomObject (PSObject) 失败了。它不会创建 table。

[PSCustomObject] @{
     Error = $_.Exception.Message
     Line = $_.InvocationInfo.ScriptLineNumber
}

New-Object PSObject -Property @{
    Error   = $Error.Exception.Message
    Line    = $Error.InvocationInfo.ScriptLineNumber
}

由于代码行太多我不想使用tey/catch,那么如何合并输出呢?或者甚至可以不使用 try/catch?..

$Error.Exception.Message
$Error.InvocationInfo.ScriptLineNumber

要创建给定代码段期间发生的所有错误的列表(前提是没有错误终止执行),您可以这样做:

$Error.Clear()

# set error action preference so you don't have to add `-EA SilentlyContinue`
# to each statement
$EAPSave = $ErrorActionPreference
$ErrorActionPreference = 'SilentlyContinue'

# ...
# your code goes here
# ...

# restore original error action preference
$ErrorActionPreference = $EAPSave

$Error | ForEach-Object {
    [PSCustomObject]@{
        'Error' = $_.Exception.Message
        'Line'  = $_.InvocationInfo.ScriptLineNumber
    }
}

但是请注意,在很多情况下,相关错误信息隐藏在嵌套异常中 ($_.Exception.InnerException),因此上面代码生成的错误列表可能没有您预期的那么有用。