Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Batch: Returning a value from a SETLOCAL EnableDelayedExpansion

I wonder why this code does not work as expected:

@ECHO off
SET S1=HELLO

SETLOCAL EnableDelayedExpansion
SET S2=!S1! WORLD^^!
ECHO !S2!
ENDLOCAL & SET S1=!S2!

ECHO %S1%
PAUSE

Output:

HELLO WORLD!
!S2!

Expected output:

HELLO WORLD!
HELLO WORLD!

Thanks.

like image 330
mcu Avatar asked Jan 17 '23 09:01

mcu


1 Answers

It works as expected.
The delayed expansion will expand variables at execution time, not parse time, so it interpret your line ENDLOCAL & SET S1=!S2! as
endlocal
But at the part of SET S1=!S2! the delayed expansion is off so it can't be expanded anymore.

In your case you could use ENDLOCAL & SET S1=%S2%

As the exclamation mark is S2 is "safe", as the delayed exp. is off at the moment of execution.

But an always secure returning is a bit more complicated.
We discussed it at Dostips: Return ANY string across ENDLOCAL boundry

like image 185
jeb Avatar answered Jan 30 '23 22:01

jeb