문제

when I'm running this script (from a .bat file):

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

I always get:

ECHO is on.

Meaning the var2 variable was not really set. Can anyone please help me understand why?

도움이 되었습니까?

해결책

var2 is set, but the expansion in the line echo %var2% occurs before the block is executed.
At this time var2 is empty.

Therefore the delayedExpansion syntax exists, it uses ! instead of % and it is evaluated at execution time, not parse time.

Please note that in order to use !, the additional statement setlocal EnableDelayedExpansion is needed.

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)

다른 팁

I am a bit late to the party but another way to deal with this condition is to continue process outside if, like this

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

Or/and use goto syntax

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

This way expansion occurs "in time" and you don't need setlocal EnableDelayedExpansion. Bottom line, if you rethink design of your script you can do it like that

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top