批处理脚本选择异常:无论选何选项均启动Test.exe,求问题排查
问题出在
ERRORLEVEL的判断顺序上! 你用CHOICE命令的时候,系统对IF ERRORLEVEL N的判断逻辑是**“当前ERRORLEVEL值大于等于N”**,而不是严格等于。所以你现在的代码里,不管选1、2还是4,第一个判断IF ERRORLEVEL 1都会成立——因为这三个选项对应的ERRORLEVEL分别是1、2、4,全都是≥1的,结果M总是被设为1,自然每次都跳去启动Test.exe了。
修正方法:把ERRORLEVEL的判断按从高到低的顺序来写
把判断语句反过来,先检查最大的数值(4),再检查2,最后检查1,这样就能确保只有当ERRORLEVEL≥4时才会触发第一个判断,不会被更小的数值覆盖:
ECHO OFF CLS :MENU ECHO. ECHO ............................................... ECHO PRESS 1 or 2 to select your task, or 4 to EXIT. ECHO ............................................... ECHO. ECHO 1 - Test ECHO 2 - Production ECHO 4 - EXIT ECHO. CHOICE /C:124 IF ERRORLEVEL 4 SET M=4 IF ERRORLEVEL 2 SET M=2 IF ERRORLEVEL 1 SET M=1 IF %M%==1 GOTO TEST IF %M%==2 GOTO PROD IF %M%==4 GOTO EOF :TEST ECHO TEST cd %~dp0\Test\ start Test.exe GOTO MENU :PROD ECHO PROD cd %~dp0\Production\ start Production.exe GOTO MENU
另一种更简洁的写法(可选)
其实你也可以不用设置M变量,直接用GOTO和ERRORLEVEL判断结合,代码会更清爽:
ECHO OFF CLS :MENU ECHO. ECHO ............................................... ECHO PRESS 1 or 2 to select your task, or 4 to EXIT. ECHO ............................................... ECHO. ECHO 1 - Test ECHO 2 - Production ECHO 4 - EXIT ECHO. CHOICE /C:124 IF ERRORLEVEL 4 GOTO EOF IF ERRORLEVEL 2 GOTO PROD IF ERRORLEVEL 1 GOTO TEST :TEST ECHO TEST cd %~dp0\Test\ start Test.exe GOTO MENU :PROD ECHO PROD cd %~dp0\Production\ start Production.exe GOTO MENU
这个写法的逻辑和之前一致,只是省去了中间变量,直接根据ERRORLEVEL跳转到对应标签,同样要记住保持从高到低的判断顺序哦。
内容的提问来源于stack exchange,提问作者GettingStarted
相关产品推荐
相关产品推荐

