DOS批处理:SET变量和ECHO在(...)块内

时间:2009-11-06 12:19:48

标签: batch-file cmd

我遇到了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 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:7)

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

所以:

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

变为:

(
set b=bbb
echo b = ""
)

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

答案 2 :(得分:6)

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

setlocal enableextensions enabledelayedexpansion

请参阅this question以获取示例及其一些重要解释。