Windows批处理文件中的变量行为

时间:2014-09-16 16:10:50

标签: windows batch-file

当谈到与Windows相关的任何内容时,我都是一个完整的菜鸟,所以我希望这对某人来说是一个简单的问题。如果它有所作为,我正在使用Win7。

我在.cmd文件中有以下代码,我从命令行连续运行两次,产生以下输出:

set /p input_tmp=input something: || set input_tmp=default
echo "input_tmp outside if: %input_tmp%"
if "%input_tmp%"=="default" (
    echo "input_tmp inside if: %input_tmp%"
)

-------------output 1---------------
input something: cat
"input_tmp outside if: cat"
-------------output 2---------------
input something: dog
"input_tmp outside if: dog"

但是,当我运行以下代码时......

if not "%~1"=="something" (
        set /p input_tmp=input something: || set input_tmp=default
        echo "input_tmp outside if: %input_tmp%"
        if "%input_tmp%"=="default" (
            echo "input_tmp inside if: %input_tmp%"
        )
)

-------------output 1---------------
input something: cat
-------------output 2---------------
input something: dog
"input_tmp outside if: cat"

成为Linux的Java程序员......这让我感到困惑。

1 个答案:

答案 0 :(得分:2)

在批处理文件中,当到达代码块(括号内的代码)时,将解析所有块,并将所有变量读取替换为存储在变量中的值开始执行之前代码。如果块中的代码更改了变量中的值,则无法从同一块内部检索此值,因为读取操作不存在,它将替换为变量中的值。

为避免这种情况,必须/应该使用延迟扩展。这允许在必要时将语法%var%更改为!var!,向解析器指示必须延迟对变量的读取操作,直到执行命令为止。

setlocal enabledelayedexpansion

if not "%~1"=="something" (
        set /p input_tmp=input something: || set input_tmp=default
        echo "input_tmp outside if: !input_tmp!"
        if "!input_tmp!"=="default" (
            echo "input_tmp inside if: !input_tmp!"
        )
)