Windows 7 Batch Script 'For' Error / error del comando

Parece que hay un error con el comando 'for' del archivo por lotes de Windows 7. Este comando puede recorrer un directorio de origen y devolver un nombre de archivo a la vez. Pero descubrí que si mi comando modifica los archivos en ese directorio de origen, por ejemplo,

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

el comando 'for' podría invocar el comando do con el mismo nombre de archivo más de 1 vez. (Tenga en cuenta que, con el fin de ilustrar el problema, 'echo es> tmp_x2932.tmp' es solo un simple reemplazo de algún otro comando legítimo, como 'sed', que edita el archivo fuente original).

Por ejemplo, un directorio con 9 archivos

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

producirá este resultado (testdir.bat es el nombre del archivo por lotes utilizado):

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.

file D: \ build-release \ dump \ f4 se llama dos veces erróneamente.

Este comportamiento no se observa en Windows XP. ¿Hay alguna forma de solucionarlo en Windows 7 sin cambiar los scripts antiguos? Sé que siempre puedo usar un directorio temporal para almacenar todos los archivos intermedios en lugar de modificarlos en su lugar, pero mis viejos scripts en Windows XP simplemente hacen eso.

Respuestas a la pregunta(2)

Su respuesta a la pregunta