Powershell - 如何在陷阱中复制完整的错误信息

Powershell - 如何在陷阱中复制完整的错误信息

我使用 Powershell 的 trap 功能是因为我想在出现错误时输出完整的错误信息,并且我必须回复错误。如果不使用 trap,Powershell 不会在错误发生后(以及我回复的任何 Inquire 提示)向我显示错误信息。

使用陷阱功能的问题是,虽然我可以使用打印完整信息,但$error[0]我不明白如何将其复制到字符串并获取完整信息。相反,我只得到了简要信息。

例如,这显示完整信息:

$ErrorActionPreference = "Stop"
trap {$error[0]; Read-Host -Prompt "Trapped. Press Enter to exit"}
Split-Path -BAD
echo "Running script"
Read-Host -Prompt "Press Enter to exit"

Split-Path : A parameter cannot be found that matches parameter name 'BAD'.
At line:3 char:12
+ Split-Path -BAD
+            ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Split-Path], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SplitPathCo 
   mmand

Trapped. Press Enter to exit: 

Split-Path : A parameter cannot be found that matches parameter name 'BAD'.
At line:3 char:12
+ Split-Path -BAD
+            ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Split-Path], ParentContainsErrorRecordExce 
   ption
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SplitPathCo 
   mmand

但如果我尝试使用 Write-Host 中的 $error[0],它只会显示简短的错误信息:

$ErrorActionPreference = "Stop"
trap {Write-Host -ForegroundColor Red -BackgroundColor Black "$($error[0])"; Read-Host -Prompt "Trapped. Press Enter to exit"}
Split-Path -BAD
echo "Running script"
Read-Host -Prompt "Press Enter to exit"

A parameter cannot be found that matches parameter name 'BAD'.
Trapped. Press Enter to exit: 

Split-Path : A parameter cannot be found that matches parameter name 'BAD'.
At line:3 char:12
+ Split-Path -BAD
+            ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Split-Path], ParentContainsErrorRecordExce 
   ption
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SplitPathCo 
   mmand

我想用颜色显示来自陷阱的完整错误信息,这就是我需要 Write-Host 的原因。

答案1

$Error[0]在字符串中使用时,ToString()会隐式调用,仅返回错误字符串。使用Out-String可获取完整的错误输出:

trap {
    Write-Host -ForegroundColor Red -BackgroundColor Black "$($Error[0] | Out-String)"
    Read-Host "Press enter"

}

或者使用Write-Error

trap {
    Write-Error $Error[0]
    Read-Host "Press enter"

}

相关内容