Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows batch file - GOTO command is ignored

Here it goes stupid question but please help or my brain will explode! ;)) Some stupid thing which I don't understand...

In short: why after I choose number 7 (exit) the ERRORLEVEL returned is correct but GOTO specified label is ignored and instead it goes to allTasksReboot label...

This is my "code"...

@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
like image 529
binball Avatar asked Jun 29 '26 22:06

binball


2 Answers

Remember that IF ERRORLEVEL N command test if the current ERRORLEVEL value is GREATER THAN OR EQUAL to the given number, so this command must always be executed in descending errorlevels order. You may change your IF commands this way:

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

Or you may simplify your code a lot if you change your labels to a rigid-format ones and use a direct GOTO command:

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
like image 66
Aacini Avatar answered Jul 02 '26 15:07

Aacini


try this:

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
like image 27
Endoro Avatar answered Jul 02 '26 17:07

Endoro