Frage

Wie kann ich über jede Datei in einem Verzeichnis durchlaufen eine for Schleife?

Und wie könnte ich feststellen, ob ein bestimmte Eintrag ein Verzeichnis ist oder ob es nur eine Datei?

War es hilfreich?

Lösung

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

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

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

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

(dank @agnul)

Andere Tipps

Iteration durch ...

  • ... Dateien im aktuellen Verzeichnis: for %f in (.\*) do @echo %f
  • ... subdirs in aktuellem Verzeichnis: for /D %s in (.\*) do @echo %s
  • ... Dateien in aktuellen und alle subdirs: for /R %f in (.\*) do @echo %f
  • ... subdirs in aktuellen und alle subdirs: for /R /D %s in (.\*) do @echo %s

Leider habe ich keine Möglichkeit finden, um über Dateien und subdirs zugleich laufen.

Verwenden Sie einfach Cygwin mit bash viel mehr Funktionen.

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

haben Sie auch einen Blick hier: http://technet.microsoft.com/ en-us / library / bb490890.aspx

Es gibt einen feinen Unterschied FOR von der Kommandozeile und aus einer Batch-Datei zwischen ausgeführt wird. In einer Batch-Datei benötigen Sie zwei % Zeichen vor jedem Variablen Bezug zu setzen.

Von einer Befehlszeile:

FOR %i IN (*) DO ECHO %i

Von einer Batch-Datei:

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

über jede Datei ein iterieren for-Schleife funktioniert:

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

In meinem Fall wollte ich auch den Dateiinhalt, Namen, etc.

Dies führt zu einem paar Fragen, und ich dachte, mein Anwendungsfall helfen könnte. Hier ist eine Schleife, die Informationen von jeder ‚.txt‘ Datei in einem Verzeichnis liest und ermöglicht es Ihnen, tun etwas mit ihm (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 wird nur die erste Zeile der Datei erhalten

Diese for-Schleife werden alle Dateien in einem Verzeichnis aufzulisten.

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

"delims =" ist nützlich, lange Dateinamen mit Leerzeichen in ihm zu zeigen ....

'/ b“zeigt nur die Namen, nicht Größe Daten etc ..

Einige Dinge über dir / der ein Argument kennen.

  • Jede Verwendung von „/ a“ würde Liste alles, einschließlich versteckte und Systemattribute.
  • "/ ad" würde nur Unterverzeichnisse zeigen, einschließlich versteckt und System diejenigen.
  • "/ a-d" Argument eliminiert Inhalt mit ‚D'irectory Attribute.
  • "/ a-d-h-s" alles zeigen, aber Einträge mit 'D'irectory,' H'idden ‚S'ystem Attribute.

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

Hope, das hilft.

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

Versuchen Sie folgendes:

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

Versuchen Sie "HELP FOR" in cmd für eine vollständige Anleitung

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

Der folgende Code erstellt eine Datei mit dem Namen „AllFilesInCurrentDirectorylist.txt“ im aktuellen Verzeichnis, das die Liste aller Dateien (nur Dateien) im aktuellen Verzeichnis enthält. Check it out

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

Es könnte auch nutzen die forfiles Befehl:

forfiles /s 

und auch prüfen, ob es ein Verzeichnis

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

würde ich vbscript (Windows Scripting Host) verwenden, da in Batch ich sicher bin, kann man nicht sagen, dass ein Name einer Datei oder ein Verzeichnis ist.

In vbs, kann es so etwas wie diese:

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 Filesystem auf MSDN .

Ich verwende den Befehl xcopy mit der Option / L, um die Dateinamen zu bekommen. Also, wenn Sie entweder ein Verzeichnis oder alle Dateien in das Unterverzeichnis erhalten möchten können Sie etwas tun:

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

Ich verwende nur die c: \ als Ziel, weil es auf Windows-Systemen immer vorhanden ist, und es ist das Kopieren nicht so spielt es keine Rolle. wenn Sie die Unterordner haben wollen, verwenden nur Option / s am Ende. Sie können auch die anderen Schalter von xcopy verwenden, wenn man sie aus anderen Gründen benötigen.

Versuchen Sie, dies 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 wird Ihnen nur sagen, ob eine Datei kein Verzeichnis ist, das auch wahr ist, wenn die Datei nicht existiert, so sicher sein, für das erste zu überprüfen, ob Sie benötigen. Die Carets (^) verwendet, um die Umleitung Symbole zu entkommen und die Dateiliste Ausgabe auf NUL umgeleitet wird, damit er nicht angezeigt wird, während die Fehlerausgabe des DIR-Eintrag an den Ausgang weitergeleitet wird, so dass Sie gegen DIR-Nachricht testen „Datei nicht gefunden “.

versuchen Sie 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

zählt .msi und EXE-Dateien im Verzeichnis (und im Unterverzeichnis). So macht es auch den Unterschied zwischen Ordnern und Dateien als ausführbare Dateien.

Fügen Sie einfach eine Verlängerung (.pptx .docx ..), wenn Sie andere Dateien in der Schleife müssen filtern

In meinem Fall hatte ich die Dateien und Ordner alle unter einem temporären Ordner zu löschen. Also das ist, wie ich es tun endete. Ich hatte zwei Schleifen eine für Datei und eine für Ordner ausgeführt werden. Wenn Dateien oder Ordner Leerzeichen im Namen haben, dann müssen Sie "„

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"
)

durchlaufen alle Dateien und Ordner können Sie

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

durchlaufen alle Ordner nur nicht mit Dateien, dann können Sie

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

Wo /s werden alle Ergebnisse im gesamten Verzeichnisbaum in unbegrenzter Tiefe. Sie können /s überspringen, wenn Sie durch den Inhalt des Ordners nicht ihr Unterverzeichnis

iterieren wollen

Die Implementierung Suche in Iteration

durchlaufen eine bestimmte benannte Dateien und Ordner Sie nach dem Namen suchen und iterieren for-Schleife mit

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

iterieren durch einen bestimmten Namen Ordner / Verzeichnisse und Dateien nicht , dann /AD im selben Befehl

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

Ich hatte Probleme jop Antwort bekommen mit einem absoluten Pfad zu arbeiten, bis ich diese Referenz gefunden: https: / /ss64.com/nt/for_r.html

Das folgende Beispiel durchläuft alle Dateien in einem Verzeichnis, das von dem absoluten Pfad angegeben.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top