批处理文件测试错误级别

9 浏览
0 Comments

批处理文件测试错误级别

我试图在批处理文件中有条件地运行一个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(是不被预料的。

我在哪里出错了?

0
0 Comments

从上述内容中可以看出,问题的原因是在批处理文件中使用了圆括号来括住变量。圆括号是一个块结构,会破坏DO和IF块以及其他一些内容。因此,使用圆括号括住变量会导致错误。

解决方法是改用安全的普通字符(如"X")来括住变量。例如,要测试ERRORLEVEL是否为0,可以使用以下代码:

IF X%ERRORLEVEL%X == X0X Echo 或 GOTO 等等...

这种方式更安全,因为许多特殊字符都有特殊含义,会破坏更复杂的代码,而且没有任何警告,需要花费很长时间进行调试。我知道,每当我忘记自己的建议时,我就会陷入这个陷阱。

0
0 Comments

问题出现的原因是在批处理文件中,使用错误的语法来检查错误级别(error level)。解决方法是使用正确的语法来检查错误级别,并将环境变量用%%包裹起来以获取变量的内容。

在批处理文件中,负的错误级别会导致问题。可以尝试如下代码来解决该问题:

IF '%ERRORLEVEL%'=='0' GOTO OK

然而,这种语法在批处理文件中是不正确的。正确的语法应该是:

IF ERRORLEVEL 0 GOTO OK

在调用svn命令后,检查语句"IF ERRORLEVEL 0 GOTO OK"无效。但是,通过检查"IF (%ERRORLEVEL%) == (0) GOTO OK"可以正常工作。关键在于用%%将环境变量包裹起来,这意味着获取变量的内容。

总结起来,问题的原因是使用错误的语法来检查错误级别,解决方法是使用正确的语法,并将环境变量用%%包裹起来以获取变量的内容。

0
0 Comments

问题的出现原因:

出现这个问题的原因是因为在批处理文件中使用了错误级别(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语句,实现更复杂的判断逻辑。

0