Wie man mit einem Batch-Skript etwas mit jeder Datei in einem Verzeichnis macht

265

Wie iteriert man über jede Datei in einem Verzeichnis mit einer .bat- oder .cmd-Datei?

Geben Sie der Einfachheit halber eine Antwort an, die nur den Dateinamen oder den Dateipfad wiedergibt.

Brian R. Bondy
quelle

Antworten:

348

Befehlszeilenverwendung:

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

Verwendung von Batchdateien:

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

Update : Wenn das Verzeichnis Dateien mit Leerzeichen in den Namen enthält, müssen Sie das vom for /fBefehl verwendete Trennzeichen ändern . Sie können beispielsweise das Pipe-Zeichen verwenden.

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

Update 2 : (schnell anderthalb Jahre nach der ursprünglichen Antwort :-)) Wenn der Verzeichnisname selbst ein Leerzeichen im Namen enthält, können Sie die usebackqOption auf for:

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

Wenn Sie die Ausgabeumleitung oder die Befehlsleitung verwenden müssen, verwenden Sie das Escapezeichen char ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Franci Penov
quelle
3
Zumindest für einige Befehle sollte die Dateivariable in doppelte Anführungszeichen gesetzt werden.
Jirka
1
Warum wird das /fnach dem benötigt for? Gemäß den Hilfedokumenten wird das /fFlag geöffnet und jede Datei gelesen. Wird das benötigt, um Dateien zu wiederholen oder umzubenennen?
Snekse
17
Das /fAfter FORbeschränkt es auf Dateien. In ähnlicher Weise /deinengt auf Verzeichnisse (Ordner) und /rinstruiert es rekursiv sein.
3
+1 Dies ist eine lebendige Antwort, die ständig beachtet wird. Danke vielmals.
Sabuncu
4
'dir /b "c:\program files"'`dir /b "c:\program files"`
Ich habe
101

Alternativ können Sie Folgendes verwenden:

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

Der Befehl forfiles ist in Windows Vista und höher verfügbar.

Paul Houx
quelle
1
Es war schwierig, Pfade mit Leerzeichen in der 2. cmd-Shell zu verwenden. Am Ende habe ich% PATH% env var angepasst, um die Arbeit zu erledigen. Aber danke. hilfreich
twobob
70

Einfachste Methode:

Verwenden Sie in der Befehlszeile:

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

Aus einer Batch-Datei (verdoppeln Sie die Prozentzeichen):

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

Aus einer Batch-Datei mit dem als 1. Parameter angegebenen Ordner:

for %%f in (%1\*.*) do echo %%f
Gordon Bell
quelle
8
nicht nur am einfachsten, sondern auch deutlich eleganter im Vergleich zur Auswertung der dir /BAusgabe mit for.
Syneticon-DJ
5
Fügen Sie ein / r vor dem% f hinzu, um Unterverzeichnisse zu rekursieren
PRMan
35

Verwenden

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

mit:

  • Pfad ist der Startpfad.
  • %% var ist eine Kennung.
  • *. * ist eine Dateimaske ODER der Inhalt einer Variablen.
  • some_command ist der Befehl, der ausgeführt werden soll, wobei path und var als Parameter verkettet sind.
mstrobl
quelle
2
Ich erhalte die Fehlermeldung: %%var was unexpected at this time.Können Sie ein genaues Beispiel geben? Ich habe eine Reihe von Variationen vonfor /r . %%var in (*.*) do echo %%var
Hippietrail
3
Aus irgendeinem seltsamen Grund ist der Variablenname auf ein Zeichen beschränkt.
ollb
2
Können wir unterschiedliche Smileys für unterschiedliche Ergebnisse verwenden?
Silver Quettier
8

Ein anderer Weg:

for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
Distelknoten
quelle
Wofür steht "~ nf"?
Spieler0
@JudgeDredd "%~nf"steht für den Namen der Datei ohne Erweiterung, wobei fder Name der teilweise angegebenen Variablen ist for. Docs: docs.microsoft.com/en-us/previous-versions/windows/it-pro/…
Alph.Dev
-1

Ich hatte Malware, die alle Dateien in einem Verzeichnis als versteckt / system / schreibgeschützt markierte. Wenn sich jemand in dieser Situation befindet, CD in das Verzeichnis und ausführen for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Anon
quelle