Windows批处理variables不会设置

我想我碰到了Window的批处理脚本中的一个bug。

我不能设置扩展的if语句中的variables。

这里是我的脚本的一个孤立的部分:

@echo off set success=1 set Version=12345 set Target=Client set Type=456 set dir= set zip= if "%Version%"=="" set success=0 if "%Type%"=="" set success=0 if 1==1 set test=42 if %success%==1 ( set test2=57005 if "%Target%"=="Client" ( set dir=ModName v%Version% set zip=ModName v%Version% %Type%.zip echo Version: %Version% echo Type: %Type% echo. echo Target: %Target% echo dir: %dir% echo zip: %zip% echo. echo test: %test% echo test2: %test2% ) ) else ( echo Not successful. ) 

这是一个全新的cmd实例的输出:

 C:\Users\RandomClown\Desktop>test.bat Version: 12345 Type: 456 Target: Client dir: zip: test: 42 test2: 

你应该注意的是,单行if语句正确设置的东西。 多线如果将执行任何不是一套。 我不认为我错过了什么。 另外,多行if语句正确执行正确的行,因为else ( echo Not successful. )行没有执行。

为什么这些行不执行?

你错过了什么;-)

cmd在命令parsing时展开variables,而不是在运行时展开。 在这种情况下, if或) for语句( ... ) (或实际上任何块)作为单个命令发生。 所以,当你在一个块内设置variables, 尝试在同一个块中使用它们时,就不再有variables – 它们被variables块执行之前的值所取代。

坚持一下

 setlocal enabledelayedexpansion 

在batch file的开始处,使用!zip! 而不是%zip% 。 请参阅help set ,详细讨论问题。