批处理文件测试错误级别
批处理文件测试错误级别
我试图在批处理文件中有条件地运行一个exe文件,条件是另一个exe文件成功执行。
我尝试了几个不同的IF和ERRORLEVEL的组合,但都没有成功。
"..\..\..\TeamBuildTypes\Current Branch\DatabaseUpdate.exe" -s localhost\sql2008r2 IF %ERRORLEVEL% 1( "..\..\..\TeamBuildTypes\Current Branch\DatabaseUpdate.exe" -s localhost\sql2008 ) Pause
给我一个错误提示:
这个时候1(是不被预料的。
我在哪里出错了?
问题出现的原因是在批处理文件中,使用错误的语法来检查错误级别(error level)。解决方法是使用正确的语法来检查错误级别,并将环境变量用%%包裹起来以获取变量的内容。
在批处理文件中,负的错误级别会导致问题。可以尝试如下代码来解决该问题:
IF '%ERRORLEVEL%'=='0' GOTO OK
然而,这种语法在批处理文件中是不正确的。正确的语法应该是:
IF ERRORLEVEL 0 GOTO OK
在调用svn命令后,检查语句"IF ERRORLEVEL 0 GOTO OK"无效。但是,通过检查"IF (%ERRORLEVEL%) == (0) GOTO OK"可以正常工作。关键在于用%%将环境变量包裹起来,这意味着获取变量的内容。
总结起来,问题的原因是使用错误的语法来检查错误级别,解决方法是使用正确的语法,并将环境变量用%%包裹起来以获取变量的内容。
问题的出现原因:
出现这个问题的原因是因为在批处理文件中使用了错误级别(error level)作为判断条件,但是错误级别的使用存在一些问题。在早期的DOS系统中,使用的是IF ERRORLEVEL语法来判断错误级别,而在WinNT系统中引入了%ERRORLEVEL%变量的支持。但是,如果有人在批处理文件中使用了set errorlevel=foo的命令将错误级别设置为一个具体的值,那么%errorlevel%将无法正常工作,并且对于cmd.exe内部命令,错误级别可能无法及时更新。
解决方法:
解决这个问题的一个替代方法是使用&&和||运算符。可以将命令调用和判断条件放在一行中,使用&&表示命令执行成功后继续执行下一条命令,使用||表示命令执行失败后执行下一条命令。例如:call someapp.exe && (echo success) || (echo error!)。
另外,还有两种已知情况下错误级别无法正常工作的情况,需要使用||运算符来替代:
1. RD/RMDir命令的错误级别为0,即使发生错误也会返回0;
2. 在Windows中使用文件重定向操作符>时,错误级别可能无法正确更新。
值得注意的是,&&和||运算符可以同时使用,相当于IF...ELSE的功能。
在文章中提到了一种更简洁的判断成功的方法,即使用if not errorlevel 1来判断成功,这样可以避免使用if errorlevel 0的多余判断,使代码更加清晰。
最后,文章还提到了在for循环中使用call :successLabel和call :failLabel结合判断条件的方法,这样可以在正常流程中使用goto语句,实现更复杂的判断逻辑。