453 Stimmen

Alle Dateien in einem Verzeichnis mit einer 'for'-Schleife durchlaufen

Wie kann ich über jede Datei in einem Verzeichnis iterieren, indem ich eine for Schleife?

Und wie kann ich feststellen, ob es sich bei einem bestimmten Eintrag um ein Verzeichnis oder nur um eine Datei handelt?

620voto

jop Punkte 80065

Dies listet alle Dateien (und nur diese) im aktuellen Verzeichnis auf:

for /r %i in (*) do echo %i

Auch wenn Sie diesen Befehl in einer Batch-Datei ausführen, müssen Sie die %-Zeichen verdoppeln.

for /r %%i in (*) do echo %%i

(danke @agnul)

258voto

Marco Punkte 2593

Iterieren Sie durch...

  • ...Dateien im aktuellen Verzeichnis: for %f in (.\*) do @echo %f
  • ...Unterverzeichnisse im aktuellen Verzeichnis: for /D %s in (.\*) do @echo %s
  • ...Dateien im aktuellen und allen Unterverzeichnissen: for /R %f in (.\*) do @echo %f
  • ...Unterverzeichnisse im aktuellen und allen Unterverzeichnissen: for /R /D %s in (.\*) do @echo %s

Leider habe ich keine Möglichkeit gefunden, gleichzeitig über Dateien und Unterverzeichnisse zu iterieren.

Verwenden Sie einfach cygwin mit seiner Bash für viel mehr Funktionalität.

Davon abgesehen: Ist Ihnen aufgefallen, dass die Buildin-Hilfe von MS Windows eine hervorragende Quelle für Beschreibungen der Befehlszeilensyntax von cmd ist?

Schauen Sie auch hier nach: http://technet.microsoft.com/en-us/library/bb490890.aspx

133voto

Aaron Votre Punkte 1392

Um jede Datei zu durchlaufen, kann eine for-Schleife verwendet werden:

for %%f in (directory\path\*) do ( something_here )

In meinem Fall wollte ich auch den Inhalt der Datei, den Namen usw.

Dies führte zu einigen Problemen, und ich dachte, mein Anwendungsfall könnte helfen. Hier ist eine Schleife, die Informationen aus jeder '.txt'-Datei in einem Verzeichnis liest und Ihnen erlaubt, etwas damit zu tun (setx zum Beispiel).

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

*Einschränkung: val<=%%f liefert nur die erste Zeile der Datei.

67voto

aphoria Punkte 19108

Es gibt einen feinen Unterschied zwischen dem Laufen FOR von der Befehlszeile und von einer Batch-Datei aus. In einer Stapeldatei müssen Sie zwei % Zeichen vor jeder Variablenreferenz.

Von einer Befehlszeile aus:

FOR %i IN (*) DO ECHO %i

Aus einer Batch-Datei:

FOR %%i IN (*) DO ECHO %%i

45voto

Jay Punkte 1605

Diese for-Schleife listet alle Dateien in einem Verzeichnis auf.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims=" ist nützlich, um lange Dateinamen mit Leerzeichen darin anzuzeigen....

'/b" zeigt nur die Namen, nicht die Größenangaben usw. an.

Einige Dinge, die man über dir's /a Argument wissen sollte.

  • Jede Verwendung von "/a" würde alles auflisten, auch versteckte und Systemattribute.
  • "/ad" würde nur Unterverzeichnisse anzeigen, auch versteckte und Systemverzeichnisse.
  • Das Argument "/a-d" eliminiert den Inhalt mit dem Attribut "D" (Verzeichnis).
  • "/a-d-h-s" zeigt alles an, nur keine Einträge mit den Attributen 'D'irectory, 'H'idden 'S'ystem.

Wenn Sie dies auf der Kommandozeile verwenden, entfernen Sie ein "%".

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X