2010-08-31 8 views
6

Tengo un archivo de ventanas por lotes que hace esto:Cómo hacer bucle for de ventanas por lotes de archivos de ejecución por orden de nombre

for %%s in (*.sql) do call 

It loops through all the sql script in a folder. 

In the folder the file names are like: 
s4.06.01.sql 
s4.07.01.sql 
s4.08.01.sql 
s4.10.01.sql 
s5.01.sql 

Pero el bucle pasa a través de los archivos de forma aleatoria (no en el orden de los nombres), primero ejecuta s5.01, luego s4.06, luego s4.08, luego s4.10, luego s4.07. ¿Cómo puedo hacer que se ejecuten en el orden del nombre?

Solía ​​funcionar, pero ahora no es así. ¿Qué puede causar este problema?

Respuesta

3

La respuesta de Jerry podría ser la causa del problema.

Es posible resolverlo cambiando

for %%s in (*.sql) do call

a

for %%s in (dir"*.sql ^| sort) do call


Editarde Cudo a LonelyPixel

La solución publicada no funciona como en una máquina con Windows 8 (tal vez lo hizo en aquel entonces con Windows XP, pero no tengo ni idea).

A continuación se muestra una solución de trabajo que utiliza el símbolo del sistema de Windows 8.

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo %%s 
+2

O, 'para/"usebackq" f %% s en (\' dir * .sql/b/ON \ ') no call' –

+0

Patrick, su solución se corta todos los nombres de los archivos después de un espacio, por lo que solo es parcialmente útil. – ygoe

+1

Lieven, su solución falla por completo. Si reemplazo el "por un espacio, encuentra" dir "," | "y" ordenar "también. Así que eso tampoco funciona. – ygoe

2

Si la memoria se sirve, funcionará en los archivos en el orden en que el sistema de archivos los devuelve. Como tal, si lo ejecuta en una partición de disco formateada con NTFS, los nombres se devolverán en orden, de modo que se procesarán en orden ordenado. Si la partición del disco está formateada con algo como FAT o FAT32, los nombres se recuperarán (y procesarán) en un orden más o menos aleatorio.

1

yo también tenía que tratar con espacios en los nombres de archivo, por lo que añade comillas alrededor de la variable de entrada, así:

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo "%%s" 

En mi caso fue SQLCMD, con las secuencias de comandos en un subdirectorio, de este modo:

SET "machineName=localhost" 
for /f "tokens=*" %%f in ('dir /b PostDeployScripts\*.sql ^| sort') do sqlcmd -E -S%machineName% -i"PostDeployScripts\%%f" 
Cuestiones relacionadas