Search code examples
windowsbatch-filecmddelayedvariableexpansion

windows batch SET inside IF not working


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?


Solution

  • 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!
    )