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
…
谢谢。我刚刚从这个链接中找到了这个:http://blogs.msdn.com/b/oldnewthing/archive/2007/05/11/2532913.aspx – JavaMan