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?
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)
Durchlaufen ...
for %f in (.\*) do @echo %f
for /D %s in (.\*) do @echo %s
for /R %f in (.\*) do @echo %f
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
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
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.
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.
Wenn Sie dies in der Befehlszeile verwenden, entfernen Sie ein "%".
Hoffe das hilft.
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.
% 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
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/
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
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 .
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.
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
)
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
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"
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 ".
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"
)
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
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