Windows 7批处理脚本'For'命令错误/错误

问题描述:

Windows 7批处理文件'for'命令似乎存在一个错误。该命令可以遍历源目录并一次返回一个文件名。但是我发现如果我的命令修改那个源目录中的文件,例如Windows 7批处理脚本'For'命令错误/错误

for /R %1 %%s in (*.*) do call :do1file %%s 
@goto :EOF 

:do1file 
@echo es > tmp_x2932.tmp 
move /y tmp_x2932.tmp %1 
@goto :EOF 

'for'命令可以使用相同的文件名称调用do命令超过1次。 (请注意,出于说明问题的目的,'echo es> tmp_x2932.tmp'仅仅是一些其他合法命令的简单替换,例如编辑原始源文件的'sed'。)

For例如,9个文件

D:\build-release\dump>dir /on 
Volume in drive D has no label. 
Volume Serial Number is 1972-268D 

Directory of D:\build-release\dump 

12/03/2011 05:13 PM <DIR>   . 
12/03/2011 05:13 PM <DIR>   .. 
12/03/2011 05:40 PM     5 f1 
12/03/2011 05:40 PM     5 f2 
12/03/2011 05:40 PM     5 f3 
12/03/2011 05:40 PM     5 f4 
12/03/2011 05:40 PM     5 f5 
12/03/2011 05:40 PM     5 f6 
12/03/2011 05:40 PM     5 f7 
12/03/2011 05:40 PM     5 f8 
12/03/2011 05:40 PM     5 f9 
       9 File(s)    45 bytes 
       2 Dir(s) 31,200,313,344 bytes free 

会产生这样的结果(testdir.bat是使用批处理文件名)的目录:

d:\test>testdir D:\build-release\dump 
d:\test>for /R D:\build-release\dump %s in (*.*) do call :do1file %s 
d:\test>call :do1file D:\build-release\dump\f4 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f4 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f5 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f5 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f6 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f6 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f7 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f7 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f8 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f8 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f9 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f9 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f1 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f1 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f2 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f2 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f3 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f3 
     1 file(s) moved. 
d:\test>call :do1file D:\build-release\dump\f4 
d:\test>move /y tmp_x2932.tmp D:\build-release\dump\f4 
     1 file(s) moved. 

文件d:\建释放\转储\ F4被称为两次错误。

在Windows XP中未遵守此行为。有没有办法在Windows 7中修复它而不更改旧脚本?我知道我总是可以使用一个临时目录来存储所有的中间文件,而不是修改它们,但我在Windows XP中的旧脚本就是这样做的。

到目前为止,我只能建议更换FOR /R循环与FOR /F使用的DIR /S输出:

FOR /F "delims=" %%s IN ('DIR %1 /S /B') DO CALL :do1file %%s 
… 
+0

谢谢。我刚刚从这个链接中找到了这个:http://blogs.msdn.com/b/oldnewthing/archive/2007/05/11/2532913.aspx – JavaMan