Here is a windows .bat file:
@echo off
call :label
echo %errorlevel%
pause >nul
exit
:label
exit /b 1
Works as expected and outputs 1.
but on changing the code to:
@echo off
if 1==1 (
call :label
echo %errorlevel%
)
pause >nul
exit
:label
exit /b 1
the output is 0 instead of 1.
The if 1==1 is just to show the result but I need to use another if statement in the actual script. Why is this happening and what is the solution? If delayed expansion is the solution, how to use it?
1 Answer
If delayed expansion is the solution, how to use it?
As follows:
@echo off
setlocal enabledelayedexpansion
if 1==1 (
call :label
echo !errorlevel!
)
pause >nul
endlocal
exit
:label
exit /b 1
Delayed Expansion will cause variables within a batch file to be expanded at execution time rather than at parse time, this option is turned on with the
SETLOCAL EnableDelayedExpansioncommand.
Source: - EnableDelayedExpansion - Windows CMD - SS64.com
You need to replace % with ! to take advantage of delayed expansion.