windows batch SET inside IF not working

对着背影说爱祢 提交于 2019-12-17 02:34:35

问题


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?


回答1:


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



回答2:


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



来源:https://stackoverflow.com/questions/9102422/windows-batch-set-inside-if-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!