Windows批处理SET内部IF无法正常工作

时间:2012-02-01 20:01:12

标签: windows batch-file cmd delayedvariableexpansion

当我运行此脚本时(来自.bat文件):

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

我总是得到:

ECHO is on.

意味着var2变量没有真正设置。 谁能帮助我理解为什么?

2 个答案:

答案 0 :(得分:141)

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

因此,delayedExpansion语法存在,它使用!而不是%,并且它在执行时进行评估,而不是在解析时进行评估。

请注意,要使用!,需要附加声明setlocal EnableDelayedExpansion

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

答案 1 :(得分:2)

我在聚会上有点迟了但处理这种情况的另一种方法是继续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。最重要的是,如果你重新考虑脚本的设计,你可以这样做