Windows Batch File Looping a través de directorios para procesar archivos?

De acuerdo, soy progtwigdor de PHP y, desafortunadamente, por razones que no voy a anunciar por brevedad, necesito escribir / usar un archivo por lotes que procese algunas imágenes para mí.

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 debido a que el archivo bat usa la ruta de las carpetas que “sueltas” en él, puedo seleccionar todos los TIF de una carpeta y soltarlo para hacer el procesamiento … pero a medida que continúo haciendo esto manualmente para las aproximadamente 300 carpetas de TIF que tengo me parece que atasca mi sistema tan increíblemente y si solo pudiera procesarlas de una en una (sin hacerlo manualmente) sería maravilloso.

Dicho todo esto … ¿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 al que pueda llamar desde un directorio y hacer que atraviese TODOS los directorios que contiene? ese directorio … y ejecutar mi archivo por lotes de procesamiento en cada conjunto de imágenes de a una por vez?

¡Gracias por adelantado!

Tyler

Puede escribir un algoritmo recursivo en Batch que le dé un control exacto de lo que hace en cada subdirectorio nested:

@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 

La solución de Aacini funciona pero puedes hacerlo en una sola línea:

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

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 ) 

Reemplace la 3ra línea con cualquier comando que pueda necesitar.

dir / ad – list solo directorios

Lo bueno es pushd no necesita citas si hay espacios en el camino.

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

Aquí hay una vieja joya que finalmente pude encontrar en Internet: sweep.exe .
Ejecuta el comando proporcionado en el directorio actual y en todos los subdirectorios, tan simple como eso.

Supongamos que tiene algún progtwig que procesa todos los archivos en un directorio (pero los casos de uso son mucho más amplios que este):

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

Entonces, desea ejecutar este progtwig en el directorio actual y en 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: No tiene que modificar su progtwig original para hacerlo 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 este hilo, por ejemplo.