【问题标题】:Variable behaviour in Windows batch filesWindows 批处理文件中的可变行为
【发布时间】:2014-11-10 11:45:00
【问题描述】:

对于任何与 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 程序员……这让我很困惑。

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    在批处理文件中,当到达一个代码块(括号内的代码)时,将解析所有块并将所有变量读取替换为存储在变量中的值before开始执行代码。如果块中的代码改变了变量中的值,这个值就不能从同一个块中取回,因为读操作不存在,它被替换为变量中的值。

    为避免这种情况,必须/应该使用延迟扩展。这允许在必要时将语法 %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!"
            )
    )
    

    【讨论】:

    • 这样就行了!非常感谢您的快速回复!附带问题...为什么要这样做?
    • @gr33ngapion,只是我的看法,但是......批处理解析器删除了读取的变量及其值,因此该值可以成为命令的一部分,而不仅仅是检索到的要由命令处理的数据(例如set "myCmd=dir"%myCmd% /b)。变量/值替换在一行上很明显,但是当块被读取和解析时,就好像只读取了一行(或多或少),你会以这种行为结束。
    • 嗯...我觉得如果没有这个“功能”,这实际上并不太难解决。那好吧。只是我想我必须记住的其他事情。感谢您的澄清!
    • 批处理文件的这种括号行为是否也存在于函数或标签中?我的意思是,如果标签或函数具有 if 代码或 for 代码或带有括号的任何内容,那么相同的行为(解析时替换变量)对批处理也有效吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    相关资源
    最近更新 更多