【问题标题】:Equivalent of bash "set -o errexit" for windows cmd.exe batch file?Windows cmd.exe批处理文件的bash“set -o errexit”等效?
【发布时间】:2019-07-24 19:56:50
【问题描述】:

在 bash 脚本中,与 set -o errexit 等效的 Windows 批处理文件是什么?

我有一个很长的批处理文件,其中包含要在 Windows 命令行上运行的不同程序...基本上它是一个展开的 make 文件,其中包含需要运行以在长命令序列中构建 exe 的每个编译器命令。

这种方法的问题是我希望它在脚本中的命令生成的第一个非零返回码上退出批处理命令。

据我所知,Windows 批处理文件存在一个问题,即它们不会在第一个错误时自动退出,而无需在每个命令之间添加大量重复的样板代码来检查非零返回代码并退出脚本。

我想知道的是,有没有类似于 bash 的 set -o errexit for Windows cmd.exe 的选项?或者可能是一种可以消除过多样板错误检查代码的技术......就像你设置它一次,然后如果命令返回非零返回代码,它会自动退出,而不会在你的脚本中添加一堆垃圾来执行此操作给你。

(我也接受 PowerShell 选项而不是 cmd.exe,除了 PowerShell 对旧的 unix 样式的命令标志不是很好,例如:-dontbreak -y ... 破坏这些命令而不向您的命令添加垃圾引号或转义字符之类的行...不是我想弄乱的东西...)

【问题讨论】:

标签: powershell cmd


【解决方案1】:

CMD/批处理

正如 Ken 在 cmets 中提到的,CMD 没有等效于 bash 选项 -e(或等效 -o errexit)的选项。您必须检查每个命令的退出状态,该状态存储在变量 %errorlevel% 中(相当于 bash 中的 $?)。类似的东西

if %errorlevel% neq 0 then exit /b %errorlevel%

PowerShell

在大多数情况下,PowerShell 已经在错误时自动终止脚本执行。但是,PowerShell 中有两个错误类:终止和非终止。后者只是显示错误而不终止脚本执行。行为可以通过变量$ErrorActionPreference控制:

  • $ErrorActionPreference = 'Stop':终止所有错误(终止和非终止)
  • $ErrorActionPreference = 'Continue'(默认):在终止错误时终止,在非终止错误时继续
  • $ErrorActionPreference = 'SilentlyContinue': 任何错误都不要终止

PowerShell 还允许通过try/catch 语句进行更细粒度的错误处理:

try {
    # run command here
} catch [System.SomeException] {
    # handle exception of a specific type
} catch [System.OtherException] {
    # handle exception of a different type
} catch {
    # handle all other exceptions
} finally {
    # cleanup statements that are run regardless of whether or not
    # an exception was thrown
}

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2016-09-18
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多