代码之家  ›  专栏  ›  技术社区  ›  Rhubbarb

DOS批处理:设置变量并在(…)块中回显它

  •  10
  • Rhubbarb  · 技术社区  · 15 年前

    set 不在批处理文件中工作;花了一段时间才弄清这个问题;起初我以为这是与子程序调用有关。。。

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

    产生输出

    a = "aaa"
    b = ""
    

    而我希望

    a = "aaa"
    b = "bbb"
    

    这是为什么?这是DOS中的错误吗?也许这件事有些道理 (...)

    3 回复  |  直到 7 年前
        1
  •  10
  •   Andy Morris    15 年前

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

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set a=aaa
    echo a = "%a%"
    (
    set b=bbb
    echo b = "!b!"
    )
    
        2
  •  7
  •   David Webb    15 年前

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

    因此:

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

    (
    set b=bbb
    echo b = ""
    )
    

    SET

        3
  •  6
  •   Community CDub    7 年前

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

    setlocal enableextensions enabledelayedexpansion
    

    看见 this question 举个例子和一些很好的解释。