2011-12-06 13 views
24

Va bene, io sono un programmatore PHP e, purtroppo, per ragioni che non annuncerà per brevità, ho bisogno di scrivere/utilizzare un file batch che elabora alcune immagini per me.File batch di Windows che esegue il looping delle directory per elaborare i file?

Ho una cartella piena di cartelle nidificate, all'interno di ciascuna di queste cartelle nidificate c'è un'altra cartella contenente un numero di immagini TIF, il numero di immagini varia in ciascuna cartella. Ho anche un file batch, consente di chiamare ProcessImages.bat per Windows che si può "cadere" questi file TIF (o, ovviamente, specificarli in una lista riga di comando quando si richiama il pipistrello); su cui crea una nuova cartella con tutto il mio processo di immagini basato su un EXE che ho.

La cosa buona è che, poiché il file bat utilizza il percorso dalle cartelle su cui vi "cadete", posso selezionare tutti i TIF di una cartella e rilasciarlo per eseguire l'elaborazione ... ma mentre continuo a fare manualmente questo per i 300 o giù di lì le cartelle di TIF ho trovo impantana il sistema verso il basso così incredibilmente e se potessi elaborare solo questi uno alla volta (senza fare manualmente) sarebbe meraviglioso.

Tutto ciò che ho detto ... qualcuno potrebbe indicarmi la direzione giusta (per un file bat di Windows AMATEUR) in un modo in cui posso scrivere uno script bat di Windows che posso chiamare da una directory e farlo attraversare TUTTO le directory contenute all'interno di quella directory ... ed eseguono il mio file batch di elaborazione su ogni set di immagini uno alla volta?

Grazie in anticipo!

Tyler

risposta

67

Si può scrivere un algoritmo ricorsivo in lotti che vi dà il controllo esatto di ciò che si fa in ogni sottodirectory nidificato:

@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

Grazie @Aacini! Davvero ben detto! Avevo iniziato a lavorare su qualcosa di simile, ma non ho ottenuto nulla ... Avevo bisogno di questo per vedere come funziona; e un rapido test di questo codice indica che funzionerebbe esattamente come previsto. – Tyler

+1

@Aacini. Puoi anche spiegare/commentare cosa fanno questi comandi/D, %% f? Sarebbe grandioso ! – Dexters

+2

puoi trovare ulteriori informazioni sulla sintassi dal seguente URL. http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/for.mspx?mfr=true –

42

soluzione di Aacini opere, ma lo si può fare in una sola riga:

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

Non so quanti anni dopo, ma sto ancora usando questo! – Tyler

+0

Lo sto usando e, per qualche ragione, esegue il comando per ogni file nell'albero delle directory, non solo quelli con l'estensione che specifica –

+2

Come ho già detto, il mio metodo fornisce un controllo esatto di ciò che fai in ogni sottodirectory . Se il processo richiede un certo ordine (ad esempio, spostare prima i file e quindi eliminare sottodirectory vuote), non può essere raggiunto utilizzando 'for/R' ... – Aacini

1

Pubblicare qui come sembra essere la domanda più popolare su questo caso.

Ecco un vecchio gioiello che sono finalmente riuscito a trovare su internet: sweep.exe.
Si esegue il comando fornito nella directory corrente e in tutte le sottodirectory, semplice.


Supponiamo di avere qualche programma che elaborano tutti i file in una directory (ma i casi di utilizzo sono davvero molto più ampio):

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

Quindi, si desidera eseguire questo programma nella directory corrente e tutte le sottodirectory:

:: 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 


Pro: non è necessario alterare il programma originale per rendere i t elaborare sottodirectory. Hai la possibilità di elaborare le sottodirectory solo se lo desideri. E questo comando è così semplice e piacevole da usare.

Con: potrebbe non riuscire con alcuni comandi (che contengono gli spazi, le citazioni, non so). Vedere this thread per esempio.

+0

Questo è fantastico ... – Tyler

2

So che questo non è ricorsione (iterazione sottodirectory elencate?), ma potrebbe funzionare meglio per alcune applicazioni:

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

Sostituire la terza riga con qualsiasi comando necessario.

dir/pubblicitarie - elenco solo le directory

La cosa interessante è pushd non ha bisogno di citazioni se gli spazi in cammino.

Problemi correlati