我在编写一些Windows批处理脚本时遇到了一个奇怪的问题:在for循环中,迭代器的值%%X
在echo
和set
之间发生了变化。下面是代码:
@echo off
for %%x in (%*) do (
echo %%x
set path1=%%x
echo %path1%
)
@echo on
:
c:> test.bat aaa bbb
的结果是:
aaa
bbb
bbb
bbb
第一个bbb
是%path1%
。无法理解为何此值与%%X
不同
有人能帮忙吗?谢谢。
关键是通常在代码运行之前展开变量,因此分配给path1的第一个值将保留到最后。为了避免这种情况,您必须在代码开头添加SETLOCAL ENABLEDELAYEDEXPANSION
,并使用!path1!
而不是%path1%
访问path1:
@echo off
setlocal EnableDelayedExpansion
for %%x in (%*) do (
echo %%x
set path1=%%x
echo !path1!
)
@echo on
这会强制解释器在运行时重新计算path1的值。
查看http://ss64.com/nt/delayedexpansion.html获取更多信息