我在编写的批处理脚本中的变量赋值中遇到了奇怪的行为。我可以编写一个最简单的例子来重新创建问题。我创建了文件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.
但所有后续调用都会给我垃圾结果。非常感谢任何帮助。
答案 0 :(得分:1)
您需要启用延迟扩展,然后对循环中的变量使用!
。
位于文件顶部(通常为)
SETLOCAL EnableDelayedExpansion
在您的FOR循环中
echo !file!
这是关于为什么和为什么的good resource。