批处理文件if语句怪异与变量赋值和扩展

时间:2014-02-11 02:18:21

标签: batch-file

我有一个批处理文件,我正在尝试使用if语句中的一些变量。例如,我set一个来自命令行参数1的变量,或者如果没有参数1,那么我有一个默认值。然后,根据值是默认值还是命令行中的参数,我执行其他一些功能。

我注意到在if语句结束后,我在if语句中指定的变量不可用。有人可以解释为什么会这样吗?

例如,这将无法回显TEST1中的内容:

@echo off
setlocal ENABLEEXTENSIONS

if .%1==. (
    set TEST1=NOTFOUND
    echo %TEST1%
) else (
    set TEST1=%1
    echo %TEST1%
)

如果我使用或不使用参数运行该批处理文件,则返回ECHO is off.。它认为变量仍然是空的。

如果我尝试在if语句之后获取变量,它可以工作:

@echo off
setlocal ENABLEEXTENSIONS

if .%1==. (
    set TEST1=NOTFOUND
) else (
    set TEST1=%1
)
echo %TEST1%


我确定这与变量扩展有关,但它真的让我感动。看起来我会在if语句中指定另一个变量,例如set USING_DEFAULT_TEST1=TRUEset USING_DEFAULT_TEST1=FALSE,或者与默认值或其他内容进行比较。

1 个答案:

答案 0 :(得分:1)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。在执行块之前,块中的任何%var%将被解析块时的变量值替换

因此,IF (something) else (somethingelse)将在遇到%variables%时使用IF的值执行。

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。