Zweck:Schleifen in Batch-Dateien erstellen

 

Format:DO loop_control

commands

[ITERATE]

commands

[LEAVE [n]]

commands

ENDDO

 

Formate der Schleifensteuerung

 

DO count

DO FOREVER

DO varname = start TO end [BY step] [(command)]

DO WHILE condition [(command)]

DO UNTIL condition [(command)]

DO UNTIL DATETIME date time [(command)]

DO FOR n [SECONDS | MINUTES | HOURS] [(command)]

DO varname IN [range...] /D"directory" [/I:"text" /S[[+]n] /A:[[-|+]rhsadecijopt /O:[-]acdeginorstuz fileset [(command)]

DO varname IN [/T"delimiters"] /L stringset [(command)]

DO varname IN /C stringset [(command)]

DO varname IN /L stringset [(command)]

DO varname in /P command ... [(command)]

DO varname IN /Q stringset [(command)]

DO varname IN /Y arrayname [(command)]

DO varname IN @file [(command)]

 

count

Ganzzahl im Bereich [0,  9223372036854775807] oder eine interne Variable oder Variablenfunktion, die zu einem solchen Wert ausgewertet wird, die angibt, wie oft die Schleife ausgeführt wird.

varname

Die Umgebungsvariable, die den aktuellen Wert des Schleifenindexes oder den aktuellen Dateinamen oder die aktuelle Zeile einer Datei enthält. Dem Variablennamen darf kein %vorangestellt werden.

start, end, step

Ganzzahlen im Bereich [-9223372036854775807,  9223372036854775807] oder interne Variablen oder Variablenfunktionen, die zu solchen Werten ausgewertet werden und die Anzahl der Schleifenausführungen steuern.

condition

Ein bedingter Ausdruck, der bestimmt, ob die Schleife ausgeführt werden soll oder nicht

fileset

Ein Dateiname oder eine Liste von Dateinamen, möglicherweise unter Verwendung von Wildcards

stringset

Eine beliebige Menge von Zeichenketten. Wildcards werden nicht interpretiert.

file

Eine Datei, bei der jede Zeile eine Zeichenkette enthält, für die die Schleife ausgeführt werden soll

Bereich

Ein Datums-, Zeit-, Größen- oder Ausschlussbereich. Höchstens eines von jedem, in beliebiger Reihenfolge.

commands

Ein oder mehrere Befehle, die bei jedem Durchlauf der Schleife ausgeführt werden sollen. Wenn Sie mehrere Befehle verwenden, müssen diese durch Befehlstrennzeichen getrennt werden oder in separaten Zeilen stehen.

date

Das Datum der Schleifenbeendigung im ISO 8601-Format

time

Die Zeit der Schleifenbeendigung im Format 24-h hh:mm:ss

/A:

Attribut auswählen

/C

Schleife über jedes Zeichen im Ausdruck

/D "Verzeichnis"

Verzeichnis beginnen

/I "Text"

(Beschreibung abgleichen) Beschreibungsbereich.

/L(iteral)

Mitglieder der Menge sind Zeichenketten, keine Dateinamen

/O:... (Reihenfolge)

Reihenfolge sortieren

/P

Analysiert die Ausgabe des Befehls und speichert bei jeder Ausführung der Schleife dienächste Ausgabezeile in varname .

/Q

Wie /L, behandelt aber Argumente in doppelten Anführungszeichen (mit eingebettetem Leerzeichen) als ein einziges Argument.

/S

Führt die Schleife im aktuellen Verzeichnis und allen seinen Unterverzeichnissen aus.

 

Unterstützt erweiterte Wildcards, Bereiche und Include-Listen für die Menge. Verwenden Sie Wildcards mit Vorsicht auf LFN-Volumes; siehe LFN-Dateisuche für Details.

 

Verwendung

 

DO kann in Batchdateien, Aliasen oder an der Befehlszeileverwendet werden . Um sie in Aliasen oder an der Eingabeaufforderung zu verwenden, müssen Sie den DO in einer einzigen Zeile definieren und den Körper der DO-Schleife in eine Befehlsgruppe einschließen, die dem DO-Ausdruck folgt. (In einem einzeiligen DO gibt es keine ENDDO-Anweisung). Ein Beispiel:

 

do count=1 to 10 by 1 (echo count=%count)

 

Wenn das letzte Argument in der Zeile ein einzelnes (, ist ,wird es als Beginn einer Befehlsgruppe interpretiert. DO fügt die folgenden Zeilen an (in einer Batch-Datei) oder fordert Sie zu weiteren Eingaben auf (in der Befehlszeile), bis es ein abschließendes )erhält .

 

Wenn Sie DO auf einem LFN-Laufwerk verwenden, müssen Sie alle Dateinamen in Anführungszeichen setzen, die Leerzeichen oder Sonderzeichen enthalten. Die gleiche Einschränkung gilt für Namen, die in der DO-Variablen zurückgegeben werden, wenn Sie sie an TCC interne Befehle oder andere Befehle weitergeben, die die Zitierung von Dateinamen mit Leerzeichen erfordern. DO setzt die zurückgegebenen Namen nicht automatisch in Anführungszeichen, selbst wenn Sie Anführungszeichen im ursprünglichen Argument enthalten haben.

 

DO setzt vier interne Variablen:

 

%_do_dirsDie Anzahl der durchlaufenen Verzeichnisse (mit /S) für die aktuelle DO-Schleife. (D.h. verschachtelte DO's haben jeweils ihre eigenen _do_dirs, _do_files, _do_errors und _do_loop.)
%_do_filesDie Anzahl der Verzeichniseinträge (Dateien oder Unterverzeichnisse), die in der aktuellen DO-Schleife verarbeitet werden.
%_do_errorsDie Anzahl der Fehler für die aktuelle DO-Schleife.
%_do_loopWie oft wurde die aktuelle DO-Schleife bereits ausgeführt?

 

Arten von DO-Schleifen

 

DO kann zur Erstellung verschiedener Arten von Schleifen verwendet werden.

 

DO count, ist eine gezählte Schleife. Die Stapeldatei-Zeilen zwischen DO und ENDDO werden zählend wiederholt .

 

DO FOREVER erzeugt eine Endlosschleife. Sie müssen LEAVE oder GOTO verwenden , um eine solche Schleife zu verlassen.

 

DO varname= start TO end [BY step] ist vergleichbar mit einer "for-Schleife" in Programmiersprachen wie BASIC. DO erstellt eine Umgebungsvariable, varname, und setzt sie gleich dem Wert start. Wenn varname bereits in der Umgebung existiert, wirdsie überschrieben. DO beginnt dann den Schleifenprozess, indem es den Wert von varname mit dem Wert von end vergleicht. Wenn step positiv oder nicht angegeben ist und varname kleiner oder gleich endist , führt DO die Zeilen der Batchdatei bis zum ENDDO aus. Als nächstes addiert DO zum Wert von varname entweder den Wert von step, wenn BY step angegeben ist, oder 1, und wiederholt den Vergleichs- und Ausführungsprozess, bis varname größer als end ist . In diesem Beispiel werden die geraden Zahlen von 2 bis 20 angezeigt:

 

do i = 2 to 20 by 2

  echo %i

enddo

 

DO kann auch abwärts zählen, anstatt aufwärts. Wenn step negativ ist, wirdvarname bei jeder Schleife  um den absoluten Wert von step verringert, und die Schleife wird beendet, wenn varname kleiner als end ist. Um zum Beispiel die geraden Zahlen von 2 bis 20 in umgekehrter Reihenfolge anzuzeigen, ersetzen Sie die erste Zeile des obigen Beispiels durch:

 

do i = 20 to 2 by -2

 

DO WHILE condition wertet die Bedingung jedes Mal in der Schleife als bedingten Ausdruck aus , bevor die Schleife ausführt, und führt sie nur aus, wenn sie wahr ist. Wenn dieBedingung bei der ersten Ausführung von DOFALSCH ist , wird die Schleife nie ausgeführt.

 

DO UNTIL condition wertet die Bedingung jedes Mal nach der Ausführung der Schleife  als bedingten Ausdruck aus  und wiederholt die Schleife nur, wenn sie FALSE ist. Daher werden die Anweisungen innerhalb der Schleife immer mindestens einmal ausgeführt.

 

DO UNTIL DATETIME date time führt die Schleife so lange aus, bis das aktuelle Datum und die Uhrzeit gleich oder größer als das angegebene Datum (ISO-Format) und die Uhrzeit (24-Stunden-Format) sind. Das Datum und die Uhrzeit können entweder im Format JJJJ-MM-TT HH:MM:SS oder JJJJMMDDHHMMSS angegeben werden. (Das Datum und/oder die Uhrzeit kann eine Variable sein.)

 

DO FOR n SECONDS | MINUTES | HOURS führt die Schleife für die angegebene Zeitspanne aus.

 

DO varname IN fileset führt die Befehle zwischen DO und ENDDO aus, indem es eine Umgebungsvariable, varname, erstellt  und sie gleich jedem Dateinamen im fileset setzt , wobei Elemente ignoriert werden, die nicht mit Datei- oder Verzeichnisnamen übereinstimmen. Dies ist ähnlich wie die Menge, die im  FOR-Befehl  verwendet wird , aber sie kann nur Datei- und Verzeichnisnamen enthalten, nicht aber beliebige Textstrings. Wenn varname bereits in der Umgebung existiert, wird es überschrieben (anders als die Kontrollvariable in FOR). Ein Beispiel:

 

do x in *.txt

...

enddo

 

führt die Schleife einmal für jede . TXT-Datei im aktuellen Verzeichnis aus ; jedes Mal, wenn die Schleife durchlaufen wird,wird die Variable x auf den Namen der nächsten Datei gesetzt, die der Dateispezifikation entspricht. Die Reihenfolge der Treffer hängt vom Dateisystem ab und ist völlig unabhängig von den Eigenschaften der gefundenen Dateinamen.

 

Wenn Sie zwischen DO und ENDDO eine neue Datei erstellen, die in die Liste der Dateien aufgenommen werden könnte, kann sie in einer Iteration der DO-Schleife erscheinen oder auch nicht. Ob die neue Datei erscheint, hängt von ihrer physischen Position in der Verzeichnisstruktur ab, eine Bedingung, auf die TCC keine Kontrolle hat.

 

Um Datum, Zeit, Größe, Beschreibung oder Dateiausschlussbereiche für die Mengezu verwenden , platzieren Sie sie direkt vor dem/den Dateinamen, zum Beispiel:

 

do x in /[d9-1-2018,9-31-2018] *.txt

 

DO varname IN /L stringset führt die Befehle zwischen DO und ENDDO einmal für jedes Zeichenkettenliteral in stringset aus  und setzt varname der Reihe nach auf jedes.

 

DO varname IN /C stringset führt die Befehle zwischen DO und ENDDO einmal für jedes Zeichen in stringset aus(einschließlich Leer- und Sonderzeichen) und setztvarname auf jedes Zeichen.

 

DO varname IN @file führt die Befehle zwischen DO und ENDDO einmal für jede Zeile der Datei aus, wobei varname auf den Inhalt jeder Zeile gesetzt wird. Achten Sie auf Zeichen mit besonderer Bedeutung für TCCwie z. B. Umleitungs- und Piping-Symbole, in der Datei (verwenden Sie  bei Bedarf SETDOS /X).

 

Um die Schleife einmal für jede Textzeile in der Zwischenablage auszuführen, verwenden Sie CLIP: (oder CLIP0: - CLIP9:) als Dateinamen (z. B. DO X IN @CLIP:). CLIP: gibt keine Daten zurück, wenn die Zwischenablage keinen Text enthält. Siehe Umleitung für weitere Informationen über CLIP:.

 

Spezielle DO-Schlüsselwörter: ITERATE und LEAVE

 

Zwei spezielle Schlüsselwörter, ITERATE und LEAVE, können innerhalb einer DO / ENDDO-Schleife verwendet werden. ITERATE ignoriert die verbleibenden Befehle innerhalb der Schleife und kehrt für eine weitere Iteration an den Anfang der Schleife zurück, es sei denn, DO stellt fest, dass die Schleife beendet ist. LEAVE verlässt die aktuelle DO-Schleife und fährt mit dem auf ENDDO folgenden Befehl fort. Beide Schlüsselwörter können beliebig oft wiederholt werden. Sowohl ITERATE als auch LEAVE werden am häufigsten in einem  IF- oder  IFF-Befehl (Gruppe)verwendet :

 

do while "%var" != "%val1"

 ...

 if "%var" == "%val2" leave

enddo

 

LEAVE akzeptiert ein optionales numerisches Argument (>=1), das die DO-Schachtelungsebene angibt, die Sie verlassen wollen. LEAVE 2" verlässt zum Beispiel zwei verschachtelte DO-Schleifen. Optional können Sie eine Variable als LEAVE-Argument übergeben.

 

Hinweise zur Verwendung

 

Numeric input may be entered in either decimal format (a sequence of 0-9 digits) or in hexadecimal format ("0x" followed by a sequence of 0-F hex digits).

 

DO-Schleifen können verschachtelt werden, d.h. eine DO / ENDDO-Schleife kann innerhalb einer anderen DO / ENDDO-Schleife liegen.

 

Sie können alle DO / ENDDO-Schleifen in einer Batch-Datei verlassen, indem Sie GOTO bis zu einer Zeile nach dem entsprechenden ENDDO verwenden . Lesen Sie jedoch unbedingt die Vorsichtshinweise zu GOTO und DO unter dem  GOTO-Befehl, bevor Sie GOTO auf irgendeine andere Weise innerhalb einer DO-Schleife verwenden.

 

Sie können RETURN nicht verwenden , um innerhalb einer DO-Schleife aus einem GOSUB zurückzukehren .

 

Hinweis: Verwechseln Sie den DO-Befehl nicht mit dem nicht verwandten optionalen  do-Schlüsselwort des  FOR-Befehls.

 

Optionen:

 

/A:Wählen Sie die Dateien in einem DO x IN... nach dem/den angegebenen Attribut(en) aus. Siehe Attributschalter für Informationen über die Attribute, die auf /A: folgen können .

 

Sie können /A:=angeben , um einen Dialog anzuzeigen, der Sie bei der Einstellung einzelner Attribute unterstützt.

 

/CWeisen Sie für jede Schleife das nächste Zeichen (einschließlich Leer- und Sonderzeichen) im Ausdruck der DO-Variablen zu.

 

/D "directory"Legt das Startverzeichnis fest (zur Verwendung mit /S). /D unterstützt Windows-Shell-Ordnernamen; siehe CDD für Details.

 

/I "text"Wählt Dateien in einem DO x IN ... anhand desTextes in ihren Beschreibungen aus. Siehe Beschreibungsbereiche für Details.

 

/LDie Parameter nach DO x IN /L sind Zeichenketten, keine Dateinamen. Jeder Parameter wird der Reihe nach, von links nach rechts, der Schleifensteuervariablen bei aufeinanderfolgenden Durchläufen durch die Schleife zugewiesen. /L behandelt doppelte Anführungszeichen nicht als Begrenzungszeichen; verwenden Sie /Q, wenn Sie Argumente mit eingebetteten Leerzeichen übergeben wollen.

 

/NDeaktiviert Optionen:

 

dÜberspringen versteckter Verzeichnisse (bei Verwendung mit /S)
jÜberspringen von Verzweigungen (bei Verwendung mit /S)

 

/O:...Sortiert die Dateien vor der Verarbeitung.

 

Sie können eine beliebige Kombination der unten aufgeführten Sortieroptionen verwenden. Wenn mehrere Optionen verwendet werden, wird die Liste nach der ersten Sortieroption als Primärschlüssel, der nächsten als Sekundärschlüssel usw. sortiert:

 

nSortieren nach Dateiname und Erweiterung, sofern nicht  ausdrückliche angegeben ist.
-Umkehrung der Sortierreihenfolge für den nächsten Sortierschlüssel
aSortieren Sie Namen und Erweiterungen in der Standard-ASCII-Reihenfolge, anstatt numerisch, wenn der Name oder die Erweiterung numerische Teilzeichenfolgen enthält.
cSortieren nach Kompressionsverhältnis
dSortieren nach Datum und Uhrzeit (älteste zuerst); siehe auch /T:acw
eSortieren nach Erweiterung
gErst Unterverzeichnisse, dann Dateien gruppieren
iSortieren nach Beschreibung
oSortieren nach Eigentümer
rUmkehrung der Sortierreihenfolge für alle Optionen
sNach Größe sortieren
t Gleich wie d
uUnsortiert
z Genau wie s

 

Die Option /O:... speichert alle übereinstimmenden Dateinamen und führt dann die gewünschte Operation aus. Dadurch wird das potenzielle Problem vermieden, dass Dateien mehr als einmal verarbeitet werden.

 

/PWeisen Sie bei jeder Schleife die nächste Ausgabezeile des Befehls der Variablen DO zu.

 

/QDie auf DO x IN /Qfolgenden Parameter sind Zeichenketten, keine Dateinamen. Jeder Parameter wird der Reihe nach, von links nach rechts, der Schleifensteuervariablen bei aufeinanderfolgenden Schleifendurchläufen zugewiesen. Im Gegensatz zu /L behandelt /Q Argumente in doppelten Anführungszeichen mit eingebetteten Leerzeichen als ein einziges Argument.

 

/SFührt die DO-Schleife im aktuellen Verzeichnis und dann in allen Unterverzeichnissen aus. (DO unterstützt auch /R als Synonym, um mit FOR kompatibel zu sein.)

 

Wenn Sie nach dem /S eine Zahl angeben, beschränkt DO die Rekursion in den Unterverzeichnissen auf diese Zahl. Wenn Sie zum Beispiel einen Verzeichnisbaum "\a\b\c\d\e" haben, wirkt sich /S2 nur auf die Verzeichnisse "a", "b" und "c" aus.

 

Wenn Sie nach /S ein + gefolgt von einer Zahl angeben , führt DO den Befehl erst dann aus , wenn er diese Tiefe im Unterverzeichnisbaum erreicht hat. Wenn Sie zum Beispiel einen Verzeichnisbaum \a\b\c\d\ehaben , führt /S+2 denBefehl nicht in \a oder \a\b aus.

 

/T"text"Geben Sie die Begrenzungszeichen an, die beim Parsen einer Zeichenkette verwendet werden sollen.

 

/YLesen Sie ein eindimensionales Array und weisen Sie jeden Wert der DO-Variablen zu. Zum Beispiel:

 

do x in /Y MyArray

echo x = %x

enddo