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
,详细讨论问题。