2011-12-03 66 views
4

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中的舊腳本就是這樣做的。

回答

4

到目前爲止,我只能建議更換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