CMD.exe有关于变量值的预感

时间:2012-12-14 15:03:11

标签: 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/
         |-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.

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

1 个答案:

答案 0 :(得分:1)

您需要启用延迟扩展,然后对循环中的变量使用!

位于文件顶部(通常为)

SETLOCAL EnableDelayedExpansion

在您的FOR循环中

echo !file!

这是关于为什么和为什么的good resource