2

在我编写的批处理脚本中,我在变量赋值中遇到了奇怪的行为。我可以编造的最简单的例子来重新创建问题如下。我创建了文件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.

但是所有后续调用都给了我垃圾结果。任何帮助是极大的赞赏。

4

1 回答 1

1

您需要启用延迟扩展,然后!用于循环内的变量。

在文件顶部(通常)

SETLOCAL EnableDelayedExpansion

在你的 FOR 循环中

echo !file!

这是关于原因和原因的一个很好的资源

于 2012-12-14T15:08:19.967 回答