wake-up-neo.com

Iteriere alle Dateien in einem Verzeichnis mit einer 'for' Schleife

Wie kann ich jede Datei in einem Verzeichnis mit einer for-Schleife durchlaufen?

Und wie kann ich feststellen, ob ein bestimmter Eintrag ein Verzeichnis ist oder ob es sich nur um eine Datei handelt?

289
Vhaerun

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

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

Wenn Sie diesen Befehl in einer Batchdatei ausführen, müssen Sie die% -Zeichen verdoppeln. 

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

(Danke, @agnul) 

417
jop

Durchlaufen ...

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

Leider habe ich keine Möglichkeit gefunden, Dateien und Unterverzeichnisse gleichzeitig zu durchlaufen.

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

Abgesehen davon: Haben Sie festgestellt, dass die integrierte Hilfe von MS Windows eine großartige Ressource für Beschreibungen der Befehlszeilensyntax von cmd ist?

Schauen Sie auch hier nach: http://technet.Microsoft.com/de-de/library/bb490890.aspx

193
Marco

Es gibt einen geringfügigen Unterschied zwischen der Ausführung von FOR von der Befehlszeile und einer Stapeldatei. In einer Batchdatei müssen Sie vor jeder Variablenreferenz zwei %-Zeichen eingeben.

Von einer Befehlszeile aus:

FOR %i IN (*) DO ECHO %i

Aus einer Batchdatei:

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

m über jede Datei zu iterieren, funktioniert eine for-Schleife:

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

In meinem Fall wollte ich auch den Dateiinhalt, 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 es Ihnen ermöglicht, etwas damit zu tun (z. B. setx).

@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 ruft nur die erste Zeile der Datei ab.

52
Aaron Votre

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 anzuzeigen.

'/ b "zeigt nur Namen, keine Datumsangaben usw.

Einige Dinge, die Sie über ein Argument wissen sollten.

  • Jede Verwendung von "/ a" würde alles auflisten, einschließlich verborgener und Systemattribute.
  • "/ ad" würde nur Unterverzeichnisse anzeigen, einschließlich versteckter und systembezogener.
  • "/ a-d" -Argument beseitigt Inhalt mit 'D'-Verzeichnisattribut.
  • "/ a-d-h-s" zeigt alles, aber Einträge mit 'D'irectory', 'H'idden' Systemattribut.

Wenn Sie dies in der Befehlszeile verwenden, entfernen Sie ein "%".

Hoffe das hilft.

40
Jay

In Bash könnten Sie so etwas tun:

for fn in *; do
    if [ -d $fn ]; then
        echo "$fn is a directory"
    fi
    if [ -f $fn ]; then
        echo "$fn is a file"
    fi
done

Ich habe gerade bemerkt, dass Sie nach batch gefragt haben, was ich als bash missverstanden habe. Diese Antwort ist daher möglicherweise für Ihre Frage nicht geeignet.

11
Greg Hewgill

% 1 bezieht sich auf das erste übergebene Argument und kann nicht in einem Iterator verwendet werden.

Versuche dies: 

@echo off
for %%i in (*.*) do echo %%i
10
Sam Meldrum
for %1 in (*.*) do echo %1

Versuchen Sie "HELP FOR" in cmd, um eine vollständige Anleitung zu erhalten

Dies ist die Anleitung für XP -Befehle. http://www.ss64.com/nt/

5
Axeman

Der folgende Code erstellt eine Datei mit dem Namen"AllFilesInCurrentDirectorylist.txt"im aktuellen Verzeichnis, die die Liste aller Dateien (Nur Dateien) im aktuellen Verzeichnis enthält. Hör zu

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
3
Ankur

Ich würde vbscript (Windows Scripting Host) verwenden, da ich im Batch sicher nicht erkennen kann, dass ein Name eine Datei oder ein Verzeichnis ist.

In vbs kann es ungefähr so ​​sein:

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

Überprüfen Sie FileSystemObject in MSDN .

2
Biri

Ich benutze den Befehl xcopy mit der Option/L, um die Dateinamen abzurufen. Wenn Sie also entweder ein Verzeichnis oder alle Dateien im Unterverzeichnis abrufen möchten, können Sie Folgendes tun:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

Ich benutze einfach c:\als Ziel, weil es auf Windows-Systemen immer vorhanden ist und nicht kopiert wird. Wenn Sie auch die Unterverzeichnisse möchten, verwenden Sie einfach die Option/s am Ende. Sie können auch die anderen Schalter von xcopy verwenden, wenn Sie sie aus anderen Gründen benötigen. 

2
Knoots

Ich hatte Probleme damit, Jops Antwort mit einem absoluten Pfad zu bearbeiten, bis ich diesen Verweis fand: https://ss64.com/nt/for_r.html

Das folgende Beispiel durchläuft alle Dateien in einem Verzeichnis, das durch den absoluten Pfad angegeben wird.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
2
datchung

versuche dies:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

es zählt MSI- und EXE-Dateien in Ihrem Verzeichnis (und im Unterverzeichnis). Es macht also auch den Unterschied zwischen Ordnern und Dateien als ausführbare Dateien.

Fügen Sie einfach eine Erweiterung (.pptx .docx ..) hinzu, wenn Sie andere Dateien in der Schleife filtern möchten

2
Littlepony

Es könnte auch den Befehl forfiles verwenden:

forfiles /s 

und prüfen Sie auch, ob es sich um ein Verzeichnis handelt 

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
2
Max

Versuchen Sie Folgendes, um zu testen, ob eine Datei ein Verzeichnis ist:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

Dies gibt nur an, ob eine Datei KEIN Verzeichnis ist. Dies gilt auch, wenn die Datei nicht vorhanden ist. Überprüfen Sie daher unbedingt zuerst, ob dies erforderlich ist. Die Einfügemarken (^) werden verwendet, um die Umleitungssymbole zu umgehen, und die Ausgabe der Dateiliste wird zu NUL umgeleitet, um zu verhindern, dass sie angezeigt wird. Die Fehlerausgabe der DIR-Liste wird zur Ausgabe umgeleitet, sodass Sie die DIR-Meldung "Datei nicht gefunden" testen können ".

2
sugerfunk

In meinem Fall musste ich alle Dateien und Ordner unter einem temporären Ordner löschen. So endete ich damit. Ich musste zwei Schleifen für Datei und eine für Ordner ausführen. Wenn Dateien oder Ordner Leerzeichen enthalten, müssen Sie "" verwenden.

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)
0
Sam B

Iterieren Sie alle Dateien und Ordner können Sie verwenden

for /F "delims=" %%a in ('dir /b /s') do echo %%a

Um nur durch alle Ordner iterieren nicht mit Dateien, können Sie verwenden

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

Dabei gibt /s alle Ergebnisse in der Verzeichnisstruktur in unbegrenzter Tiefe aus. Sie können /s überspringen, wenn Sie den Inhalt dieses Ordners und nicht dessen Unterordner durchlaufen möchten

Suche in Iteration implementieren

Um durch bestimmte benannte Dateien und Ordner iterieren können Sie nach dem Namen suchen und mit for-Schleife iterieren

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

Um eine bestimmte benannte Ordner/Verzeichnisse und keine Dateien durchlaufen}, dann verwenden Sie /AD im selben Befehl

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a
0
jafarbtech