我想我在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. )
行未执行。
为什么线条没有执行?
答案 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)