echo和windows批处理中for循环中设置的迭代器%%x的值不同

echo和windows批处理中for循环中设置的迭代器%%x的值不同,windows,batch-file,Windows,Batch File,我在编写一些Windows批处理脚本时遇到了一个奇怪的问题:迭代器值%%X在for循环中的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不同的原因 有人

我在编写一些Windows批处理脚本时遇到了一个奇怪的问题:迭代器值
%%X
在for循环中的
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
,并使用
访问路径1!路径1而不是
%path1%

@echo off
setlocal EnableDelayedExpansion

for %%x in (%*) do (
    echo %%x
    set path1=%%x
    echo !path1!

)

@echo on
这将迫使解释器在运行时重新计算path1的值

查看更多信息