Jos*_*off 270 batch-file
我有一个批处理文件,它使用不同的参数反复调用相同的可执行文件.如果其中一个调用返回任何级别的错误代码,如何使其立即终止?
基本上,我想要相当于MSBuild的ContinueOnError=false.
sys*_*USE 275
检查errorlevel一个if语句,然后exit /b(仅退出b atch文件,而不是整个cmd.exe进程)获取0以外的值.
same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%
Run Code Online (Sandbox Code Playgroud)
如果希望errorlevel的值传播到批处理文件之外
if %errorlevel% neq 0 exit /b %errorlevel%
Run Code Online (Sandbox Code Playgroud)
但如果这是在里面for它有点棘手.你需要更像的东西:
setlocal enabledelayedexpansion
for %%f in (C:\Windows\*) do (
same-executable-over-and-over.exe /with different "parameters"
if !errorlevel! neq 0 exit /b !errorlevel!
)
Run Code Online (Sandbox Code Playgroud)
编辑:您必须在每个命令后检查错误.cmd.exe/command.com批处理中没有全局"on error goto"类型的构造.我还根据CodeMonkey更新了我的代码,尽管我在XP或Vista上的任何批处理攻击中都没有遇到负面的错误级别.
Fow*_*owl 238
添加|| goto :label到每一行,然后定义一个:label.
例如,创建此.cmd文件:
@echo off
echo Starting very complicated batch file...
ping -invalid-arg || goto :error
echo OH noes, this shouldn't have succeeded.
goto :EOF
:error
echo Failed with error #%errorlevel%.
exit /b %errorlevel%
Run Code Online (Sandbox Code Playgroud)
另请参阅有关退出批处理文件子例程的问题.
Ben*_*hon 85
最短的:
command || exit /b
Run Code Online (Sandbox Code Playgroud)
如果需要,可以设置退出代码:
command || exit /b 666
Run Code Online (Sandbox Code Playgroud)
你也可以记录:
command || echo ERROR && exit /b
Run Code Online (Sandbox Code Playgroud)
小智 24
一个小的更新,您应该将"if errorlevel 1"的检查更改为以下内容...
IF %ERRORLEVEL% NEQ 0
Run Code Online (Sandbox Code Playgroud)
这是因为在XP上你可以得到负数作为错误.0 =没有问题,其他任何问题.
并记住DOS处理"IF ERRORLEVEL"测试的方式.如果您要检查的数字是该数字或更高,它将返回true,因此如果您要查找特定的错误编号,则需要以255开头并减少.
Eri*_*sty 13
这是BASH和Windows CMD 的多语言程序,它运行一系列命令并在其中任何一个失败时退出:
#!/bin/bash 2> nul
:; set -o errexit
:; function goto() { return $?; }
command 1 || goto :error
command 2 || goto :error
command 3 || goto :error
:; exit 0
exit /b 0
:error
exit /b %errorlevel%
Run Code Online (Sandbox Code Playgroud)
我过去曾使用过这种类型的东西来进行多平台连续集成脚本.
我更喜欢OR形式的命令,因为我发现它们最具可读性(而不是在每个命令之后都有一个if).然而,这种天真的做法,command || exit /b %ERRORLEVEL%是错误的.
这是因为批次在首次读取行时扩展变量,而不是在使用它们时扩展变量.这意味着如果command上面的行失败,批处理文件将正确退出,但它会以返回代码0退出,因为这就是%ERRORLEVEL%行开头的值.显然,这在我们的脚本中是不可取的,因此我们必须启用
延迟扩展,如下所示:
SETLOCAL EnableDelayedExpansion
command-1 || exit /b !ERRORLEVEL!
command-2 || exit /b !ERRORLEVEL!
command-3 || exit /b !ERRORLEVEL!
command-4 || exit /b !ERRORLEVEL!
Run Code Online (Sandbox Code Playgroud)
此代码段将执行命令1-4,如果其中任何一个失败,它将使用与失败命令相同的退出代码退出.