蝙蝠错误时自动停止powershell脚本

问题描述

| 通常,可以使用$ ErrorActionPreference来在出错时停止执行PS脚本,如下面的示例中使用无效的subversion命令所示。该脚本在第一个命令后退出
$ErrorActionPreference=\'Stop\'
svn foo
svn foo
使用maven命令(mvn.bat)尝试相同的操作将执行这两个命令。
$ErrorActionPreference=\'Stop\'
mvn foo
mvn foo
最初,我怀疑mvn.bat没有设置错误代码,而PS只是没有看到错误。但是,$?当PS在第一个错误退出时,按以下所示正确设置:
mvn foo
if (-not $?) {exit 1}
mvn foo
所以这是我的问题:鉴于svn.exe和mvn.bat都在失败时设置了错误代码,为什么PS脚本在出现mvn错误后没有停止。我发现在全局设置\“ $ ErrorActionPreference = Stop \”比在每个命令以错误终止后执行\“ if(-not $?){exit 1} \”要方便得多。     

解决方法

        并非所有的命令行程序都以相同的方式提供错误。有些人设置了退出代码。有些没有。有些使用错误流,有些则没有。我已经看到一些命令行程序实际上将所有内容输出到错误,并且始终输出非零返回码。 因此,对于运行成功没有一个真正的安全猜测,因此将这种行为编码到PowerShell中几乎是不可能的。 每当.exe写入错误流时,$ errorActionPreference实际上将停止脚本,但是许多.exe会将常规输出写入控制台,并且从不填充错误流。 但是它不能可靠地工作。因此,$?也不会。如果exe返回0,并且不会写入错误$?会是真的。 虽然在PowerShell中处理这些单独的.exe及其错误可能会很麻烦,但这是一个很好的示例,说明了为什么PowerShell具有高度结构化的Output / Error / Verbose / Warning / Debug / Progress流Cmdlet中一致的错误行为击败了普通的旧.EXE工具。 希望这可以帮助     ,        $ ErrorActionPreference控制PowerShell在命令行小程序和PowerShell函数方面的行为-它对\“ legacy \”命令的退出代码不敏感。我仍在自行寻找设计决策的解决方法-有关此问题,请参考以下线程:如何在出现第一个错误时停止PowerShell脚本?您可能会得出结论,此自定义\“ exec \”函数是最佳解决方案:http://jameskovacs.com/2010/02/25/the-exec-problem/ 关于stder-on-stderr行为,我无法在PowerShell 3中重现此行为:
Invoke-Command
{
  $ErrorActionPreference=\'Stop\'
  cmd /c \"echo hi >&2\"          # Output to stderr (this does not cause termination)
  .\\DoesNotExist.exe            # Try to run a program that doesn\'t exist (this throws)
  echo bye                      # This never executes
}
更新:使用PS远程处理时,stder-on-stderr行为似乎生效。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...