2013-06-27 6 views
2

여기 바보 같은 질문이 나오지만 제발 도와주세요 아니면 내 뇌가 폭발합니다! ;)) 내가 이해하지 못하는 어리석은 몇 가지 ...Windows 배치 파일 - GOTO 명령이 무시되었습니다

간단히 말해서 : 내가 7 번 (종료)을 선택하면 반환 된 ERRORLEVEL은 정확하지만 GOTO의 지정된 레이블은 무시되고 대신 allTasksReboot 레이블로 이동합니다. ..

이 내 "코드"입니다 ...

@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

내가 답을 선택 : 당신이 IF 검사를 주문하고 싶지 않았다 경우에는 %ERRORLEVEL%의 값을 사용할 수 있습니다. 또한 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

I을 아마도 LABEL-<n>과 함께 하나의 GOTO를 사용하는 것이 가장 좋지만 @ Endoro의 해결책은 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