# FOR (Kommandozeilenbefehl)

FOR ist ein Kommandozeilenbefehl, der eine Schleife ähnlich wie in vielen Programmiersprachen (For-Schleife) ermöglicht. Während FOR in MS-DOS noch ein primitives Werkzeug darstellte, das lediglich eine Iteration durch Dateien innerhalb eines Ordners durchführen konnte, wurde der Befehl FOR mit den in Windows 2000 eingeführten Befehlszeilenerweiterungen in cmd.exe zu einem mächtigen Befehl ausgebaut, der auch – mit gewissen Einschränkungen – Textdateien parsen und durch die Bestandteile iterieren kann.

## Funktionalität von FOR unter MS-DOS

Die Syntax des FOR-Befehls unterscheidet sich grundlegend von der Syntax anderer Befehle auf der Befehlszeile. Sie lautet wie folgt:
Die Bestandteile eines syntaktisch korrekten FOR-Befehls sind:
* %I bezeichnet die Variable, die während der Laufzeit der For-Schleife durch den jeweiligen Dateinamen ersetzt wird. Als Variablenname kann jeder Buchstabe des Alphabets verwendet werden. Soll eine For-Schleife innerhalb einer Stapelverarbeitungsdatei verwendet werden, muss das Prozentzeichen verdoppelt werden: %%I statt %I.
* IN ist ein Schlüsselwort, das die Angabe der zu iterierenden Dateien einleitet. Es muss zwingend nach dem Variablennamen vorkommen.
* (*.HTM) bezeichnet die Dateien, durch die iteriert wird, im hier vorliegenden Beispiel alle Dateien mit der Dateierweiterung HTM. Es können hier sowohl konkrete Dateien als auch Wildcards angegeben werden; möglich ist auch die Angabe mehrerer Arten von Dateien durch ein Leerzeichen getrennt, z. B. (*.HTM *.TXT) für alle Dateien mit den Dateierweiterungen HTM oder TXT. Die Klammern sind zwingend. Es ist auch möglich, hier eine Zeichenkette anzugeben (in Anführungszeichen), was aber in den seltensten Fällen sinnvoll ist.
* DO ist ein weiteres Schlüsselwort, das den auszuführenden Befehl einleitet. Er muss zwingend nach der Angabe der Dateien folgen.
* TYPE %I bezeichnet den Befehl, der für jede Datei einzeln ausgeführt wird; die Variable wird während der Laufzeit durch den konkreten Dateinamen ersetzt.

## Funktionalität von FOR ab Windows 2000

Ab Windows 2000 bietet FOR mit aktivierten Befehlszeilenerweiterungen weitere, deutlich mächtigere Optionen.

### Iteration durch eine Datei oder die Ausgabe eines Befehls

Wird FOR mit dem Parameter /F aufgerufen, wird der Kommandozeileninterpreter angewiesen, den Inhalt einer Datei durchzulaufen und jede einzelne Zeile dieser Datei in einzelne Bestandteile aufzuteilen; mithin handelt es sich um einen primitiven Tokenizer. Ebenso ist es möglich, die Ausgabe eines anderen Befehls der Befehlszeile unmittelbar auszuwerten oder auch eine Zeichenkette unmittelbar im Befehl anzugeben, die ausgewertet werden soll.
Standardmäßig wird der Inhalt der Datei in Tokens aufgeteilt, wobei als Trennzeichen das Leerzeichen und das Horizontal-Tabulatorzeichen voreingestellt sind und nur das erste Token jeder Zeile ausgewertet wird. Sollen diese Voreinstellungen geändert werden, müssen sie durch spezielle Schlüsselwörter innerhalb von Anführungszeichen nach dem Parameter und vor der Angabe der Variable angegeben werden:
tokens= legt fest, welches Token in einer Zeile ausgewertet wird. Der Standardwert lautet 1, möglich ist die Angabe sowohl einer einzelnen Zahl als auch mehrerer Zahlen oder eines ganzen Zahlenbereichs, wie z. B. tokens=2,4-6, um das 2., 4., 5. und 6. Token in jeder Zeile auszuwerten. Wird mehr als ein Token angegeben, weist der Kommandozeileninterpreter den weiteren Tokens automatisch Variablen zu und zwar dem Alphabet folgend. Wäre also im Befehl als Variablenname %I angegeben, erhielten die weiteren Tokens automatisch die Variablen %J, %K und %L. Es ist außerdem möglich, das Sternchen als Wildcard anzugeben, etwa tokens=3* zur Auswertung des 3. und allen darauffolgenden Tokens.
delims= legt das Trennzeichen fest, das der Kommandozeileninterpreter verwendet, um die Zeilen in einzelne Tokens aufzutrennen. Es können auch mehrere Trennzeichen angegeben werden, z. B. delims=.:, um den Punkt und den Doppelpunkt als Trennzeichen festzulegen.
skip= legt fest, wie viele Zeilen am Anfang der Datei übersprungen werden soll, etwa weil sie für die Auswertung wertlose Metadaten enthalten. Standard ist 0.
eol= legt fest, ab welchem Zeichen der Kommandozeileninterpreter das Lesen der Zeile beenden soll. Standard ist der Semikolon; dies hat etwa zur Folge, dass Zeilen, die mit einem Semikolon beginnen, ähnlich wie Kommentarzeilen vom Kommandozeileninterpreter ignoriert werden.
usebackq ändert die Syntax des FOR-Befehls. Standardmäßig interpretiert der Kommandozeileninterpreter die Angabe innerhalb der Klammern nach dem Schlüsselwort IN wie folgt:
* Ohne Sonderzeichen, z. B. (index.txt): Name der Datei, deren Inhalt verarbeitet werden soll
* Mit einfachen Anführungszeichen, z. B. ('dir /b *.txt'): Befehl, dessen Ausgabe verarbeitet werden soll
* Mit doppelten Anführungszeichen, z. B. ("1.txt 2.txt 3.txt"): Zeichenkette, die wörtlich verarbeitet werden soll
Wird nun das Schlüsselwort usebackq angegeben, ändert sich die Syntax wie folgt:
* Mit Gravis-Zeichen, z. B. (`dir /b *.txt`): Befehl, dessen Ausgabe verarbeitet werden soll
* Mit einfachen Anführungszeichen, z. B. ('1.txt 2.txt 3.txt'): Zeichenkette, die wörtlich verarbeitet werden soll
* Mit doppelten Anführungszeichen, z. B. ("Neue Datei.txt"): Name der Datei, deren Inhalt verarbeitet werden soll
Das hat den Vorteil, dass auch Dateinamen mit Leerzeichen angegeben werden können; ohne das Schlüsselwort würden die Bestandteile vor und nach dem Leerzeichen getrennt verarbeitet (also als Datei Neue und als Datei Datei.txt).

### Rekursive Iteration durch einen Verzeichnisbaum

Der Parameter /R ermöglicht es, einen gesamten Verzeichnisbaum rekursiv zu durchsuchen und den Befehl in der For-Schleife für jede Datei in den einzelnen Unterordnern auszuführen, die der Angabe in den Klammern entsprechen.
Die Angabe des Verzeichnisbaums, der rekursiv durchsucht werden soll, erfolgt nach dem Parameter und vor der Angabe der Variable. Wird kein Verzeichnisbaum angegeben, wird das aktuelle Verzeichnis benutzt.

### Iteration durch Ordner

Mit der Angabe des Parameters /D iteriert die For-Schleife nicht durch Dateien, sondern durch Ordner.
Es besteht die undokumentierte Möglichkeit, die Parameter /D und /R zu kombinieren, um einen Verzeichnisbaum rekursiv nach Ordnern zu durchsuchen.

### Iteration durch Zahlenbereiche

Wird FOR mit dem Parameter /L aufgerufen, iteriert die For-Schleife durch einen angegebenen Zahlenbereich.
Die Syntax hierfür lautet (1,1,5). Die erste Zahl gibt an, von wo die Zählung anfangen soll, die zweite Zahl, um wie viel die Variable mit jedem Durchlaufen der Schleife erhöht werden soll und die dritte Zahl, ab wo die Zählung enden soll.

### Weitere Funktionen

Mit aktivierten Befehlszeilenerweiterungen kann der FOR-Befehl auch verschachtelt werden. In diesem Fall kann der auszuführende Befehl in Klammern gesetzt werden, um klarzustellen, zu welcher Ebene der Befehl gehört. Ein Ausbrechen aus einer inneren Schleife (ähnlich dem Schlüsselwort break in Programmiersprachen wie C) ist nur über einen Umweg möglich, indem die innere For-Schleife in eine eigene Routine verlagert wird; diese kann dann mit exit /b beendet werden.