Powershell 如何使“&non\u existence\u cmd”(呼叫接线员)成为终止错误?

Powershell 如何使“&non\u existence\u cmd”(呼叫接线员)成为终止错误?,powershell,error-handling,Powershell,Error Handling,鉴于此脚本: & non_existent_cmd echo "I don't want this to run" 运行&non_existence_cmd时引发非终止错误的最简单方法是什么,这样就不会运行下面的echo命令 作为参考,上面编写的脚本当前输出: & : The term 'non_existent_cmd' is not recognized as the name of a cmdlet, function, script file, or operable prog

鉴于此脚本:

& non_existent_cmd
echo "I don't want this to run"
运行&non_existence_cmd时引发非终止错误的最简单方法是什么,这样就不会运行下面的echo命令

作为参考,上面编写的脚本当前输出:

& : The term 'non_existent_cmd' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:3 + & non_existent_cmd + ~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (non_existent_cmd:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException I don't want this to run 也许试试这个

try { & non_existent_cmd }
catch { Break }
"I don't want this to run"
也许试试这个

try { & non_existent_cmd }
catch { Break }
"I don't want this to run"
您可以将会话的$ErrorActionPreference设置为Stop。这将使任何错误成为终止错误

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

$eap = $ErrorActionPreference
$ErrorActionPreference = 'Stop'
& non_existent_cmd
echo "I don't want this to run"
$ErrorActionPreference = $eap
您可以将会话的$ErrorActionPreference设置为Stop。这将使任何错误成为终止错误

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

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

试试看,抓可能有用。我唯一要做的调整是,在我的例子中,我确实希望引发错误,所以我将Break改为Throw。@MichaelKropat,而不是将错误抛出catch块echo任何您感兴趣的错误信息,然后退出脚本。这是我的第一选择。但在我看来,把鱼扔进去似乎既奇怪又丑陋:——。@AnsgarWiechers一个命令找不到并不一定是致命的错误。我以前写过一个脚本,它有回退功能。理想情况下,我想为&non_existence_cmd编写一个函数包装器,它抛出一个终止错误,因此由调用方决定这是致命错误还是可恢复错误。试试..catch可以工作。我唯一要做的调整是,在我的例子中,我确实希望引发错误,所以我将Break改为Throw。@MichaelKropat,而不是将错误抛出catch块echo任何您感兴趣的错误信息,然后退出脚本。这是我的第一选择。但在我看来,把鱼扔进去似乎既奇怪又丑陋:——。@AnsgarWiechers一个命令找不到并不一定是致命的错误。我以前写过一个脚本,它有回退功能。理想情况下,我想为&non_existence_cmd编写一个函数包装器,它抛出一个终止错误,因此由调用方决定这是致命错误还是可恢复错误。我想补充一点,您可以先使用Get命令来确定某个命令是否存在。“那我就不认为你需要捕捉错误了。”比尔·斯图尔特说,这也行。这种方法的一个限制是,如果Get命令存在但不可执行,则Get命令不会显示问题,或者,如果存在一个竞争条件,其中命令存在,但随后被删除。在我看来,与Get命令相比,为不存在的命令编写解决方案代码陷阱错误(由于理论上可能存在但极为罕见的竞争条件)并不是一个足够的成本/收益比。@Bill_Stewart我并不反对,在许多情况下。但是,在我正在编写的清理脚本中,if&git.exe。。。不返回任何输出,执行将继续,许多内容将被删除,这将是不好的。不管竞争条件如何,我可以想象一种情况,即可执行文件存在但不可执行。很多事情都可能发生。还有很多事情是极不可能的…我想补充一点,您可以先使用Get命令来确定命令是否存在。“那我就不认为你需要捕捉错误了。”比尔·斯图尔特说,这也行。这种方法的一个限制是,如果Get命令存在但不可执行,则Get命令不会显示问题,或者,如果存在一个竞争条件,其中命令存在,但随后被删除。在我看来,与Get命令相比,为不存在的命令编写解决方案代码陷阱错误(由于理论上可能存在但极为罕见的竞争条件)并不是一个足够的成本/收益比。@Bill_Stewart我并不反对,在许多情况下。但是,在我正在编写的清理脚本中,if&git.exe。。。不返回任何输出,执行将继续,许多内容将被删除,这将是不好的。不管竞争条件如何,我可以想象一种情况,即可执行文件存在但不可执行。很多事情都可能发生。还有很多事情是非常不可能的。。。