【问题标题】:How do I make `& non_existent_cmd` (the call operator) a terminating error?如何使`& non_existent_cmd`(呼叫操作员)成为终止错误?
【发布时间】:2016-04-08 10:17:33
【问题描述】:

鉴于此脚本:

& non_existent_cmd
echo "I don't want this to run"

在运行& non_existent_cmd 以使以下echo 命令永远不会运行时引发非终止错误的最简单方法是什么。

作为参考,脚本(如上所述)当前输出:

& :术语“non_existent_cmd”未被识别为 cmdlet 的名称,
函数、脚本文件或可运行的程序。检查名字的拼写,
或者如果包含路径,请验证路径是否正确并重试。
在行:1 字符:3
+ & 不存在的cmd
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (non_existent_cmd:String) [], CommandNotFoundException
    +fullyQualifiedErrorId:CommandNotFoundException

我不想让它运行

【问题讨论】:

  • 我要补充一点,您可以先使用Get-Command 来确定命令是否存在。那么我认为你不需要捕获错误。
  • @Bill_Stewart 也可以。这种方法的一个限制是Get-Command 不会在命令存在但不可执行的情况下显示问题,或者如果存在命令存在但随后被删除的竞争条件。
  • 在我看来,与Get-Command相比,由于理论上可能(但极为罕见)的竞争条件而编写解决方法代码(不存在命令的陷阱错误)并不是一个足够的成本/收益比。
  • @Bill_Stewart 在很多情况下,我并不反对。但是,在我正在编写的清理脚本中,如果& git.exe ... 没有返回任何输出并继续执行,则会删除许多内容,这会很糟糕。不用考虑竞争条件,我可以想象可执行文件存在但不可执行的情况。
  • 很多事情可能发生。还有很多事情是极不可能的……

标签: powershell error-handling


【解决方案1】:

您可以将会话的$ErrorActionPreference 设置为Stop。这将使任何错误成为终止错误。

如果您只希望该调用在出错时终止,您可以执行以下操作:

$eap = $ErrorActionPreference
$ErrorActionPreference = 'Stop'
& non_existent_cmd
echo "I don't want this to run"
$ErrorActionPreference = $eap

【讨论】:

    【解决方案2】:

    也许试试这个?

    try { & non_existent_cmd }
    catch { Break }
    "I don't want this to run"
    

    【讨论】:

    • try..catch 可以工作。我要做的唯一调整是,在我的情况下,我确实希望引发错误,所以我会将 Break 更改为 Throw
    • @MichaelKropat 而不是在catch 块中抛出错误,回显您感兴趣的任何错误信息,然后从脚本中返回exit
    • 那是我的第一选择。但是Throwcatch 里面对我来说似乎很奇怪(而且丑陋):-)
    • @AnsgarWiechers 找不到命令不一定是致命错误。在此之前我已经编写了一个具有后备功能的脚本。理想情况下,我想为& non_existent_cmd 编写一个函数包装器,它会引发终止错误,因此由调用者决定它是致命错误还是可恢复错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多