| Zweck: | Schleifen in Batch-Dateien erstellen |
| Format: | DO loop_control |
commands
[ITERATE]
commands
[LEAVE [n]]
commands
ENDDO
Formate der Schleifensteuerung
DO count
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 |
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 |
Attribut auswählen |
|
Schleife über jedes Zeichen im Ausdruck |
|
Verzeichnis beginnen |
|
(Beschreibung abgleichen) Beschreibungsbereich. |
|
Mitglieder der Menge sind Zeichenketten, keine Dateinamen |
|
Reihenfolge sortieren |
|
Analysiert die Ausgabe des Befehls und speichert bei jeder Ausführung der Schleife dienächste Ausgabezeile in varname . |
|
Wie /L, behandelt aber Argumente in doppelten Anführungszeichen (mit eingebettetem Leerzeichen) als ein einziges Argument. |
|
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_dirs | Die 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_files | Die Anzahl der Verzeichniseinträge (Dateien oder Unterverzeichnisse), die in der aktuellen DO-Schleife verarbeitet werden. |
| %_do_errors | Die Anzahl der Fehler für die aktuelle DO-Schleife. |
| %_do_loop | Wie 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.
| /C | Weisen 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. |
| /L | Die 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. |
| d | Überspringen versteckter Verzeichnisse (bei Verwendung mit /S) |
| j | Überspringen von Verzweigungen (bei Verwendung mit /S) |
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:
| n | Sortieren nach Dateiname und Erweiterung, sofern nicht ausdrückliche angegeben ist. |
| - | Umkehrung der Sortierreihenfolge für den nächsten Sortierschlüssel |
| a | Sortieren Sie Namen und Erweiterungen in der Standard-ASCII-Reihenfolge, anstatt numerisch, wenn der Name oder die Erweiterung numerische Teilzeichenfolgen enthält. |
| c | Sortieren nach Kompressionsverhältnis |
| d | Sortieren nach Datum und Uhrzeit (älteste zuerst); siehe auch /T:acw |
| e | Sortieren nach Erweiterung |
| g | Erst Unterverzeichnisse, dann Dateien gruppieren |
| i | Sortieren nach Beschreibung |
| o | Sortieren nach Eigentümer |
| r | Umkehrung der Sortierreihenfolge für alle Optionen |
| s | Nach Größe sortieren |
| t | Gleich wie d |
| u | Unsortiert |
| 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.
| /Q | Die 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. |
| /S | Fü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. |
do x in /Y MyArray
echo x = %x
enddo