2011-12-03 8 views
4

Windows 7バッチファイル 'for'コマンドにバグがあるようです。このコマンドは、ソースディレクトリ内を歩き回り、一度に1つのファイル名を返すことができます。しかし、私のコマンドがそのソースディレクトリ内のファイルを変更する場合、Windows 7バッチスクリプト 'For'コマンドエラー/バグ

'for'コマンドは、同じファイル名でdoコマンドを1回以上呼び出すことができます。 (この問題を説明するために、 'echo es> tmp_x2932.tmp'は 'sed'のような他の正当なコマンドを置き換えるだけで、元のソースファイルを編集することに注意してください)。

たとえば、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は呼ばれているが誤って2回。

この現象は、Windows XPでは発生しません。古いスクリプトを変更せずにWindows 7で修正する方法はありますか?私は一時的なディレクトリを使用して、すべての中間ファイルを場所を変えずに保存することができますが、Windows XPの古いスクリプトはそれだけです。

答えて

4

これまでのところ私はDIR /Sの出力を使用していますFOR /FFOR /Rループを置き換える提案することができます:

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

関連する問題