迭代器%%x的值在echo和Windows批处理中的for循环中是不同的



我在编写一些Windows批处理脚本时遇到了一个奇怪的问题:在for循环中,迭代器的值%%Xechoset之间发生了变化。下面是代码:

@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获取更多信息

最新更新