【问题标题】:DOS batch: SET variable and ECHO it within (...) blockDOS批处理:设置变量并在(...)块内回显它
【发布时间】:2009-11-06 12:19:48
【问题描述】:

我遇到了set 无法在批处理文件中工作的问题;提炼问题需要一段时间;一开始我以为跟子程序调用有关……

脚本

@echo off
setlocal
set a=aaa
echo a = "%a%"
(
set b=bbb
echo b = "%b%"
)

产生输出

a = "aaa"
b = ""

而我希望

a = "aaa"
b = "bbb"

请问这是为什么?这是DOS中的错误吗?也许我不知道(...) 命令分组语法的某些内容。

谢谢。

【问题讨论】:

    标签: batch-file cmd


    【解决方案1】:

    用户延迟扩展和!而不是 %

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set a=aaa
    echo a = "%a%"
    (
    set b=bbb
    echo b = "!b!"
    )
    

    【讨论】:

    • 感谢您的简洁回复。您是否碰巧知道编号参数 %1 等是否有语法?我试过 !1 和 !1!,但这些都不起作用。 (我在 :subroutine 调用的上下文中问这个问题。)
    • 因为它们不能像 %a% 类型变量那样在解析和执行之间改变,我看不出这很重要。
    • 你说的很对。我的脚本有其他问题,然后表现出相同的症状。问题解决了。非常感谢(对所有人)。
    【解决方案2】:

    正在发生的事情是批处理解释器将括号之间的所有内容都视为一行。这意味着它在运行任何命令之前对括号之间的所有内容进行变量替换。

    所以:

    (
    set b=bbb
    echo b = "%b%"
    )
    

    变成:

    (
    set b=bbb
    echo b = ""
    )
    

    变量 b 正在设置,但显然在您运行 SET 命令之前没有设置。

    【讨论】:

      【解决方案3】:

      您需要启用延迟扩展,否则批处理解释器将在解析时插入所有变量,而不是在运行时插入。

      setlocal enableextensions enabledelayedexpansion
      

      请参阅this question 获取示例和一些很好的解释。

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多