Loop (Dateien & Ordner)

Ruft bestimmte Dateien oder Ordner nacheinander ab.

Neue Syntax [v1.1.21+]

Loop, Files, DateiMuster , Modus

Parameter

Files

Das direkt geschriebene Wort Files (nicht Groß-/Kleinschreibung-sensitiv). Dieser Parameter darf weder eine Variable noch ein Ausdruck sein.

DateiMuster

Name einer Datei oder eines Ordners oder ein Platzhaltermuster wie z.B. C:\Temp\*.tmp. Wenn kein absoluter Pfad angegeben ist, wird DateiMuster im A_WorkingDir-Verzeichnis vermutet.

Als Platzhalter werden sowohl Sternchen als auch Fragezeichen unterstützt. Eine Übereinstimmung erfolgt, wenn das Suchmuster entweder im langen/normalen Namen oder 8.3-Kurznamen der Datei erscheint.

Wenn dieser Parameter eine einzelne Datei oder ein einzelner Ordner ist (also ohne Platzhalter) und enthält Modus ein R, werden mehrere Übereinstimmungen gefunden, wenn der angegebene Dateiname in mehreren Ordnern vorkommt.

Suchmuster länger als 259 Zeichen können aufgrund von Systemlimitierungen (MAX_PATH) dazu führen, dass keine Dateien gefunden werden. Diese Limitierung kann mit dem Langer-Pfad-Präfix \\?\ umgangen werden, allerdings sind dabei einige Besonderheiten zu beachten.

Modus

Wenn leer oder weggelassen, werden nur Dateien einbezogen und Unterverzeichnisse nicht rekursiv durchwandert. Andernfalls geben Sie einen oder mehrere der folgenden Buchstaben an:

Alte Syntax

Veraltet: Diese Syntax ist nicht für neue Skripte empfohlen. Verwenden Sie stattdessen die oben beschriebene neue Syntax.

Loop, DateiMuster , OrdnerEinbeziehen, Rekursiv

Parameter

DateiMuster

Name einer Datei oder eines Ordners oder ein Platzhaltermuster wie z.B. C:\Temp\*.tmp. Wenn kein absoluter Pfad angegeben ist, wird DateiMuster im A_WorkingDir-Verzeichnis vermutet.

Als Platzhalter werden sowohl Sternchen als auch Fragezeichen unterstützt. Eine Übereinstimmung erfolgt, wenn das Suchmuster entweder im langen/normalen Namen oder 8.3-Kurznamen der Datei erscheint.

Wenn dieser Parameter eine einzelne Datei oder ein einzelner Ordner ist (also ohne Platzhalter) und enthält Rekursiv eine 1, werden mehrere Übereinstimmungen gefunden, wenn der angegebene Dateiname in mehreren Ordnern vorkommt.

OrdnerEinbeziehen

Wenn leer oder weggelassen, wird standardmäßig 0 verwendet. Andernfalls geben Sie eine der folgenden Ziffern an:

Rekursiv

Wenn leer oder weggelassen, wird standardmäßig 0 verwendet. Andernfalls geben Sie eine der folgenden Ziffern an:

Sondervariablen innerhalb einer Datei-Schleife

Die folgenden Variablen können innerhalb einer Datei-Schleife verwendet werden. Wenn eine innere Datei-Schleife von einer äußeren Datei-Schleife umschlossen ist, hat die Datei der innersten Schleife Vorrang:

Variable Beschreibung
A_LoopFileName Der aktuell abgerufene Name der Datei oder des Ordners (ohne Pfad).
A_LoopFileExt Die Dateiendung (z.B. TXT, DOC oder EXE). Der Punkt (.) ist nicht enthalten.
A_LoopFileFullPath
A_LoopFilePath

Der aktuell abgerufene Pfad und Name der Datei oder des Ordners. Wenn DateiMuster einen relativen anstelle eines absoluten Pfades enthält, wird der Pfad in dieser Variable ebenfalls relativ sein. Wenn der 8.3-Kurzname eines Ordners in DateiMuster angegeben ist, wird er in dieser Variable ebenfalls kurz sein (siehe nächster Punkt, wie die lange Version ermittelt werden kann).

In [v1.1.28+] kann A_LoopFilePath als Alias von A_LoopFileFullPath (was eine Fehlbenennung ist) verwendet werden.

A_LoopFileLongPath

Diese Variable unterscheidet sich wie folgt von A_LoopFileFullPath: 1) Sie enthält immer den absoluten/kompletten Pfad der Datei, auch dann, wenn DateiMuster einen relativen Pfad enthält; 2) 8.3-Kurznamen von Ordnern in DateiMuster werden in ihre lange Version umgewandelt; 3) Alle Buchstaben in DateiMuster werden in Groß- oder Kleinbuchstaben umgewandelt, abhängig von der ursprünglichen Groß-/Kleinschreibung im Dateisystem. Dies ist nützlich, um Dateinamen, die z.B. als Befehlszeilenparameter an das Skript übergeben wurden, in ihre exakten Pfadnamen umzuwandeln, wie vom Explorer angezeigt.

A_LoopFileShortPath

Der aktuell abgerufene 8.3-Kurzpfad und -name der Datei oder des Ordners. Zum Beispiel: C:\MEINED~1\ADRESS~1.TXT. Wenn DateiMuster einen relativen anstelle eines absoluten Pfades enthält, wird der Pfad in dieser Variable ebenfalls relativ sein.

Um den kompletten 8.3-Pfad und -Namen einer Datei oder eines Ordners abzurufen, gehen Sie wie folgt vor:

Loop, C:\Meine Dokumente\Adressliste.txt
    KurzPfadName := A_LoopFileShortPath

Hinweis: Diese Variable ist leer, wenn die Datei keinen Kurznamen hat. Dies kann z.B. passieren, wenn NtfsDisable8dot3NameCreation in der Registry gesetzt ist. Sie ist auch leer, wenn DateiMuster einen relativen Pfad enthält und der Schleifenkörper SetWorkingDir verwendet, um vom aktuellen Arbeitsverzeichnis der Schleife selbst wegzuschalten.

A_LoopFileShortName Der 8.3-Kurzname oder alternative Name der Datei. Wenn die Datei keinen solchen Namen hat (weil der lange Name kürzer als der 8.3-Kurzname ist, oder vielleicht weil die Kurznamengenerierung auf einem NTFS-Dateisystem deaktiviert ist), wird stattdessen A_LoopFileName abgerufen.
A_LoopFileDir Der Pfad des Verzeichnisses, in dem sich A_LoopFileName befindet. Wenn DateiMuster einen relativen anstelle eines absoluten Pfades enthält, wird der Pfad in dieser Variable ebenfalls relativ sein. Ein Stammverzeichnis wird keinen umgekehrten Schrägstrich enthalten. Zum Beispiel: C:
A_LoopFileTimeModified Der Zeitpunkt, wann die Datei geändert wurde. YYYYMMDDHH24MISS-Format.
A_LoopFileTimeCreated Der Zeitpunkt, wann die Datei erstellt wurde. YYYYMMDDHH24MISS-Format.
A_LoopFileTimeAccessed Der Zeitpunkt, wann auf die Datei zugegriffen wurde. YYYYMMDDHH24MISS-Format.
A_LoopFileAttrib Die Attribute der aktuell abgerufenen Datei.
A_LoopFileSize Die Größe in Bytes der aktuell abgerufenen Datei. Dateien größer als 4 Gigabyte werden unterstützt.
A_LoopFileSizeKB Die Größe in Kilobytes der aktuell abgerufenen Datei, abgerundet auf den nächsten Integer.
A_LoopFileSizeMB Die Größe in Megabytes der aktuell abgerufenen Datei, abgerundet auf den nächsten Integer.

Bemerkungen

Eine Datei-Schleife ist nützlich, wenn mehrere Dateien und/oder Ordner nacheinander abgearbeitet werden sollen.

Alle gefundenen Dateien werden abgerufen, auch versteckte Dateien. OS-Features wie der DIR-Befehl ignorieren hingegen standardmäßig versteckte Dateien. Um versteckte, systemspezifische und/oder schreibgeschützte Dateien innerhalb einer Schleife zu überspringen, kann z.B. Folgendes verwendet werden:

if A_LoopFileAttrib contains H,R,S  ; Jede Datei überspringen, die H (versteckt), R (schreibgeschützt) oder S (systemspezifisch) ist. Achtung: Keine Leerzeichen in "H,R,S".
    continue  ; Diese Datei überspringen und zur nächsten übergehen.

Um bei einer rekursiven Suche relative statt absolute Dateipfade abzurufen, ändern Sie den Basisordner mit SetWorkingDir, bevor Sie die Schleife verwenden, und lassen Sie dann den Pfad bei der Schleife weg (z.B. Loop, *.*, 0, 1). Dies hat zur Folge, dass A_LoopFileFullPath einen Dateipfad enthält, der relativ zum Basisordner ist.

Eine Datei-Schleife kann sich selbst unterbrechen, wenn sie Dateien oder Ordner innerhalb ihres eigenen Geltungsbereichs erstellt oder umbenennt. Verwendet die Schleife z.B. FileMove, um Dateien umzubenennen, könnten solche Dateien zweimal gefunden werden: Einmal mit dem alten Namen und ein weiteres Mal mit dem neuen Namen. Um das zu umgehen, erstellen Sie zuerst eine Liste von Dateien, bevor Sie sie umbenennen. Zum Beispiel:

DateiListe := ""
Loop, Files, *.jpg
    DateiListe .= A_LoopFileName "`n"
Loop, Parse, DateiListe, `n
    FileMove, %A_LoopField%, umbenannt_%A_LoopField%

Dateien in einem NTFS-Dateisystem werden wahrscheinlich immer in alphabetischer Reihenfolge abgerufen. Bei anderen Dateisystemen ist die Reihenfolge unbestimmt. Um eine bestimmte Reihenfolge festzulegen, verwenden Sie den Sort-Befehl, wie im Beispielabschnitt unten gezeigt.

Dateimuster länger als 259 Zeichen werden nur in den Unicode-Versionen von AutoHotkey [v1.1.31+] unterstützt, zumindest wenn eine der folgenden Bedingungen erfüllt ist:

In allen anderen Fällen werden Dateimuster länger als 259 Zeichen keine Dateien oder Ordner finden. Diese Limitierung gilt sowohl für DateiMuster als auch für alle temporären Muster, die beim rekursiven Durchwandern eines Unterordners verwendet werden. In [v1.1.31+] kann die kombinierte Länge von Verzeichnis und Dateiname jeder Datei jedoch 259 Zeichen überschreiten; in älteren Versionen werden solche Dateien einfach übersprungen, als würden sie nicht existieren.

Auf der Loop-Seite finden Sie Informationen zu Blöcken, Break, Continue und A_Index (die in jeder Schleifenvariante verwendet werden kann).

Die Befehle FileGetAttrib, FileGetSize, FileGetTime, FileGetVersion, FileSetAttrib und FileSetTime können in einer Datei-Schleife ohne ihren DateiName/DateiMuster-Parameter verwendet werden.

Loop, Break, Continue, Blöcke, SplitPath, FileSetAttrib, FileSetTime

Beispiele

Meldet den vollständigen Pfad jeder Textdatei, die sich in einem Verzeichnis und in dessen Unterverzeichnissen befindet.

Loop Files, %A_ProgramFiles%\*.txt, R  ; Unterordner rekursiv durchwandern.
{
    MsgBox, 4, , Dateiname = %A_LoopFileFullPath%`n`nWeiter?
    IfMsgBox, No
        break
}

Berechnet die Größe eines Ordners mitsamt der Dateien in seinen Unterordnern.

SetBatchLines, -1  ; Die Operation so schnell wie möglich ausführen.
OrdnerGrößeKB := 0
FileSelectFolder, WelcherOrdner  ; Benutzer einen Ordner auswählen lassen.
Loop, Files, %WelcherOrdner%\*.*, R
    OrdnerGrößeKB += A_LoopFileSizeKB
MsgBox %WelcherOrdner% ist %OrdnerGrößeKB% KB groß.

Ruft Dateinamen ab, sortiert nach Name (siehe nächstes Beispiel, wie nach Datum sortiert werden kann).

DateiListe := ""  ; Als leere Variable initialisieren.
Loop, C:\*.*
    DateiListe .= A_LoopFileName "`n"
Sort, DateiListe, R  ; Die R-Option sortiert in umgekehrter Richtung. Siehe Sort für weitere Optionen.
Loop, parse, DateiListe, `n
{
    if (A_LoopField = "")  ; Das leere Element am Ende der Liste ignorieren.
        continue
    MsgBox, 4,, Datei Nr. %A_Index% ist %A_LoopField%.  Weiter?
    IfMsgBox, No
        break
}

Ruft Dateinamen ab, sortiert nach Änderungsdatum.

DateiListe := ""
Loop, Files, %A_MyDocuments%\Fotos\*.*, FD  ; Dateien und Ordner einbeziehen
    DateiListe .= A_LoopFileTimeModified "`t" A_LoopFileName "`n"
Sort, DateiListe  ; Nach Datum sortieren.
Loop, Parse, DateiListe, `n
{
    if (A_LoopField = "")  ; Den letzten Zeilenvorschub (leere Element) am Ende der Liste ignorieren.
        continue
    StringSplit, DateiElement, A_LoopField, %A_Tab%  ; Bei einem Tab-Zeichen in zwei Teile aufteilen.
    MsgBox, 4,, Die nächste Datei ist (geändert am %DateiElement1%):`n%DateiElement2%`n`nWeiter?
    IfMsgBox, No
        break
}

Kopiert nur Quelldateien ins Ziel, die neuer sind als ihr Gegenstück.

KopierenWennNeuer:
; Der Aufrufer hat die Variablen KopieQuelleMuster und KopieZiel für uns gesetzt.
Loop, Files, %KopieQuelleMuster%
{
    Kopieren := false
    if not FileExist(KopieZiel "\" A_LoopFileName)  ; Immer kopieren, wenn Zieldatei noch nicht existiert.
        Kopieren := true
    else
    {
        FileGetTime, Zeit, %KopieZiel%\%A_LoopFileName%
        EnvSub, Zeit, %A_LoopFileTimeModified%, seconds  ; Zeit der Quelldatei von der Zeit der Zieldatei subtrahieren.
        if (Zeit < 0)  ; Quelldatei ist neuer als Zieldatei.
            Kopieren := true
    }
    if Kopieren
    {
        FileCopy, %A_LoopFileFullPath%, %KopieZiel%\%A_LoopFileName%, 1   ; Kopieren und bei Bedarf überschreiben
        if ErrorLevel
            MsgBox, "%A_LoopFileFullPath%" konnte nicht nach "%KopieZiel%\%A_LoopFileName%" kopiert werden.
    }
}
Return

Wandelt Dateinamen, die via Befehlszeilenparameter übergeben wurden, in lange Namen um, mit vollständigem Pfad und korrekter Groß-/Kleinschreibung, wie im Dateisystem gespeichert.

Loop %0%  ; Für jede Datei, die auf das Skript abgelegt wurde (oder als Parameter übergeben wurde).
{
    EingabePfad := %A_Index%  ; Nächsten Befehlszeilenparameter abrufen.
    Loop %EingabePfad%, 1
        LangerPfad := A_LoopFileLongPath
    MsgBox Der lange Pfadname mit korrekter Groß-/Kleinschreibung der Datei`n%EingabePfad%`nist:`n%LangerPfad%
}