Windows批变量将不会设置

时间:2012-03-13 10:00:32

标签: if-statement batch-file set

我想我在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. )行未执行。

为什么线条没有执行?

2 个答案:

答案 0 :(得分:80)

你错过了什么; - )

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

坚持

setlocal enabledelayedexpansion

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

答案 1 :(得分:-1)

提醒一下,ms-dos" set"命令获取等号后的每个字符串。所以,如果你写

if "x"=="x" set a=foo else set a=bar
echo %a%  // output : foo else set a=bar

%a%实际设置为" foo else设置a = bar",而不是foo。 所以我总是使用"()"如果一行中有多个命令,则为set命令。

if "%1"=="" (set a=20) else (set a=%1)