我使用 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"
}