Windows批处理变量赢得';t集

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

我想我在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 (
    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。关于括号的观点很好,它们确实非常有用。