DOS批处理: 在(...)块内设置变量并输出

10

我在批处理文件中遇到了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个回答

10

用户延迟扩展和使用 ! 替代 %

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

感谢简洁的回复。你知道是否有编号参数%1等的语法吗?我尝试过!1和!1!,但这些都不起作用。(我在呼叫:子程序的情况下询问此问题。) - Rhubbarb
1
由于它们不能像%a%类型变量那样在解析和执行之间进行更改,所以我认为这并不重要。 - Andy Morris
你说得很对。我在脚本中还有其他问题,这些问题表现出了相同的症状。问题已经解决了。非常感谢(所有人)。 - Rhubbarb

7

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

所以:

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

Becomes:

(
set b=bbb
echo b = ""
)

变量b被设置了,但显然在运行“SET”命令之前并没有设置。

6

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

setlocal enableextensions enabledelayedexpansion

请参考这个问题,其中有一个示例和一些很好的解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接