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

Rhu*_*arb 10 cmd batch-file

我有一个问题,set没有在批处理文件中工作; 提出问题需要一段时间; 起初我以为这与子程序调用有关...

剧本

@echo off
setlocal
set a=aaa
echo a = "%a%"
(
set b=bbb
echo b = "%b%"
)
Run Code Online (Sandbox Code Playgroud)

产生输出

a = "aaa"
b = ""
Run Code Online (Sandbox Code Playgroud)

而我期待

a = "aaa"
b = "bbb"
Run Code Online (Sandbox Code Playgroud)

为什么这样好?这是DOS中的错误吗?也许有一些(...)我不知道的命令分组语法.

谢谢.

And*_*ris 10

用户延迟扩展和!代替 %

@echo off
setlocal enableextensions enabledelayedexpansion
set a=aaa
echo a = "%a%"
(
set b=bbb
echo b = "!b!"
)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ebb 7

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

所以:

(
set b=bbb
echo b = "%b%"
)
Run Code Online (Sandbox Code Playgroud)

变为:

(
set b=bbb
echo b = ""
)
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*lak 6

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

setlocal enableextensions enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)

请参阅此问题以获取示例并对其进行一些很好的解释.