2013-06-27 48 views
2

这里它是愚蠢的问题,但请帮助或我的大脑会爆炸! ;))一些愚蠢的东西,我不明白...Windows批处理文件 - GOTO命令被忽略

总之:为什么选择7号(退出)后返回的ERRORLEVEL是正确的,但GOTO指定的标签被忽略,而是它去allTask​​sReboot标签。 ..

这是我的 “代码” ...

@echo off 
mode con: cols=150 lines=65 
@echo ------------------------------------------------------------------------------------------------ 
@echo INSTALLATION MENU 
@echo ------------------------------------------------------------------------------------------------ 
@echo [ 1 ].All tasks - Unattended with reboot on finish 
@echo [ 2 ].All tasks - Unattended without reboot on finish 
@echo [ 3 ].All tasks except Software group - Unattended with reboot on finish 
@echo [ 4 ].All tasks except Software group - Unattended without reboot on finish 
@echo [ 5 ].All tasks except Java 7 installation - Unattended without reboot on finish 
@echo [ 6 ].Install only VNC - Unattended 
@echo [ 7 ].Exit 
@echo ------------------------------------------------------------------------------------------------ 
@echo ------------------------------------------------------------------------------------------------ 
CHOICE /C:1234567 /N /M "Choose number for installation type." 
@echo You press: %ERRORLEVEL% 
@pause 
IF ERRORLEVEL 1 GOTO allTasksReboot 
IF ERRORLEVEL 2 GOTO allTasks 
IF ERRORLEVEL 3 GOTO allExceptSoftwareReboot 
IF ERRORLEVEL 4 GOTO allExceptSoftware 
IF ERRORLEVEL 5 GOTO allTasksExceptJava 
IF ERRORLEVEL 6 GOTO onlyVnc 
IF ERRORLEVEL 7 GOTO scriptend 

:allTasksReboot 
@echo ************************************************************************** 
@echo All tasks - Unattended with reboot on finish 
@echo ************************************************************************** 
@pause 
goto scriptend 

:scriptend 
@echo Lets exit... 
@pause 

:goexit 

回答

4

记住IF ERRORLEVEL N command测试如果当前ERRORLEVEL v alue大于或等于给定数字,因此该命令必须始终按降序错误级别顺序执行。你可以改变你IF命令是这样的:

IF %ERRORLEVEL% EQU 1 GOTO allTasksReboot 
IF %ERRORLEVEL% EQU 2 GOTO allTasks 
..... 

或者,如果你改变你的标签刚性格式的那些和使用直接GOTO命令,你可以简化你的代码很多:

CHOICE /C:1234567 /N /M "Choose number for installation type." 
@echo You press: %ERRORLEVEL% 
@pause 
GOTO LABEL-%ERRORLEVEL% 

:LABEL-1 allTasksReboot 
@echo ************************************************************************** 
@echo All tasks - Unattended with reboot on finish 
@echo ************************************************************************** 
@pause 
goto scriptend 

:LABEL-7 scriptend 
@echo Lets exit... 
@pause 

:goexit 
+0

我选择你的答案的,因为你的解释,为什么这个“错误”的发生。还要感谢你使用label-%errorlevel%:)的代码技巧示例 – binball

4

试试这个:

IF ERRORLEVEL 7 GOTO scriptend 
IF ERRORLEVEL 6 GOTO onlyVnc 
IF ERRORLEVEL 5 GOTO allTasksExceptJava 
IF ERRORLEVEL 4 GOTO allExceptSoftware 
IF ERRORLEVEL 3 GOTO allExceptSoftwareReboot 
IF ERRORLEVEL 2 GOTO allTasks 
IF ERRORLEVEL 1 GOTO allTasksReboot 
1

我可能像使用单个GOTO一样最好使用LABEL-<n>,但@ Endoro的解决方案是使用IF ERRORLEVEL的正确方法。 如果你不想有权责令IF检查,你也可以使用的%ERRORLEVEL%值:

IF %ERRORLEVEL% EQU 7 GOTO scriptend 
IF %ERRORLEVEL% EQU 5 GOTO allTasksExceptJava 
IF %ERRORLEVEL% EQU 2 GOTO allTasks 
IF %ERRORLEVEL% EQU 6 GOTO onlyVnc 
IF %ERRORLEVEL% EQU 1 GOTO allTasksReboot 
IF %ERRORLEVEL% EQU 3 GOTO allExceptSoftwareReboot 
IF %ERRORLEVEL% EQU 4 GOTO allExceptSoftware