在 powershell 5.1 中,默认错误响应如下所示:
Aug01 14:26:01 C:\> throw [Collections.Generic.KeyNotFoundException]::new('example')
example
At line:1 char:1
+ throw [Collections.Generic.KeyNotFoundException]::new('example')
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], KeyNotFoundException
+ FullyQualifiedErrorId : example
那里有一些有用的信息。文件和行、消息、类型名称……我的意思是,“完全合格的错误 ID”是多余的,而且很糟糕,告诉我 CategoryInfo 是“OperationStopped”是没有帮助的。而且它很丑陋。但所有这些都是可以协商的。
最大的错误是,我必须竭尽全力才能获得像样的堆栈跟踪。在进行模块开发时,这真是令人恼火。我厌倦了写作$err = $error[0]; $err.ErrorRecord.ScriptStackTrace
——是的,我凭记忆写了这些。
当然,在编写脚本时,您可以通过将整个脚本包装在 中来解决这个问题。但是当只使用控制台时怎么办?如果出现问题,try..catch
我不想为了获得合适的错误信息而逐行执行。try..catch
现在,我知道trap
存在,但 trap 非常有限。理想情况下,我希望我的 $PROFILE 中有某种方式说“使用此trap
语句每一个在控制台中执行。但这是我尝试的第一件事 -trap
在 $PROFILE 中设置不起作用,因为即使在点源调用中引入陷阱,陷阱也不会遵循范围。
答案1
这是这篇文章的主题 是否可以自定义 powershell 中的错误显示?
以下是 Don Jones 所接受答案的部分引述。
如果您只想更改文本颜色,则可以使用内置的 $host 对象。但是,您无法更改错误消息本身 - 这是硬编码的。
您可以做的是 (a) 抑制错误消息,以及 (b) 捕获错误并显示您自己的错误。
通过设置完成(a)
$ErrorActionPreference = "SilentlyContinue"
- 这不会停止错误,但它会抑制消息。完成 (b) 需要做更多工作。默认情况下,大多数 PowerShell 命令不会产生可捕获的异常。因此,您必须学会运行命令并添加 -EA“Stop”参数,以便在出现问题时生成可捕获的异常。完成此操作后,您可以通过键入以下内容在 shell 中创建陷阱:
trap { # handle the error here }
您可以将其放入配置文件脚本中,而不必每次都输入它。在陷阱中,您可以使用 Write-Error cmdlet 输出您想要的任何错误文本。
可能比您想要做的工作要多,但这基本上就是您完成所要求的事情的方式。