Kommando halt!

CMD - der Windows NT Kommandointerpreter

Windows NT kommt mit zwei Kommandointerpretern: Der 'alten' von MS-DOS und Windows 9x. bekannten command.com und dem eigenen 'CMD'. Der CMD kann deutlich mehr als die command.com - wie die Kommandosprache von NT effektiv genutzt wird zeigt dieser Beitrag. Von Thomas Wölfer.

'FOR' Befehl effektiv nutzen
Mit dem FOR Befehl kann ein anzugebender Befehl auf einen Satz an Dateien angewendet werden. Die Art und Weise in der der Satz an Dateien angegeben wird hat dabei viele Spielarten, so kann dieser Satz beispielsweise auch aus dem Resultat eines anderen Programmes entommen werden - das Programm 'findstr' liefert beispielsweise ein brauchbares Ergebnis.

Sollen beispielsweise alle Dateien der lokalen Festplatte nach einem bestimmten Text durchsucht werden - und, so die Datei den Text enthält - selbige mit Notepad (oder einem anderen Programm) zur Bearbeitung geöfnet werden, so kann Sie den folgende Batch verwendet werden (Bitte beachten: Die Variable mit den zwei führenden Prozentzeichen müssen nur innerhalb von Batches zwei Prozentzeichen haben. Wenn CMD-Befehle direkt auf der Konsole eingetippt werden, ist statt dessen nur ein einzelnes Prozenteichen zu verwenden):

@pushd \
@for /F %%i in ('@findstr /S /I /M /P %1 *.*') do @start notepad %%i
@popd

Die @-Zeichen im Batch haben nur den Zweck, das die Zeilen die dieses Zeichen vorangestellt haben vor ihrer Ausführung nicht angezeigt werden: Das macht die Bildschirmanzeige übersichtlicher. Der erste Befehl im Batch ist das Kommando ‚pushd' - dieses merkt sich das aktuelle Verzeichnis und wechselt dann in das angegebene - in diesem Fall das Wurzelverzeichnis (‚\') der aktuellen Festplatte. Dies geschieht, damit das Batch-Programm von jedem Verzeichnis auf der Festplatte aufgerufen werden kann, aber trotzdem immer die ganze Platte durchsucht. Am ende des Programmes wird dann das mit pushd #gemerkte' Verzeichnis wieder hergestellt - der letzte Befehl im Batch 'popd' übernimmt diese Aufgabe.

Die etwas komplizierte mittlere Zeile

(for /F %%i in ('@findstr /S /I /M /P %1 *.*') do @start notepad %%I)

macht den eigentliche Batch aus und erledigt die ganze Arbeit. Zunächst wird der FOR Befehl aufgerufen und erhält im Aufruf den Parameter /F und %%i.
Das /F %%i steht dabei für die FOR-Option mit die zu untersuchenden 'Tokens' angegeben werden - im Fall von %%i sind das einfach alle Dateien aus dem angegebenen Set.

Das Wort 'in' steht vor dem Set an Dateien, und dieses ist innerhalb der runden Klammern spezifiziert. Im einfachsten Fall könnte man also in etwa (*.txt) in die runden Klammern setzen - dann würden nur Dateien mit der Erweiterung *.txt von FOR behandelt. Im Beispiel wird aber nicht einfach ein Set an Dateien statisch festgelegt, sondern statt dessen der 'findstr' Befehl verwendet um dieses Set zu ermitteln. Das bedeutet, das das FOR Kommando zunächst den 'findst' mit allen angegebenen Parametern ausführt und dessen Rückgabewert als Datei-Set betrachtet. Dies gelingt, weil findstr in der angegebenen Form als Rückgabewert einen genau passenden Satz an Dateien liefert. Damit 'findstr' weiss, nach welchem Text es suchen soll, erhält es die Angabe %1 als Parameter: Dies ist der erste an das Batch-Programm übergebene Parameter. Wird ein Batch mit Parametern aufgerufen - zum Beispiel 'Test.bat harri boo' - dann werden diese Parameter innerhalb des Batches mit den Optionen %1, %2 und so weiter beziffert. 'harri' entspricht also %1 und 'boo' entspricht %2.

Für alle von 'findstr' gefundenen Dateien führt das FOR Kommando nun ein Kommando aus. Welches, steht hinter dem Schlüsselwort 'do'. Im Beispiel ist dies der Befehl 'start notepad' mit dem Parameter %%i. 'Start notepad' startet einfach das Programm 'notepad', der Parameter %%i entspricht dem 'i' aus dem Anfang des Befehls - er enthält also für jeden Aufruf von notepad den Namen einer der gefundenen Dateien.

Dem FOR Befehl können diverse Optionen mitgegeben werden die festlegen, wie das Set zu betrachten ist: Auf diese Weise können Sie den FOR Befehl auch ohne Dateien sondern einfach mit Texten verwenden - in diesem Fall können die Texte sogar in Tokens unterteilt werden, wobei die Trennzeichen (delimiter) frei angegeben werden können. Soll zum Beispiel die Anzeige des 'Set' Befehls etwas hübscher formatiert werden, so kann folgender Befehl verwendet werden:

FOR /F "tokens=1,2 delims==" %%i in('set') do @echo %%i enthält den Wert %%j

Das von FOR bearbeitete 'set' entsteht in diesem Fall also einfach aus dem 'set' Kommando - das heißt 'vor' verwendet die normlerweise am Bildschirm angezeigte Ausgabe dieses Befehls. Diese liegt in folgender Form vor:

Variablenname=InhaltDerVariable.

Mit dem Befehl 'tokens=1,2' wird FOR mitgeteilt das nur das erste und das zweite Token von Interesse sind: Diese tauchen dann im Laufe der Bearbeitung als Variablen %%I und %%j im 'do' Teil des Kommandos auf. Mit 'delims==' wird FOR mitgeteilt, das das Gleichheitszeichen als Trennzeichen zu verstehen ist:
'Variablenname=InhaltDerVariable' hat also ein Trennzeichen und zwei Tokens. Bei der Ausführung des angegebenen FOR Befehls resultiert dies also in der folgenden Anzeigen:

Variablename enthält den Wert Inhalt der Variable

Artikel kommentieren