Batch file CMD.exe对变量值有预感

Batch file CMD.exe对变量值有预感,batch-file,windows-7-x64,cmd,Batch File,Windows 7 X64,Cmd,在我编写的批处理脚本中,变量赋值出现了奇怪的行为。下面是我可以编造的最简单的例子来重新创建这个问题。我创建了文件type pos.bat: @echo on FOR /R ".\" %%F IN (*.txt) DO ( echo Look: %%F set file=%%~dpF%%~nF echo %file% ) 在包含两个*.txt文件的目录中,其中一个位于子目录中: pos/ |-pos.bat |-file1.txt |dir/ |-fil

在我编写的批处理脚本中,变量赋值出现了奇怪的行为。下面是我可以编造的最简单的例子来重新创建这个问题。我创建了文件
type pos.bat

@echo on
FOR /R ".\" %%F IN (*.txt) DO (
echo Look: %%F
set file=%%~dpF%%~nF
echo %file%
)
在包含两个*.txt文件的目录中,其中一个位于子目录中:

pos/
    |-pos.bat
    |-file1.txt
    |dir/
         |-file2.txt
我得到以下输出:

F:\pos>pos.bat
F:\pos>FOR /R ".\" %F IN (*.txt) DO (
echo Look: %F
 set file=%~dpF%~nF
 echo F:\pos\dir\file2
)

F:\pos>(
echo Look: F:\pos\file1.txt
 set file=F:\pos\file1
 echo F:\pos\dir\file2
)
Look: F:\pos\file1.txt
F:\pos\dir\file2

F:\pos>(
echo Look: F:\pos\dir\file2.txt
 set file=F:\pos\dir\file2
 echo F:\pos\dir\file2
)
Look: F:\pos\dir\file2.txt
F:\pos\dir\file2
在循环的第一次迭代中,
%file%
的值不应该变回
F:\pos\file1.txt
?此外,我还感到惊讶的是,`%file%的值在脚本调用之间应该一直保持不变。对脚本的第一次调用按照我的预期进行:

F:\pos>FOR /R ".\" %F IN (*.txt) DO (
echo Look: %F
 set file=%~dpF%~nF
 echo
)

F:\pos>(
echo Look: F:\pos\file1.txt
 set file=F:\pos\file1
 echo
)
Look: F:\pos\file1.txt
ECHO is on.

F:\pos>(
echo Look: F:\pos\dir\file2.txt
 set file=F:\pos\dir\file2
 echo
)
Look: F:\pos\dir\file2.txt
ECHO is on.

但所有后续调用都会给我垃圾结果。非常感谢您的帮助。

您需要启用延迟扩展,然后使用

在文件顶部(通常)

在FOR循环中

echo !file!
这是一个关于为什么和为什么的问题

echo !file!