0

I have a batch function and I need to return a value from it. Following is the script:

@echo off
call :Mode mode1
echo mode is %mode1%

:Mode
setlocal enabledelayedexpansion
set count=0
for /f "tokens=*" %%x in (map.txt) do (
    set /a count+=1
    set var[!count!]=%%x
)

for /f "tokens=2 delims=: " %%A in ("%var[2]%") Do (
    set mode=OPEN
)
IF %mode%==OPEN (
    echo coming into open
    set %1=OPEN
    echo %mode1%
) ELSE (
    echo coming into shorted
    set %1=SHORTED
    echo %mode1%
) 
EXIT /B 0

echo mode is %mode1% doesn't print anything. Any help? I've hardcoded set mode=OPEN for testing purposes.

1 Answer 1

2

Each exit, exit /b or goto :eof implicitly does an endlocal, so you need a trick for your variable %1 to survive an endlocal. endlocal & set ... & goto :eof does the trick because the whole line gets parsed in one go:

@echo off
call :Mode mode1
echo mode is %mode1%
goto :eof

:Mode
setlocal enabledelayedexpansion
set "mode=OPEN"
IF "%mode%" == "OPEN" (
    echo coming into open
    endlocal&set "%1=OPEN"&goto :eof
) ELSE (
    echo coming into shorted
    endlocal&set "%1=SHORTED"&goto :eof
) 

For the same reason, echo %mode1% in your subroutine does not print the variable.

Note: I changed set and if syntax to recommended quoted syntax.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.