Windows批处理变量赢得';t集
我想我在Window的批处理脚本中遇到了一个bug 我无法设置扩展if语句中的变量 以下是我脚本的一个单独部分:Windows批处理变量赢得';t集,windows,batch-file,if-statement,cmd,delayedvariableexpansion,Windows,Batch File,If Statement,Cmd,Delayedvariableexpansion,我想我在Window的批处理脚本中遇到了一个bug 我无法设置扩展if语句中的变量 以下是我脚本的一个单独部分: @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
@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将执行非集合的任何操作。我想我没有错过任何东西。
此外,多行if语句正确地执行了正确的行,因为else(echo未成功。)
行没有执行
为什么没有执行这些行?您遗漏了一些内容;-)
cmd
在解析命令时展开变量,而不是在运行命令时展开变量。在这种情况下,带有块(…)
(实际上是任何块)的if
或for
语句作为单个命令进行协商。因此,当您在块内设置变量并尝试在同一块中使用它们时,就不再有变量了——它们被块执行之前变量所具有的值所取代
贴
setlocal enabledelayedexpansion
在批处理文件的开头,使用!拉链
而不是%zip%
。有关此问题的详细讨论,请参见帮助设置。只需提醒一下,ms dos“set”命令会获取等号后的每个字符串。所以如果你写
if "x"=="x" set a=foo else set a=bar
echo %a% // output : foo else set a=bar
%a%实际上设置为“foo else set a=bar”,而不是foo。
所以,如果一行中有多个命令,我总是使用“()”作为set命令
if "%1"=="" (set a=20) else (set a=%1)
“set”命令的可能副本并不总是取等号后的每个字符串。示例:设置一=1&回显Hiya。关于括号的观点很好,它们确实非常有用。