2011-12-06 18 views
24

Bien, soy un programador PHP y desafortunadamente, por razones que no voy a anunciar por brevedad, necesito escribir/usar un archivo por lotes que procesa algunas imágenes para mí.Windows Batch File Looping a través de directorios a archivos de proceso?

Tengo una carpeta llena de carpetas anidadas, dentro de cada una de estas carpetas anidadas hay una carpeta más que contiene un número de imágenes TIF, el número de imágenes varía en cada carpeta. También tengo un archivo de proceso por lotes, vamos a llamarlo ProcessImages.bat para Windows en el que puede "soltar" estos archivos TIF (o, obviamente, especificarlos en una lista de líneas de comando al invocar el bate); sobre el cual crea una nueva carpeta con todo mi proceso de imágenes basado en un EXE que tengo.

Lo bueno es que, como el archivo bat usa la ruta de las carpetas que "sueltas" en él, puedo seleccionar todos los TIF de una carpeta y soltarla para hacer el procesamiento ... pero a medida que continúo Haga esto manualmente para las 300 o más carpetas de TIF que tengo. Encuentro que atasca mi sistema tan increíblemente y si solo pudiera procesarlos de uno en uno (sin hacerlo manualmente) sería maravilloso.

Dicho todo ... podría alguien apuntarme en la dirección correcta (para un archivo bat de Windows AMATEUR) de forma que pueda escribir un script bat de Windows que pueda llamar desde un directorio y hacer que atraviese TODO los directorios contenidos dentro de ese directorio ... y ejecutar mi archivo por lotes de procesamiento en cada conjunto de imágenes de a una por vez?

¡Gracias de antemano!

Tyler

Respuesta

67

Usted puede escribir un algoritmo recursivo en el lote que le da un control exacto de lo que haces en cada subdirectorio anidado:

@echo off 
call :treeProcess 
goto :eof 

:treeProcess 
rem Do whatever you want here over the files of this subdir, for example: 
for %%f in (*.tif) do echo %%f 
for /D %%d in (*) do (
    cd %%d 
    call :treeProcess 
    cd .. 
) 
exit /b 
+0

Gracias @Aacini! ¡Muy bien dicho! Empecé a trabajar en algo similar, pero no llegué a ningún lado ... Necesitaba esto para ver cómo funcionaba; y una prueba rápida de este código indica que funcionaría exactamente como se esperaba. – Tyler

+1

@Aacini. ¿Puedes también explicar/comentar lo que hacen estos comandos/D, %% f? Eso seria genial ! – Dexters

+2

puede encontrar más sobre la sintaxis de la siguiente url. http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/for.mspx?mfr=true –

42

funciona la solución de Aacini pero puede hacerlo en una sola línea:

for /R %%f in (*.tif) do echo "%%f" 
+0

No sé cuántos años más tarde, pero todavía estoy usando este! – Tyler

+0

Estoy usando esto, y por alguna razón, hace el comando para cada archivo en el árbol de directorios, no solo los que tienen la extensión especifico –

+2

Como dije, mi método da control exacto de lo que haces en cada subdirectorio . Si el proceso requiere un cierto orden (por ejemplo, primero mueva los archivos y luego elimine los subdirectorios vacíos) simplemente no se puede lograr usando 'for/R' ... – Aacini

1

Publicando aquí ya que parece ser la pregunta más popular sobre este caso.

Aquí es una antigua joya fin he logrado encontrar de nuevo en la internet: sweep.exe.
Ejecuta el comando provisto en el directorio actual y en todos los subdirectorios, tan simple como eso.


Supongamos que usted tiene algún programa que procese todos los archivos en un directorio (pero los casos de uso es realmente mucho más amplio que esto):

For example, a file C:\Commands\processimages.cmd which contains: 
FOR %%f IN (*.png) DO whatever 

Por lo tanto, se desea ejecutar este programa en el directorio actual y todos los subdirectorios:

:: Put sweep.exe in your PATH, you'll love it! 
C:\ImagesDir> sweep C:\Commands\processimages.cmd 

:: And if processimages.cmd is in your PATH too, the command becomes: 
C:\ImagesDir> sweep processimages 


Pros: Usted no tiene que alterar su programa original para hacer i t procesar subdirectorios. Usted tiene la opción de procesar los subdirectorios solo si así lo desea. Y este comando es tan directo y agradable de usar.

Con: Podría fallar con algunos comandos (que contienen espacios, comillas, no sé). Ver this thread por ejemplo.

+0

Esto es asombroso ... – Tyler

2

Sé que esto no es recursion (iteración a través de subdirectorios enumerados?), Pero puede funcionar mejor para algunas aplicaciones:

for /F "delims=" %%i in ('dir /ad /on /b /s') do (
    pushd %%i 
    dir | find /i "Directory of" 
    popd 
) 

Vuelva a colocar la tercera línea con el comando que pueda necesitar.

dir/ad - lista sólo directorios

Lo bueno es pushd no necesita comillas si los espacios en ruta.

Cuestiones relacionadas