Come fare qualcosa per ogni file in una directory con uno script batch


265

Come si esegue l'iterazione su ciascun file in una directory con un file .bat o .cmd?

Per semplicità, fornisci una risposta che fa eco al nome del file o al percorso del file.

Risposte:


348

Utilizzo della riga di comando:

for /f %f in ('dir /b c:\') do echo %f

Utilizzo dei file batch:

for /f %%f in ('dir /b c:\') do echo %%f

Aggiornamento : se la directory contiene file con spazio nei nomi, è necessario modificare il delimitatore utilizzato dal for /fcomando. ad esempio, è possibile utilizzare il carattere pipe.

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

Aggiornamento 2 : (veloce un anno e mezzo dopo la risposta originale :-)) Se il nome della directory stessa ha uno spazio nel nome, è possibile utilizzare l' usebackqopzione su for:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

E se è necessario utilizzare il reindirizzamento dell'output o il piping dei comandi, utilizzare escape char ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f

3
Almeno per alcuni comandi, la variabile del file deve essere racchiusa tra virgolette doppie.
Jirka,

1
Perché è /fnecessario dopo il for? Secondo i documenti di aiuto, il /fflag si apre e legge ogni file. È necessario ripetere l'eco o rinominare i file?
Snekse,

17
Il /fdopo lo FORlimita ai file. Allo stesso modo, si /dlimita alle directory (cartelle) e /rindica che è ricorsivo.

3
+1 Questa è una risposta viva, continuamente curata; grazie molto.
Sabuncu,

4
Ho appena realizzato che devi usare le virgolette ... Invece di 'dir /b "c:\program files"'dovrebbe essere`dir /b "c:\program files"`
endavid

101

In alternativa, utilizzare:

forfiles /s /m *.png /c "cmd /c echo @path"

Il comando forfiles è disponibile in Windows Vista e versioni successive.


1
è stato difficile usare percorsi con spazi nella seconda shell cmd. Alla fine ho modificato% PATH% env var per completare il lavoro. Ma grazie. utile
twobob

70

Il metodo più semplice:

Dalla riga di comando, utilizzare:

for %f in (*.*) do echo %f

Da un file batch (raddoppia i segni di percentuale%):

for %%f in (*.*) do echo %%f

Da un file batch con la cartella specificata come primo parametro:

for %%f in (%1\*.*) do echo %%f

8
non solo più semplice, ma anche significativamente più elegante rispetto alla valutazione dir /Bdell'output con for.
syneticon-dj,

5
Aggiungi a / r prima di% f per richiamare le sottodirectory
PRMan

35

Uso

for /r path %%var in (*.*) do some_command %%var

con:

  • percorso è il percorso iniziale.
  • %% var è un identificatore.
  • *. * essendo una maschera di file O il contenuto di una variabile.
  • some_command è il comando da eseguire con il percorso e var concatenati come parametri.

2
Ottengo l'errore: %%var was unexpected at this time.puoi fare un esempio esatto? Ho provato un sacco di variazioni difor /r . %%var in (*.*) do echo %%var
hippietrail il

3
Per qualche strana ragione, il nome della variabile è limitato a un carattere.
ollb

2
Possiamo usare emoticon diverse per risultati diversi?
Silver Quettier,


-1

Avevo del malware che contrassegnava tutti i file in una directory come nascosto / sistema / sola lettura. Se qualcun altro si trova in questa situazione, cd nella directory ed eseguire for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.