Windows Batchprogramme

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

Gefällt dir meine Webseite, meine Freeware-Programme oder Online-Tools?

Spende per PayPal und unterstütze die kostenlose Veröffentlichung mit einem beliebigen Betrag schnell und einfach.

Erlaube für die Domain Gaijin.at in deinem Werbe-Blocker die Anzeige von Werbung und hilf damit beim Erhalt dieser Seite!

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

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

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.

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

Gefällt dir meine Webseite, meine Freeware-Programme oder Online-Tools?

Spende per PayPal und unterstütze die kostenlose Veröffentlichung mit einem beliebigen Betrag schnell und einfach.

Erlaube für die Domain Gaijin.at in deinem Werbe-Blocker die Anzeige von Werbung und hilf damit beim Erhalt dieser Seite!

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