Dieser Artikel enthält Informationen zum Umgang mit dem Windows Befehlsinterpreter, sowie zu Variablen und wichtigen Befehlen in Batchprogrammen.
Befehlsinterpreter
Maskieren von SonderzeichenLokale Variablen
Dynamische Variablen
Erweiterung von Variablen
Umleitungen
Befehle verknüpfen
Befehlserweiterungen
Verzögerte Erweiterung
Parameter und Argumente
SHIFT - Parameterposition verschiebenText in Variablen verändern
Ersetzen und Ausschneiden von TextPUSHD und POPD
Extrahieren von Text
CALL
SET
SET /A - Numerischen Ausdruck berechnenIF
SET /P - Benutzereingabe
SET /P - ECHO ohne Zeilenumbruch
ELSEFOR
Der Befehlsinterpreter verarbeitet sowohl die Benutzereingaben in der Konsole, als auch aufgerufene Batchprogramme. Die folgenden Themen behandeln einige Besonderheiten und nützliche Funktionen des Befehlsinterpreters.
Enthalten Parameter für einen Befehl Zeichen, die vom Befehlsinterpreter verwendet werden, muss der Parameter in doppelte Anführungszeichen (") eingeschlossen werden. Diese Zeichen sind ( ) [ ] { } ^ = ; ! ' + , ` ~ und das Leerzeichen. Auch Programmnamen und Dateinamen mit Leerzeichen und anderen Sonderzeichen müssen in Anführungszeichen gesetzt werden. Innerhalb von Parametern müssen Anführungszeichen selbst nicht maskiert werden.
test.cmd Test1"ABC" test.cmd Test2 ABC test.cmd "Test3 "ABC""
Ausgabe des 1. Parameters mit dem Befehl "echo %~1
" in der Datei "test.cmd":
Test1"ABC" Test2 Test3 "ABC"
Wenn Zeichen für Umleitungen (<, > oder |) verwendet werden, müssen diese mit einem Zirkumflex (^) maskiert werden.
echo ^<html^>
Gibt den Text "<html>" aus.
Auch Zeilenumbrüche können mit einem Zirkumflex maskiert werden:
echo Wort1 ^ Wort2 ^ Wort3
Ausgabe:
Wort1 Wort2 Wort3
Um ein Zirkumflex auszugeben, muss dieses ebenfalls mit einem Zirkumflex maskiert werden:
echo ^^
Es wird nur ein Zirkumflex ausgegeben.
Um ein Prozentzeichen, welches für Variablen verwendet wird, in einem Batchprogramm auszugeben, muss dieses mit einem Prozentzeichen maskiert werden.
echo %%1
Gibt den Text "%1" aus. Bei der manuellen Eingabe in der Konsole ist die Maskierung nicht erforderlich.
Sind die Befehlserweiterungen aktiviert, werden vom Befehlsinterpreter zusätzliche Umgebungsvariablen unterstützt, die durch den SET-Befehl nicht angezeigt werden.
Variable | Inhalt |
---|---|
%CD% | Aktuelles Verzeichnis als vollständiger Pfad. |
%CMDCMDLINE% | Ursprüngliche Befehlszeile die den Befehlsinterpreter "CMD" aufgerufen hat - inklusive der Parameter und Optionen. |
%CMDEXTVERSION% | Versionsnummer der aktuellen Erweiterungen für den Befehlsinterpreter. |
%DATE% | Aktuelles Datum im selben Format wie der DATE-Befehl. |
%ERRORLEVEL% | Rückgabewert (Exit-Code) des letzten Programms bzw. Befehls. |
%HIGHESTNUMANODENUMBER% | Höchsten NUMA-Knotennummer auf diesem Computer. |
%RANDOM% | Zufällige Dezimalzahl zwischen 0 und 32767. |
%TIME% | Aktuelle Zeit im selben Format wie der TIME-Befehl. |
Der Befehlsinterpreter ersetzt die Variablen in einer Batchdatei vor der Ausführung mit deren Inhalt. Dies wird auch "Erweiterung" von Variablen genannt. Eine Ausnahme stellt nur die verzögerte Erweiterung dar.
set var=2 oder 3
Diese Zeile weist der Variable var den Wert 2 oder 3 zu.
if "%var%" == "1" goto start1
Diese Zeile prüft, ob der in Anführungszeichen eingeschlossene Inhalt der Variable var gleich "1" (einschließlich der Anführungszeichen) ist.
Die Variable wird vor der Ausführung gegen den Inhalt ersetzt, wodurch die Zeile so ausgeführt und geprüft wird:
if "2 oder 3" == "1" echo start1
Wenn die Anführungszeichen beim Vergleich weggelassen werden, würde die IF-Zeile so aussehen:
if %var% == 1 goto start1
Nach der Erweiterung der Variable würde der Befehlsinterpreter die Zeile jedoch so auszuführen versuchen:
if 2 oder 3 == 1 echo start1
Da nach der Zahl "2" das Wort "oder" steht, an Stelle des erwarteten Operators für den Vergleich, würde ein Fehler auftreten.
Diese Erweiterung der Variablen vor der eigentlichen Ausführung der Befehle kann auch Vorteile haben, wie dieses Beispiel zeigt:
goto Result%ERRORLEVEL% :Result0 echo OK goto :EOF :Result1 echo ERROR!!! goto :EOF
In der ersten Zeile wird der Name der Marke mit einer Variable ERRORLEVEL verbunden, um dann, basierend auf deren Wert, eine passende Meldung auszugeben. Wenn beispielsweise die Variable ERRORLEVEL gleich 0 ist, wird die erste Zeile so ausgeführt:
goto Result0
Die Marke "Result0" wird vom Befehlsinterpreter gefunden und die Ausführung dort fortgesetzt.
Konsolenbefehle und Konsolenprogramme verwenden für die Eingabe und Ausgabe sog. Kanäle.
Über den Kanal 0 (auch Eingabekanal, Standardeingabe oder STDIN) werden Tastatureingaben von der Konsole gelesen.
Über den Kanal 1 (auch Ausgabekanal, Standardausgabe oder STDOUT) werden Texte in der Konsole ausgegeben.
Über den Kanal 2 (auch Fehlerkanal, Standardfehlerausgabe oder STDERR) werden Fehlermeldungen in der Konsole ausgegeben.
Die Daten dieser Kanäle können auf andere Kanäle, in Dateien oder auf Geräte, z.B. einen Drucker (LPT1, LPT2 etc.), umgeleitet werden.
Solche Umleitungen werden nach einem Befehl mit Größer-als-Zeichen bzw. Kleiner-als-Zeichen angegeben. Davor und danach kann der Ursprungskanal und das Ziel angegeben werden. Wird als Ziel der Umleitung ein Kanal angegeben, muss diesem ein kaufmännisches Und (&) vorangestellt werden. Bei mehreren Umleitungen muss die Umleitung des Fehlerkanals zum Ausgabekanal nach der Umleitung des Ausgabekanals angegeben werden.
Umleitungen in eine Datei erstellen diese, falls sie nicht existiert. Alle Ausgabeumleitungen mit einem einfachen Größer-als-Zeichen (> oder 2>) in eine Datei überschreiben diese.
Soll die Ausgabe eines Befehls an die Eingabe eines anderen Befehls gesendet werden, wird ein Pipe-Zeichen (|) verwendet.
set | sort /R
" zeigt die Ausgabe von SET in umgekehrter Reihenfolge an.Um mehrere Befehle in einer Zeile auszuführen, können diese mit einem kaufmännischen Und (&) verknüpft werden. Ebenso kann die Ausführung an die erfolgreiche bzw. fehlerfreie Ausführung eines anderen Befehls geknüpft werden. Ob ein Befehl erfolgreich ausgeführt wurde, bestimmt dessen Rückgabewert (Error-Code).
Gefällt dir meine Webseite, meine Freeware-Programme oder Online-Tools?
Dann spende bitte per PayPal und hilf mit, den Inhalt weiterhin kostenlos anbieten zu können - jeder Betrag ist willkommen!
Der Befehl SETLOCAL aktiviert die Begrenzung des Gültigkeitsbereiches von Variablen auf die nachfolgenden Befehle. Änderungen an Variablen, die nach SETLOCAL vorgenommen werden, werden am Ende des Batchprogramms, oder nach dem Befehl ENDLOCAL wieder rückgängig gemacht.
@echo off set TEST_Global=Original echo TEST_Global=%TEST_Global% setlocal echo setlocal set TEST_Global=Changed set TEST_New=New echo TEST_Global=%TEST_Global% echo TEST_New=%TEST_New% endlocal echo endlocal echo TEST_Global=%TEST_Global% echo TEST_New=%TEST_New%
Ausgabe:
TEST_Global=Original setlocal TEST_Global=Changed TEST_New=New endlocal TEST_Global=Original TEST_New=
Befehlserweiterungen erweitern die Funktionalität einiger Befehle und sind üblicherweise aktiviert. In der Hilfe zu den betreffenden Befehlen ist auch angegeben, wie sich die Befehlserweiterungen auf den jeweiligen Befehl und seine Parameter auswirken. In einer Batchdatei können die Befehlserweiterungen mit der Zeile
setlocal EnableExtensions
aktiviert werden. Beim Aufruf des Befehlsinterpreters CMD werden die Befehlserweiterungen mit der Option "/E:ON" aktiviert und mit "/E:OFF" deaktiviert.
Die verzögerte Erweiterung von Umgebungsvariablen sorgt dafür, dass Variablen nicht wie üblich beim Lesen des Befehls (der Zeile) erweitert werden, sondern bei der Ausführung. Damit können zum Beispiel Variablen in jedem Durchlauf einer FOR-Schleife geändert werden, statt nur zu Beginn. Auch bei Befehlsblöcken, welche mit runden Klammern begonnen und geschlossen werden, kommt es ohne die verzögerte Erweiterung zu Problemen. In einer Batchdatei kann die verzögerte Erweiterung mit der Zeile
setlocal EnableDelayedExpansion
aktiviert werden. Beim Aufruf des Befehlsinterpreters CMD wird die verzögerte Erweiterung mit der Option "/V:ON" aktiviert und mit "/V:OFF" deaktiviert.
Bei Verwendung der verzögerten Erweiterung müssen die betreffenden Variablen mit Rufzeichen eingeschlossen werden, statt mit einem Prozentzeichen. Im folgenden Beispiel sind es die Variablen var im IF-Block und files in der FOR-Schleife. Die Variable files wird durch die verzögerte Erweiterung bei jedem Schleifendurchlauf erweitert und korrekt befüllt.
@echo off setlocal EnableDelayedExpansion set var=1 echo %var% = 1 in main if not "%var%" == "" ( set var=2 echo !var! = 2 in IF block set var=3 echo !var! = 3 in IF block ) echo %var% = 3 in main echo. set files= for %%i in (.\files\*) do set files=!files! %%i echo Files:%files% endlocal
Ausgabe:
1 = 1 in main 2 = 2 in IF block 3 = 3 in IF block 3 = 3 in main Files: .\files\test.jpg .\files\test.zip .\files\test1.txt .\files\test2.txt .\files\test3.txt
Ohne die verzögerte Erweiterung würde die Variable var im IF-Block nicht korrekt erweitert werden. Die Variable files in der FOR-Schleife würde nur den letzten Dateinamen enthalten, da die leere Variable files nur beim ersten Aufruf erweitert werden würde. Dadurch enthält sie am Ende der FOR-Schleife nur den letzten Dateinamen.
Eine Batchdatei kann mit Parametern über die Konsole oder aus einer anderen Batchdatei heraus per CALL-Befehl aufgerufen werden. Auch wenn eine Marke in einer Batchdatei mit dem CALL-Befehl aufgerufen wird, können Argumente übergeben werden. Diese Parameter und Argumente stehen dann als spezielle Variablen zur Verfügung:
Von jedem der Parameter (%1, %2 etc.) kann ein bestimmter Teil zurückgegeben werden. Im Folgenden wird der 1. Parameter (%1) als Beispiel verwendet. Manche Angaben benötigen jedoch einen existierenden Datei- oder Verzeichnisnamen, damit die Ausgabe korrekt ist.
Ausdruck | Beschreibung |
---|---|
%~1 | Entfernt vor der Ausgabe umschließende Anführungszeichen ("). Dies ist bei Datei- und Verzeichnisnamen nützlich. |
%~f1 | Gibt den vollständigen Dateinamen zurück. Wurde ein relativer Pfad angegeben, wird der vollständige Pfad ausgegeben. |
%~d1 | Gibt nur den Laufwerkbuchstaben mit dem Doppelpunkt zurück. |
%~p1 | Gibt nur den Pfad zurück. |
%~n1 | Gibt nur den Dateinamen ohne Erweiterung zurück. |
%~x1 | Gibt nur die Dateierweiterung, inkl. dem Punkt, zurück. |
%~s1 | Gibt den kurzen Namen der Datei zurück. |
%~a1 | Gibt die Dateiattribute zurück. |
%~t1 | Gibt Datum/Zeit der Datei zurück. |
%~z1 | Gibt die Dateigröße in Byte der Datei zurück. |
%~$PATH:1 | Durchsucht die in der PATH-Umgebungsvariable angegebenen Verzeichnisse und expandiert die erste gefundene Datei %1 zu dem vollständigen Dateinamen. Wenn der Name der Umgebungsvariablen nicht definiert ist oder diese Datei bei der Suche nicht gefunden wurde, wird dieser Parameter zu einer leeren Zeichenfolge expandiert. |
Die Parameter können auch miteinander kombiniert werden:
%~ darf nicht mit %* verwendet werden.
@echo off setlocal EnableExtensions call :printparams "C:\Windows\Explorer.exe" goto :EOF :printparams echo Original: %1 echo No Quotes: %~1 echo Full Name: %~f1 echo Drive: %~d1 echo Path: %~p1 echo Name: %~n1 echo Extension: %~x1 echo Short Name: %~s1 echo Attributes: %~a1 echo Date/Time: %~t1 echo File Size: %~z1 B echo. echo Drive and Path: %~dp1 echo Name and Extension: %~nx1 echo Date, Time and Size: %~tz1 goto :EOF
Ausgabe:
Original: "C:\Windows\Explorer.exe" No Quotes: C:\Windows\Explorer.exe Full Name: C:\Windows\explorer.exe Drive: C: Path: \Windows\ Name: explorer Extension: .exe Short Name: C:\Windows\explorer.exe Attributes: --a------ Date/Time: 22.01.2016 07:19 File Size: 3231232 B Drive and Path: C:\Windows\ Name and Extension: explorer.exe Date, Time and Size: 22.01.2016 07:19 3231232
SHIFT [/Parameterposition]
Der Befehl SHIFT verschiebt die Parameter um eine Position. Sind die Befehlserweiterungen aktiviert, kann als Parameter die Position des ersten zu verschiebenden Parameters angegeben werden. Die Nummerierung der Parameter beginnt bei 0. Vor der Position muss ein Schrägstrich angegeben werden.
Im folgenden Beispiel werden zunächst alle Parameter um eine Position verschoben. Anschließend werden die Parameter ab dem 3. Parameter (Position 2) um eine Position verschoben.
@echo off setlocal EnableExtensions echo 0=%0 echo 1=%1 echo 2=%2 echo 3=%3 shift echo. echo 0=%0 echo 1=%1 echo 2=%2 echo 3=%3 shift /2 echo. echo 0=%0 echo 1=%1 echo 2=%2 echo 3=%3 endlocal
Aufrufparameter des Beispiels:
test 111 222 333 444 555 666 777
Ausgabe:
0=test 1=111 2=222 3=333 0=111 1=222 2=333 3=444 0=111 1=222 2=444 3=555
In Variablen kann Text ersetzt, ausgeschnitten oder extrahiert werden. Dies betrifft jedoch nur die Ausgabe (die Erweiterung). Der Wert der betreffenden Variable wird dadurch nicht verändert. Ist die gewünscht, muss der neue Wert der Variable mit SET zugewiesen werden.
Der Werte einer Variable kann nach einem Suchbegriff durchsucht und gegen einen anderen Text ersetzt werden. Die Groß-/Kleinschreibung wird dabei nicht beachtet. Ist die Ersetzung leer, wird der gesuchte Text entfernt.
Syntax: %Variable:Suchbegriff=Ersetzung%
Teile des Wertes einer Variable können extrahiert und ausgegeben werden.
Syntax: %Variable:~Offset,Länge%
Das Offset bestimmt die Position des ersten Zeichens, beginnend mit 0. Ist das Offset negativ, wird von hinten mit dem Zählen begonnen. Die Länge bestimmt die Anzahl der Zeichen, die ausgegeben werden sollen. Ist die Länge negativ, wird von hinten mit dem Zählen begonnen. Wird die Länge inkl. Komma weggelassen, wird der gesamte Text bis zum Ende ausgegeben.
Für folgende Ausdrücke wird angenommen, dass die Variable "var" den Text "1234567890" enthält.
Ausdruck | Ausgabe |
---|---|
%var:~1,2% | 23 |
%var:~7% | 890 |
%var:~-3% | 890 |
%var:~-9,2% | 23 |
%var:~4,-2% | 5678 |
In Batchdateien kommt es oft vor, dass kurzzeitig auf ein anderes Verzeichnis und dann wieder zurück zum vorherigen Verzeichnis gewechselt werden muss.
PUSHD [Verzeichnis]
Der Befehl PUSHD speichert das aktuelle Verzeichnis und wechselt dann zum angegebenen Verzeichnis.
POPD
Der Befehl POPD setzt das mit PUSHD gespeicherte Verzeichnis wieder als aktuelles Verzeichnis.
cd pushd C:\Windows cd popd cd
Wenn das aktuelle Verzeichnis "D:\Test" ist, wird folgendes ausgegeben:
D:\Test C:\Windows D:\Test
CALL [Laufwerk:][Pfad]Dateiname [Parameter]
Der Befehl CALL ruft eine Batchdatei aus einer anderen Batchdatei aus auf.
Nach dem Dateinamen können Parameter an die aufgerufene Batchdatei übergeben werden, die diese zur Ausführung benötigt.
Wenn die Befehlserweiterungen aktiviert sind, kann beim CALL-Befehl auch eine Marke innerhalb der aktuellen Batchdatei als Sprungziel angegeben werden:
CALL :Marke [Argumente]
Mit diesen Argumenten wird ein neuer Batchkontext erstellt und die Ausführung hinter der angegebenen Marke fortgesetzt. Damit funktioniert die Verarbeitung ähnlich einem Unterprogramm oder einer Funktion.
Um den Batchkontext zu verlassen, und nach dem CALL-Befehl mit der Verarbeitung fortzufahren, muss der GOTO-Befehl mit der internen Marke ":EOF" angegeben werden. Der Doppelpunkt ist im Gegensatz zu anderen Marken beim GOTO-Befehl erforderlich. Der GOTO-Befehl verlässt damit die Batchdatei bzw. nach einem Aufruf per CALL-Befehl den Batchkontext.
echo 1 call :marke echo 3 goto :EOF :marke echo 2 goto :EOF echo Dieser Text wird nicht ausgegeben.
Ausgabe:
1 2 3
SET [Zeichenfolge]
Der Befehl SET zeigt die Umgebungsvariablen und deren Werte an. Als Parameter kann eine Zeichenfolge übergeben werden, die nur Variablen ausgibt, welche mit dieser Zeichenfolge beginnen.
Für die Erstellung einer neuen Variable, oder die Änderung des Wertes einer bestehenden Variable, wird dem SET-Befehl die Variable und der neue Wert im Format "Variable=Wert" übergeben.
SET Variable=Wert
Leerzeichen vor dem Gleichheitszeichen gehören zum Namen der Variable, Leerzeichen nach dem Gleichheitszeichen zum Wert.
Wenn im Wert Leerzeichen enthalten sind, muss der Parameter nicht mit Anführungszeichen umschlossen werden. Bei Leereichen am Ende, oder bei Zeichen, welche auch der Befehlsinterpreter verwendet, wie beispielsweise & oder >, müssen Anführungszeichen verwendet werden. Diese müssen auch den Variablennamen einschließen, da die Anführungszeichen sonst als Teil des Wertes angesehen werden.
SET "Variable=Wert"
Um eine Variable zu entfernen, wird der Variable ein leerer Wert zugewiesen:
SET Variable=
SET /A Variable=[Ausdruck] SET /A [Ausdruck]
Der Parameter "/A" gibt das Ergebnis eines numerischen Ausdrucks zurück. Das Ergebnis kann auch in eine Variable abgelegt werden, die vor dem Ausdruck angegeben werden kann.
Beim Ausdruck ist zu beachten, dass nur Dezimalzahlen, Zahlen in oktaler und hexadezimaler Schreibweise unterstützt werden. Oktalzahlen muss eine "0" vorangestellt werden, hexadezimalen Zahlen müssen die Zeichen "0x" vorangestellt werden.
Alle anderen Werte geben eine Fehlermeldung aus oder werden als 0 angesehen. Variablen müssen in einem Ausdruck nicht mit einem Prozentzeichen versehen werden. Bei einigen Operatoren, wie & und >>, muss der Ausdruck in Anführungszeichen gesetzt werden, da diese auch vom Befehlsinterpreter verwendet werden.
Operator | Operation | Ausdruck SET /A "..." | Ergebnis | Anmerkung | |
---|---|---|---|---|---|
* | Multiplikation | 2*3 | 36 | Multipliziert Zahlen. | |
/ | Division | 4/2 | 2 | Dividiert die erste Zahl durch die zweite Zahl. | |
% | Modulo | 8%3 | 2 | Gibt den Rest einer Division zurück. | |
+ | Addition | 2+3 | 5 | Addiert Zahlen. | |
- | Subtraktion | 3-2 | 1 | Subtrahiert Zahlen. | |
<< | Logische Verschiebung Links | 8<<2 | 32 | Verschiebt die Bits einer Zahl nach links. 0000 1000 wird zu 0010 0000 | |
>> | Logische Verschiebung Rechts | 32>>2 | 8 | Verschiebt die Bits einer Zahl nach rechts. 0010 0000 wird zu 0000 1000 | |
& | Bitweises Und | 200&44 | 8 | Führt einen logischen Und-Vergleich zwischen den Bits an der gleichen Postion beider Werte durch. Sind beide Bits 1, ist das Ergebnis 1, ansonsten 0. 1100 1000 & 0010 1100 ergibt 0000 1000 | |
| | Bitweises Oder | 200|44 | 236 | Führt einen logischen Oder-Vergleich zwischen den Bits an der gleichen Postion beider Werte durch. Ist mindesten ein Bit 1, ist das Ergebnis 1, ansonsten 0. 1100 1000 & 0010 1100 ergibt 1110 1100 | |
^ | Bitweise exklusives Oder | 200^44 | 228 | Führt einen logischen exklusiven Oder-Vergleich zwischen den Bits an der gleichen Postion beider Werte durch. Sind beide Bits gleich, ist das Ergebnis 0, ansonsten 1. 1100 1000 & 0010 1100 ergibt 1110 0100 | |
...= | Zuweisung zur selben Variable | var=3 var+=2 | 5 | Führt eine der oben beschriebenen Operationen mit dem Wert der angegebenen Variable als ersten Wert und einem zweiten Wert durch. Das Ergebnis wird der Variable zugewiesen. | |
! | Logische Negation | !1 | 0 | Negiert einen logischen Wert. 0 (False) wird zu 1 (True), 1 und jede Zahl außer 0 wird zu 0. | |
~ | Bitweise Invertierung | ~0xfffffffe | 1 | Invertiert eine 32-Bit-Zahl mit Vorzeichen bitweise. | |
( ) | Gruppierung von Operationen | (1+2)*2 | 6 | Gruppiert Operationen. Ohne Klammern wäre das Ergebnis 5 (* vor +) | |
, | Trennung von Ausdrücken | var=2+3, | 10 | Ein Komma trennt mehrere Ausdrücke von einander. |
SET /P Variable=[Eingabeaufforderung]
Der Parameter "/P" weist einer Variable eine Benutzereingabe zu. Zusätzlich kann eine Eingabeaufforderung angezeigt werden.
@echo off setlocal set /P input="Please enter a text: " echo You typed: %input% endlocal
Ausgabe:
Please enter a text: Test You typed: Test
Der Befehl SET mit dem Parameter "/P" kann auch dazu verwendet werden, um einen Text ohne Zeilenumbruch auszugeben. Dies kann nützlich sein, wenn ein Text vor der Ausgabe eines Programms in der selben Zeile ausgegeben werden soll.
Der Variablenname kann und sollte weggelassen werden, damit keine Variable geändert wird. Die Eingabe kann per Befehlsumleitung oder Eingabeumleitung automatisch erfolgen. Daher wird in den Beispielen nur die Eingabeaufforderung ausgegeben. Direkt danach - ohne Zeilenumbruch - beginnt die Ausgabe des nächsten Befehls.
<nul set /P="Current Directory: " & cd
oder
echo | set /P ="Current Directory: " & cd
Ausgabe:
Current Directory: C:\Windows
Mit IF können Bedingungen überprüft und abhängig davon Befehle ausgeführt werden.
Folgt dem IF-Befehl die Angabe NOT, wird der Befehl nur dann ausgeführt, wenn die Bedingung nicht zutrifft.
IF EXIST Dateiname Befehl
EXIST prüft, ob die angegebene Datei existiert.
IF DEFINED Variable Befehl
DEFINED prüfen, ob eine Variable existiert.
IF ERRORLEVEL Nummer Befehl
ERRORLEVEL ist eine Zahl, die vom letzten beendeten Programmen zurückgegeben wurde (entspricht dem "Exit-Code"). Sie gibt an, ob das Programm erfolgreich oder wegen eines Fehlers beendet wurde. Dieser Code unterscheidet sich je nach Programm. Der Exit-Code 0 bedeutet jedoch meist, dass das Programm ohne Fehler beendet wurde.
Die Bedingung ist erfüllt, wenn ERRORLEVEL gleich oder größer der angegebenen Zahl ist.
IF CMDEXTVERSION Zahl Befehl
Mit CMDEXTVERSION kann die Versionsnummer der Befehlserweiterungen geprüft werden. Dabei handelt sich um eine Ganzzahl, beginnend bei 1. Die Bedingung ist nicht erfüllt, wenn die Befehlserweiterungen nicht aktiviert sind.
IF [/I] Zeichenfolge1 Vergleichsoperator Zeichenfolge2 Befehl
Diese Zeile vergleicht zwei Zeichenfolgen miteinander. Die Option "/I" gibt an, dass nicht zwischen Groß- und Kleinschreibung unterschieden werden soll. Sie ist nur bei aktivierten Befehlserweiterungen verfügbar.
Abhängig vom Inhalt der Zeichenfolgen, wie beispielsweise wenn Leerzeichen enthalten sind, ist die Angabe von Anführungszeichen erforderlich. Diese Zeichen werden bei der Überprüfung aber mit einbezogen.
set var=Text if %var% == "Text" (echo TRUE) else echo FALSE if "%var%" == "Text" (echo TRUE) else echo FALSE
Ausgabe:
FALSE TRUE
Mögliche Vergleichsoperatoren sind:
Operator | Vergleich |
---|---|
== | gleich |
EQU | gleich |
NEQ | nicht gleich |
LSS | kleiner als |
LEQ | kleiner als oder gleich |
GTR | größer als |
GEQ | größer als oder gleich |
Außer "==" sind alle Vergleichsoperatoren nur bei aktivierten Befehlserweiterungen verfügbar. Enthalten beide Zeichenfolgen nur Zahlen, wird der Vergleich numerisch durchgeführt.
Um mit der selben IF-Abfrage auch einen Befehl auszuführen, wenn die Bedingung nicht erfüllt ist, kann das Schlüsselwort ELSE verwendet werden. ELSE muss sich mit IF auf der selben Zeile befinden. Da nicht zwischen den Leerzeichen der IF-Bedingung, ELSE und den Parametern der auszuführenden Befehle unterschieden werden kann, werden runde Klammern für das Einschließen des Befehls verwendet.
if exist test.txt (del test.txt) else echo test.txt not found.
Zwischen den Klammern können auch mehrere Befehle in mehreren Zeilen stehen, wie im nächsten Beispiel gezeigt wird. Zur besseren Lesbarkeit können Klammern auch dann verwendet werden, wenn diese nicht zwingend erforderlich sind, wie etwa nach ELSE und nur einem nachfolgenden Befehl.
if exist test.txt ( echo Removing test.txt ... del test.txt echo Done. ) else ( echo test.txt not found. )
FOR %Variable IN (Satz) DO Befehl [Parameter]
Der FOR-Befehl führt einen Befehl für einen Satz von Dateien aus.
Die FOR-Variablen unterscheiden zwischen Groß- und Kleinschreibung. In einem Batchprogramm müssen zwei Prozentzeichen verwendet werden, also "%%Variable".
Der Satz kann Dateien und Verzeichnisse, mit und ohne Platzhalter enthalten. Mehrere Dateien müssen durch ein Komma getrennt werden. Der jeweils aktuelle Dateiname wird in der FOR-Variable abgelegt.
for %i in (datei.txt, verzeichnis, dateien\*) do @echo %i
In diesem Beispiel wird der Befehl - die Ausgabe des Dateinamens mit ECHO - für die Datei "datei.txt", das Verzeichnis "verzeichnis" und alle Dateien im Verzeichnis "dateien" ausgeführt.
Wenn die Befehlserweiterungen aktiviert sind, werden zusätzliche Optionen unterstützt, die mehr Möglichkeiten bieten.
FOR /D %Variable IN (Satz) DO Befehl [Parameter]
Enthält eine Angabe im Satz einen Platzhalter, bezieht sich diese auf Verzeichnisse und nicht auf Dateien.
FOR /R [[Laufwerk:]Pfad] %Variable IN (Satz) DO Befehl [Parameter]
Der FOR-Befehl wird rekursiv für den angegebenen Pfad als Stammverzeichnis für jedes darunterliegende Verzeichnis ausgeführt. Wird kein Pfad angegeben, wird das aktuelle Verzeichnis verwendet. Enthält der Satz nur einen Punkt, werden nur die Verzeichnisse, gefolgt von einem Punk, ausgegeben.
FOR /L %Variable IN (Start,Schrittweite,Ende) DO Befehl [Parameter]
Mit der Option "/L" wird der Satz als eine Folge von Zahlen von Start bis Ende und der angegebenen Schrittweite interpretiert. Als Schrittweite kann auch eine negative Zahl angegeben werden, um rückwärts zu zählen. Der Satz (1,1,10) erstellt eine Zahlenfolge von 1 bis 10. Der Satz (32,-8,0) erstellt die Zahlenfolge 32, 24, 16, 8 und 0.
FOR /F ["Optionen"] %Variable IN (Dateiensatz) DO Befehl [Parameter] FOR /F ["Optionen"] %Variable IN ("Zeichenfolge") DO Befehl [Parameter] FOR /F ["usebackq Optionen"] %Variable IN (`Befehl`) DO Befehl [Parameter] FOR /F ["usebackq Optionen"] %Variable IN ("Datei"...) DO Befehl [Parameter]
Der FOR-Befehl öffnet alle Dateien im Dateiensatz und zerlegt sie zeilenweise basierend auf den angegebenen Optionen. Der Dateiensatz kann eine oder mehrere Dateien enthalten, aber keine Platzhalter.
Alternativ kann auch eine Zeichenfolge angegeben werden, die mit doppelten Anführungszeichen zu umgeben ist. Diese Zeichenfolge wird als einzelne Zeile betrachtet.
Auch ein Befehl kann ausgeführt und dessen Ausgabe für die Verarbeitung verwendet werden.
Die Verarbeitung erfolgt mit Trennzeichen, die jede Zeile in Teile zerlegt, in sogenannte Token. Jeder Token, der ausgegeben werden soll, wird in der FOR-Variable und den alphabetisch folgenden Variablen abgelegt. In diesem Fall der FOR-Schleife darf nur eine Variable mit einem Buchstaben von a bis z angegeben werden. Maximal 26 Variablen können so mit Tokens befüllt werden, sofern die FOR-Variable %a ist. Die folgenden Variablen werden automatisch generiert. Wurde beispielsweise als FOR-Variable %i angegeben und sollen die Token 1, 2 und 3 ausgegeben werden, enthält die Variable %i das Token 1, %j das Token 2 und %k das Token 3. Der FOR-Befehl unterscheidet bei den Variablen zwischen Groß- und Kleinschreibung.
Folgende Optionen sind möglich:
Werden keine Optionen angegeben, wird das erste Wort jeder Zeile in der Variable abgelegt.
Von FOR-Variablen kann ein bestimmter Teil zurückgegeben werden. Im Folgenden wird die FOR-Variable %i als Beispiel verwendet. Manche Angaben benötigen jedoch einen existierenden Datei- oder Verzeichnisnamen, damit die Ausgabe korrekt ist.
Ausdruck | Beschreibung |
---|---|
%~i | Entfernt vor der Ausgabe umschließende Anführungszeichen ("). Dies ist bei Datei- und Pfadnamen nützlich. |
%~fi | Gibt den vollständigen Dateinamen zurück. Wurde ein relativer Pfad angegeben, wird der vollständige Pfad ausgegeben. |
%~di | Gibt nur den Laufwerkbuchstaben mit dem Doppelpunkt zurück. |
%~pi | Gibt nur den Pfad zurück. |
%~ni | Gibt nur den Dateinamen ohne Erweiterung zurück. |
%~xi | Gibt nur die Dateierweiterung, inkl. dem Punkt, zurück. |
%~si | Gibt den kurzen Namen der Datei zurück. |
%~ai | Gibt die Dateiattribute zurück. |
%~ti | Gibt Datum/Zeit der Datei zurück. |
%~zi | Gibt die Dateigröße in Byte der Datei zurück. |
%~$PATH:i | Durchsucht die in der PATH-Umgebungsvariable angegebenen Verzeichnisse und expandiert die erste gefundene Datei %i zu dem vollständigen Dateinamen. Wenn der Name der Umgebungsvariablen nicht definiert ist oder diese Datei bei der Suche nicht gefunden wurde, wird dieser Parameter zu einer leeren Zeichenfolge expandiert. |
Die Parameter können auch miteinander kombiniert werden:
for /F "eol=; tokens=2,3* delims=, " %%i in (Datei.txt) do @echo %%i %%j %%k
Die Datei "Datei.txt" wird zeilenweise verarbeitet. Alle Zeilen, die mit einem Semikolon beginnen, werden ignoriert. Die Token 2 und 3 werden in den Variablen %i und %j abgelegt. Die restlichen Token werden in der Variable %k gespeichert.
for /F "usebackq delims==" %%i in (`set`) do @echo %%i
Listet die Namen aller Umgebungsvariablen auf. Als Trennzeichen wird das Gleichzeichen verwendet.
for /F "usebackq delims== tokens=1*" %%i in (`set`) do @echo %%i = "%%j"
Listet die Namen aller Umgebungsvariablen auf und gibt den Wert in Anführungszeichen aus, z.B.:
%ProgramFiles% = "C:\Program Files"
Gefällt dir meine Webseite, meine Freeware-Programme oder Online-Tools?
Dann spende bitte per PayPal und hilf mit, den Inhalt weiterhin kostenlos anbieten zu können - jeder Betrag ist willkommen!