Windows Batchprogramme

Dieser Artikel enthält Informationen zum Umgang mit dem Windows Befehlsinterpreter, sowie zu Variablen und wichtigen Befehlen in Batchprogrammen.

Inhalt

Befehlsinterpreter
Maskieren von Sonderzeichen
Dynamische Variablen
Erweiterung von Variablen
Umleitungen
Befehle verknüpfen
Lokale Variablen
Befehlserweiterungen
Verzögerte Erweiterung
Parameter und Argumente
SHIFT - Parameterposition verschieben
Text in Variablen verändern
Ersetzen und Ausschneiden von Text
Extrahieren von Text
PUSHD und POPD
CALL
SET
SET /A - Numerischen Ausdruck berechnen
SET /P - Benutzereingabe
SET /P - ECHO ohne Zeilenumbruch
IF
ELSE
FOR

Der Begriff "Batchprogramm" wird in der Hilfe von Microsoft oft verwendet, weshalb dieser auch hier verwendet wird. Es sind damit Batchdateien mit der Erweiterung .BAT bzw. .CMD gemeint.

Befehlsinterpreter

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.

Maskieren von Sonderzeichen

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.

Beispiele:
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.

Dynamische Variablen

Sind die Befehlserweiterungen aktiviert, werden vom Befehlsinterpreter zusätzliche Umgebungsvariablen unterstützt, die durch den SET-Befehl nicht angezeigt werden.

VariableInhalt
%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.

Erweiterung von Variablen

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.

Beispiele:
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.

Umleitungen

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.

Übersicht über gebräuchliche Umleitungen:
Befehl > Datei
Leitet die Ausgabe des Befehls in eine Datei um.
Befehl >> Datei
Fügt die Ausgabe des Befehls an eine Datei an.
Befehl < Datei
Sendet den Inhalt einer Datei als Eingabe an den Befehl.
Befehl 2> Datei
Leitet die Fehlermeldungen des Befehls in eine Datei um.
Befehl 2>> Datei
Fügt die Fehlermeldungen des Befehls an eine Datei an.
Befehl > Datei 2>&1
Leitet die Fehlermeldungen und die Ausgabe des Befehls in eine Datei um.
Befehl > Datei-A 2> Datei-B
Leitet die Ausgabe in die Datei-A und Fehlermeldungen in die Datei-B um.
Befehl 2> nul
Zeigt keine Fehlermeldungen des Befehls an. Alle Daten, die zum Gerät NUL gesendet werden, werden verworfen.
Befehl > nul 2>&1
Zeigt weder Fehlermeldungen, noch die Ausgabe des Befehls an.
Befehl > Datei 2> nul
Leitet die Ausgabe des Befehls in eine Datei um. Die Fehlermeldungen werden nicht angezeigt.
Befehl-A | Befehl-B
Sendet die Ausgabe von Befehl-A an die Eingabe von Befehl-B. Beispiel: "set | sort /R" zeigt die Ausgabe von SET in umgekehrter Reihenfolge an.

Befehle verknüpfen

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).

Beispiele:
Befehl-A & Befehl-B
Führt zuerst den Befehl-A und anschließend den Befehl-B aus.
Befehl-A && Befehl-B
Wenn der Befehl-A erfolgreich ausgeführt wurde, wird danach Befehl-B ausgeführt.
Befehl-A || Befehl-B
Wenn der Befehl-A nicht erfolgreich ausgeführt wurde, wird der Befehl-B ausgeführt.
Befehl-A && Befehl-B || Befehl-C
Wird der Befehl-A erfolgreich ausgeführt, wird Befehl-B ausgeführt, falls nicht, wird Befehl-C ausgeführt.

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!

Lese mehr über Unterstützungs­möglichkeiten...

Lokale Variablen

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.

Beispiel:
@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

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.

Verzögerte Erweiterung

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.

Beispiel:
@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.

Parameter und Argumente

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:

%0
Enthält den Namen der Batchdatei bzw. der Marke.
%1, %2...
Enthalten die Parameter, die beim Aufruf übergeben wurden.
%*
Enthält alle Parameter ab dem 1. Parameter, jeweils mit einem Leerzeichen getrennt.

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.

AusdruckBeschreibung
%~1Entfernt vor der Ausgabe umschließende Anführungszeichen ("). Dies ist bei Datei- und Verzeichnisnamen nützlich.
%~f1Gibt den vollständigen Dateinamen zurück. Wurde ein relativer Pfad angegeben, wird der vollständige Pfad ausgegeben.
%~d1Gibt nur den Laufwerkbuchstaben mit dem Doppelpunkt zurück.
%~p1Gibt nur den Pfad zurück.
%~n1Gibt nur den Dateinamen ohne Erweiterung zurück.
%~x1Gibt nur die Dateierweiterung, inkl. dem Punkt, zurück.
%~s1Gibt den kurzen Namen der Datei zurück.
%~a1Gibt die Dateiattribute zurück.
%~t1Gibt Datum/Zeit der Datei zurück.
%~z1Gibt die Dateigröße in Byte der Datei zurück.
%~$PATH:1Durchsucht 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:

%~dp1
Gibt den Laufwerkbuchstaben und den Pfad zurück.
%~nx1
Gibt den Dateinamen und die Dateierweiterung zurück.
%~tz1
Gibt das Datum/Zeit der Datei und deren Größe zurück.

%~ darf nicht mit %* verwendet werden.

Beispiel:
@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 verschieben

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.

Beispiel:
@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

Text in Variablen verändern

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.

Ersetzen und Ausschneiden von Text

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%

Beispiele:
%var:abc=XYZ%
Ersetzt alle Vorkommen von "abc" (unabhängig von der Großschreibung - also auch "aBc" oder "AbC") gegen den Text "XYZ".
%var: =%
Entfernt alle Leerzeichen.
%var:*test=TEST%
Wird vor dem Suchbegriff ein Stern (*) angegeben, wird der Suchtreffer und alles davor ersetzt. Enthält die Variable "var" den Wert "Das ist ein Test-Text", wird "TEST-Text" ausgegeben. Für das Entfernen des Textes nach dem Suchbegriff gibt es keine entsprechende Funktionalität.

Extrahieren von Text

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.

Beispiele:

Für folgende Ausdrücke wird angenommen, dass die Variable "var" den Text "1234567890" enthält.

AusdruckAusgabe
%var:~1,2%23
%var:~7%890
%var:~-3%890
%var:~-9,2%23
%var:~4,-2%5678

PUSHD und POPD

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.

Beispiel:
cd
pushd C:\Windows
cd
popd
cd

Wenn das aktuelle Verzeichnis "D:\Test" ist, wird folgendes ausgegeben:

D:\Test
C:\Windows
D:\Test

CALL

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.

Beispiel:
echo 1
call :marke
echo 3
goto :EOF

:marke
echo 2
goto :EOF

echo Dieser Text wird nicht ausgegeben.

Ausgabe:

1
2
3

SET

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 - Numerischen Ausdruck berechnen

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.

OperatorOperationAusdruck SET /A "..."ErgebnisAnmerkung
*Multiplikation2*336Multipliziert Zahlen.
/Division4/22Dividiert die erste Zahl durch die zweite Zahl.
%Modulo8%32Gibt den Rest einer Division zurück.
+Addition2+35Addiert Zahlen.
-Subtraktion3-21Subtrahiert Zahlen.
<<Logische Verschiebung Links8<<232Verschiebt die Bits einer Zahl nach links.
0000 1000 wird zu
0010 0000
>>Logische Verschiebung Rechts32>>28Verschiebt die Bits einer Zahl nach rechts.
0010 0000 wird zu
0000 1000
&Bitweises Und200&448Fü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 Oder200|44236Fü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 Oder200^44228Fü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 Variablevar=3
var+=2
5Fü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!10Negiert einen logischen Wert. 0 (False) wird zu 1 (True), 1 und jede Zahl außer 0 wird zu 0.
~Bitweise Invertierung~0xfffffffe1Invertiert eine 32-Bit-Zahl mit Vorzeichen bitweise.
( )Gruppierung von Operationen(1+2)*26Gruppiert Operationen. Ohne Klammern wäre das Ergebnis 5 (* vor +)
,Trennung von Ausdrückenvar=2+3,var*=210Ein Komma trennt mehrere Ausdrücke von einander.

SET /P - Benutzereingabe

SET /P Variable=[Eingabeaufforderung]

Der Parameter "/P" weist einer Variable eine Benutzereingabe zu. Zusätzlich kann eine Eingabeaufforderung angezeigt werden.

Beispiel:
@echo off
setlocal

set /P input="Please enter a text: "
echo You typed: %input%

endlocal

Ausgabe:

Please enter a text: Test
You typed: Test

SET /P - ECHO ohne Zeilenumbruch

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.

Beispiel:
<nul set /P="Current Directory: " & cd

oder

echo | set /P ="Current Directory: " & cd

Ausgabe:

Current Directory: C:\Windows

IF

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.

Beispiel:
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:

OperatorVergleich
==gleich
EQUgleich
NEQnicht gleich
LSSkleiner als
LEQkleiner als oder gleich
GTRgrößer als
GEQgröß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.

ELSE

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.

Beispiel:
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.

Beispiel:
if exist test.txt (
	echo Removing test.txt ...
	del test.txt
	echo Done.
) else (
	echo test.txt not found.
)

FOR

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.

Beispiel:
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:

eol=Zeichen
Gibt das Zeichen für Kommentarzeilen an. Zeilen, die mit diesem Zeichen beginnen, werden nicht verarbeitet. Es kann nur ein einzelnes Zeichen angegeben werden.
skip=Zeilenanzahl
Gibt die Anzahl der Zeilen an, die am Anfang einer Datei übersprungen werden.
delims=Delimiter
Gibt einen oder mehrere Trennzeichen an, welche die Standardtrennzeichen Tabulator und Leerzeichen ersetzen. An diesen Trennzeichen wird die Zeile aufgeteilt. Die Trennzeichen selbst werden nicht ausgegeben.
tokens=X,Y,M-N
Gibt an, welche Token in die Variablen abgelegt werden sollen. Die einzelnen Token sind mit einem Komma von einander zu trennen. Ein Bindestrich ermöglicht die Angabe eines Bereichs, z.B. "3-5" für das Token 3, 4 und 5. Ist das letzte Zeichen ein Sternchen (*) wird der verbleibende Text in eine zusätzliche Variable abgelegt.
usebackq
Gibt an, dass der Befehl in umgekehrte Anführungszeichen (`) ausgeführt werden soll. Werden doppelte Anführungszeichen verwendet, wird der Satz als Datei bzw. Dateiliste angesehen, statt als Zeichenkette. Dadurch können Dateinamen mit Leerzeichen angegeben werden.

Werden keine Optionen angegeben, wird das erste Wort jeder Zeile in der Variable abgelegt.

Ersetzungen in FOR-Variablen

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.

AusdruckBeschreibung
%~iEntfernt vor der Ausgabe umschließende Anführungszeichen ("). Dies ist bei Datei- und Pfadnamen nützlich.
%~fiGibt den vollständigen Dateinamen zurück. Wurde ein relativer Pfad angegeben, wird der vollständige Pfad ausgegeben.
%~diGibt nur den Laufwerkbuchstaben mit dem Doppelpunkt zurück.
%~piGibt nur den Pfad zurück.
%~niGibt nur den Dateinamen ohne Erweiterung zurück.
%~xiGibt nur die Dateierweiterung, inkl. dem Punkt, zurück.
%~siGibt den kurzen Namen der Datei zurück.
%~aiGibt die Dateiattribute zurück.
%~tiGibt Datum/Zeit der Datei zurück.
%~ziGibt die Dateigröße in Byte der Datei zurück.
%~$PATH:iDurchsucht 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:

%~dpi
Gibt den Laufwerkbuchstaben und den Pfad zurück.
%~nxi
Gibt den Dateinamen und die Dateierweiterung zurück.
%~tzi
Gibt das Datum/Zeit der Datei und deren Größe zurück.
Beispiele:
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!

Lese mehr über Unterstützungs­möglichkeiten...




Diese Webseite verwendet Cookies und verarbeitet Daten. Informationen zur Datenverarbeitung sowie zur Möglichkeit, diese abzulehnen, finden Sie in der Datenschutzerklärung. Ok