50

我想我在 Window 的批处理脚本中遇到了一个错误。

我无法设置扩展 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 Not successful. )行没有执行。

为什么行没有执行?

4

2 回答 2

93

你错过了一些东西;-)

cmd解析命令时扩展变量,而不是运行时。在这种情况下,带有块(或实际上是任何块)的ifor语句恰好算作单个命令。因此,当您在块内设置变量尝试在同一个块中使用它们时,不再有变量 - 它们被替换为变量在块执行之前所具有的值。for( ... )

贴一个

setlocal enabledelayedexpansion

在批处理文件的开头并使用!zip!而不是%zip%. 有关help set该问题的详细讨论,请参阅 。

于 2012-03-13T10:04:28.277 回答
0

提醒一下,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。因此,如果一行中有多个命令,我总是使用“()”来设置命令。

if "%1"=="" (set a=20) else (set a=%1)    
于 2018-01-11T20:06:55.573 回答