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?

91265 次浏览

Var2被设置,但是在执行块之前发生 echo %var2%行中的展开。
此时 var2为空。

因此,延迟扩展语法是存在的,它使用 !而不是 %,并且在执行时计算,而不是解析时计算。

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

我有点晚了党,但另一种方法来处理这种情况是继续进程之外的 if,像这样

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

或者/和使用 goto语法

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

这样就可以“及时”进行扩展,而不需要 setlocal EnableDelayedExpansion。底线是,如果你重新考虑你的脚本的设计,你可以这样做