我遇到了set
无法在批处理文件中工作的问题;提出问题需要一段时间;起初我认为这与子程序调用有关...
脚本
@echo off
setlocal
set a=aaa
echo a = "%a%"
(
set b=bbb
echo b = "%b%"
)
产生输出
a = "aaa"
b = ""
而我期待
a = "aaa"
b = "bbb"
为什么这样好?这是DOS中的错误吗?也许有一些我不知道的(...)
命令分组语法。
感谢。
答案 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以获取示例及其一些重要解释。