CMD-Script-Variable

System-Variable und Private Script-Variable

Script-Programme können Variable verwenden. Häufig werden System-Variable eingesetzt, eigene private Variable sind ebenfalls möglich. Variable können Strings oder Zahlen speichern, mit Zahlen-Variablen kann auch gerechnet werden.
CMD Die Windows-(DOS)-Konsole
System Die Umgebungs-Variablen des Systems
Eigene Datei Angaben zur eigenen Script-Programm-Datei
Privat Eigene "private" Variablen von Script-Programmen
Interaktiv Interaktive Eingabe von Variablen-Werten
Datei Zeile einer Text-Datei an eine Variable zuweisen
Rechnen Einfache ganzzahlige Arithmetik mit Variablen
Strings String-Operationen mit (Text)-Variablen
ERRORLEVEL Fehler-Variable
Löschen Löschen von Variablen
Umgebung Unverbindliche Liste einiger Umgebungs-Variablen (Environment)
Links Ausgewählte Shell-Script-Links Links zum Thema 'Script-Variable'

Die Umgebungs-Variablen (environment variables) des Systems

Jedes Betriebssystem legt einige wichtige Daten in Form von Umgebungs-Variablen fest, die für alle Programme zugänglich sind. Einige (!) der aktuellen Systemvariablen ihres Win-PC finden sie hier: So können sie die aktuellen Werte lesen, ändern, oder neue Variable erstellen. Die Umgebungs-Variablen sind außerdem für alle installierten Programme zugänglich.
Eine unverbindliche ↓ Liste von aktuellen System-Variablen finden sie auf dieser Seite.
In neueren Versionen führt Windows 2 verschiedene Typen vom Umgebungs-Variablen:
Systemvariable
Sind für alle BenutzerInnen gültig.
BenutzerInnen-Variable:
Werden für jede/n einzelne/n BenutzerIn angelegt und sind nur für diese/n gültig.
Kombination:
Bei der Anmeldung (Login) werden die Systemvariablen mit jenen der/des BenutzerIn kombiniert / erweitert.
Wenn man Allgemeine Änderungen der Systemvariablen vornimmt, dann sollen diese in den meisten Fällen für alle BenutzerInnen wirksam sein (z.B. Installation von → Java, → Perl, ...). Verwenden sie daher die System-Variablen.

Lesen und Schreiben von Variablen:

Mit Script-Programmen haben sie Zugriff auf alle Systemvariablen.
Die Zuweisung (Schreiben) erfolgt mit Befehl SET.
Ausnahme: Systemvariable können mit der Konsole zwar geschrieben werden, die Änderungen gelten jedoch nur während der aktuellen Session.
Zur Verwendung (Lesen) wird der Name der → Variablen in %% eingeschlossen. (z.B. mit Anweisung set oder echo )
SET ohne Zuweisung gibt den aktuellen Wert aus.
SET mit einem Buchstaben ohne Zuweisung gibt alle Variablen mit diesem Anfangsbuchstaben aus.
Beachten sie den kleinen (!) Unterschied zum → Löschen von Variablen !

Im Beispiel wird die Variable PATH um einen Pfad ergänzt.
:: Schreiben & Lesen einer privaten Variablen
set x=%DATE%
echo Mein Datum = %x%
:: Ergänzung einer Systemvariablen
::     (temporär !)
echo PATH(vorher)=%PATH%
set PATH=%PATH%;c:\scripts
echo PATH(nachher)=%PATH%
:: Ausgabe von Variablen
set path
set p
:: Löschen einer Variablen
set x=

Lange und kurze Dateinamen

DOS konnte nur Dateinamen <=8 Zeichen bearbeiten. Längere Dateinamen werden durch eine spezielle Formulierung gekürzt:
+ Die ersten 6 Zeichen werden beibehalten
+ Dann folgt ein ~ Zeichen
+ Dann folgt eine Zahl, welche die Reihenfolge der Datei angibt.
Eine spezielle Option bei der → Decodierung von Dateinamen liefert Kurznamen.
So werden die Kurznamen aller Dateien bequem angezeigt:
C:\> dir /X
Beispiel für lange und kurze Dateinamen:
Voller Name (sortiert !)Kurz-Version
Langer_Dateiname.datLANGER~1.DAT
Langer_FileName.datLANGER~2.DAT
Langer_Name.datLANGER~3.DAT
test.dattest.dat
Alle Programmiersprachen und einige Anwendungs-Programme bieten die Möglichkeit, auf die → Umgebungs-Variablen zuzugreifen.
Die Grundlage bilden dabei die SYSTEM-Variablen. Je nach angemeldetem USER können diese Daten modifiziert und/oder ergänzt werden. Die dritte Ebene PROCESS wird von den ausgeführten Programmen verwendet.
Alle diese Daten bieten für EntwicklerInnen die Möglichkeit, ihre Programme flexibel an die aktuellen Bedingungen anzupassen:

→ Excel - Funktion 'INFO'
Programmiersprachen: → Perl, → PHP, → VBA/VBScript, ...

Windows-Registry

Die Umgebungs-Variablen sind in der Registry-Datenbank organisiert. Für jeden User ist ein eigener Satz solcher Variablen vorgesehen:
HKEY_LOCAL_MACHINE | System | ControlSet001 | Session Manager | Environment
Die weiteren Sätze finden sie durch Austausch von ControlSet001 durch ControlSet002, usw.
Bei Anmeldung (Login) wird der Variablen-Satz des betreffenden Users in den Satz CurrentControlSet kopiert. Nur dieser aktuelle Satz enthält daher die aktuell wirksamen Umgebungs-Daten.

Diese Daten sind mit dem Programm regedit.exe zugänglich, das in jedem Windows-System enthalten ist.
Vorsicht - eine unbedachte Änderung der Registry-Daten kann irreparable Schäden an Betriebssystem, Software und Daten anrichten !

Man kann das Programm regedit.exe über die Konsole bedienen und ihm Argumente mitgeben. Beispiel: Syntax zum Export von Registry-Daten in eine Text-Datei:
C:\> regedit /e env.txt HKEY_LOCAL_MACHINE\SYSTEM\...
(ergänzen sie den Pfad zum CurrentControlSet ). Kontrollieren sie den Text der erzeugten Datei mit einem Text-Editor.

Verzeichnis für (eigene) Programme

Tipp: Zum Experimentieren mit eigenen CMD-Script-Programmen hat es sich bewährt, ein spezielles Verzeichnis für die *.cmd Dateien einzurichten, z.B.
C:\Programme\_prox
Das führende _ Underline-Zeichen bewirkt, dass dieses Verzeichnis alphabetisch als erstes gelistet wird.

Ergänzen sie die System-Variable PATH um diesen Pfad, z.B.:
set PATH=%PATH%;c:\programme\_prox
Danach können sie alle ausführbaren Dateien in diesem Verzeichnis mit ihrem Datei-Namen starten, und zwar ohne Angabe des Pfads und - bei sauberer Konfiguration des Systems - auch ohne Angabe der Datei-Erweiterung.

Beispiel: Wenn sich im angegebenen Verzeichnis die Dateien t1.cmd, t2.exe, t3.pl, t4.php ... befinden, kann man sie in jedem Konsolen-Fenster so bequem starten:
C:\> t1
C:\irgendwo> t2
D:\> t3
D:\irgendwo\anders> t4
Die links gezeigte Pfad-Zuweisung ist jedoch nur temporär gültig. Eine dauerhafte Zuweisung kann man hier eintragen:

Die eigene (Script)-Datei

Einige spezielle Variablen geben Auskunft über die eigene Datei (Script-Programm *.bat oder *.cmd).
Sie werden wie ein nicht übergebenes 'Nulltes Argument' behandelt.

Das Beispiel rechts zeigt einige Anwendungen: Zuerst die Ausgabe des Arguments %0 (der eigene Datei-Name), danach die Verarbeitung ('Expansion') dieses Arguments durch Voranstellen verschiedener Buchstaben.

Details zu Argumenten
Angaben über die eigene Datei:
echo Argument 0 = %0
echo Attribute: %~a0
echo Drive: %~d0
echo vollstd.DateiName: %~f0
echo Name: %~n0
echo Pfad: %~p0
echo Kurz-Pfad: %~s0
echo Datum-Zeit: %~t0
echo Erweiterung: %~x0
echo Groesse: %~z0

USB-Volumes

Die Variable %~d0 wird u.a. zur bequemen Verwendung von USB-Datenträgern eingesetzt.

Mobile Volumes (USB-Sticks und -Festplatten) erhalten auf jedem PC einen anderen Laufwerks-Buchstaben. Es ist daher schwierig, die Anwendung der immer zahlreciher werdenden portablen Programme zu automatisieren.

Mit Hilfe der Variablen %~d0 kann ein auf dem mobilen Volume enthaltenes Script-Programm seinen eigenen Laufwerks-Buchstaben erkennen und diesen selbst verwenden bzw. anderen Programmen mitteilen.

Private Variable

Private Variable werden durch Zuweisung deklariert. Die Zuweisung erfolgt mit SET. (genauso wie mit dem manuellen Konsolen-Befehl SET ).
Achtung: Verwenden sie bei der Zuweisung keine Leerzeichen !
Sie erzeugen sonst (irrtümlich) Variable mit Leerzeichen im Namen oder im Wert !
set x=123
set yy=xyz
:: Vorsicht !!!
:: Variable %x % mit Wert " abc"
set x = abc
Zur Verwendung wird der Name einer Variablen in %% eingeschlossen: Bei Verarbeitung wird %x% zum aktuellen Wert von x "expandiert"
Alternative: "delayed expansion": !x!
SET setzt bei jeder Ausführung die Systemvariable ERRORLEVEL
set x=%x% abc
set y=%x% 456 %y%
Die Lebensdauer einer privaten Variablen ist auf das Konsolen-Fenster beschränkt. Die Reichweite ist global - alle Script-Programme können darauf ebenso zugreifen wie manuell eingegebene Befehle.
C:\> echo y=%y%
C:\> set y
Ergebnis: Die beiden letzten Anweisungen zeigen an:
y=123 abc 456 xyz

Test

Der Operator defined dient in einer → Bedingten Verzweigung zur Feststellung, ob eine Variable bereits definiert wurde:
@echo off
set d=definiert
if not defined x set d=nicht %d%
echo Variable x ist %d%
@echo on

Interaktive Eingabe

set mit Option /P wartet auf die Eingabe der Variablen von der Konsole. Zweckmäßig geben sie einen Aufforderungs-Text ein.
Diese Option wird selten verwendet - Der Schwerpunkt der Anwendung von Script-Programmen ist die Automatisierung.
@echo off
set /P x="Geben sie einen Text ein: "
echo Ihr Text = %x%
@echo on
Wenn die/der AnwenderIn lediglich die Eingabe-Taste drückt, dann erfolgt keine Zuweisung, d.h. die Variable behält ihren vorigen Wert.
Deshalb ist es sinnvoll, der Variablen unmittelbar vor der Eingabe einen Standard-Wert zuzuweisen.
:: Standard-Wert
set x=123
echo StandardWert=%x%
set /P x="Neuer Wert: "
echo x = %x%

Wert aus einer Text-Datei

Man kann set mit Option /P auch dazu verwenden, um den Inhalt einer Text-Datei an eine Variable zuzuweisen. Da eine Variable jedoch keinen Zeilen-Umbruch enthalten kann, wird lediglich die erste Zeile der Datei verwendet.
Wenn die Datei leer ist oder nicht existiert, dann wird der Wert der Variablen nicht geändert. Es ist daher sinnvoll, vor der Zuweisung einen Standard-Wert einzutragen.
Setzt den Wert der Variablen z1 auf einen Standard-Wert (hier: abc), danach auf die erste Zeile der angegebenen (Text)-Datei und zeigt den Wert an:
set z1=abc
set /p z1=<C:\Daten\beispiel.txt
echo z1=%z1%

Rechnen mit Variablen

SET mit Option /A führt einfache arithmetische Rechnungen durch.
Es werden nur ganze Zahlen verwendet, ein allfälliger Nachkommarest wird abgeschnitten.
Strings werden ohne Fehlermeldung ignoriert und wie die Zahl 0 behandelt, Leerzeichen werden ignoriert.
@echo off
set /P x="Geben sie eine Zahl ein: "
echo x = %x%
set /A y=%x% + 1
echo y = %y%
@echo on
Im Internet finden sich zahlreiche Warnungen vor Fehlern (Missverständnissen ?) beim Rechnen mit Variablen. - Testen sie daher ihre Script-Programme sorgfältig !

Details zu logischen BitLevel-Operatoren
Operatoren:
( )Gruppierung
+ -Addition, Subtraktion
* /Multiplikation, Division (ganzzahlig !)
% Modulo (Rest)
<< >>Logischer Shift
& ^ |Logisches AND, XOR, OR
So funktioniert ein einfacher Zähler:
Wenn dieses Programm (innerhalb eines Konsolen-Fensters) mehrfach aufgerufen wird, dann zählt es jedesmal um +1 weiter.
Zur sicheren Weitergabe von Daten verwendet man jedoch besser → Dateien.
Zähler:
@echo off
set /A c=%c% + 1
echo c = %c%
@echo on

Umwandlung in Zahlen:

Die Umwandlung von → Argumenten und Strings in Zahlen erfordert einige Tricks:
Zunächst wird Argument %1 an die Variable n übergeben. Ein führendes Zeichen 0 stellt die Zuweisung bei leerem Argument %1 sicher.
Danach wird n mit einer arithmetischen Zuweisung auf eine Zahl gesetzt.
Umwandlung des ersten Argumentss in eine Zahl:
@echo off
set n=0%1
set /a n=%n%+0
@echo on

String-Operationen mit Variablen

Die Verkettung von Strings erfolgt durch 'Aneinander-Reihen' ohne Operator. Variable werden in %% eingeschlossen, jeder andere Text wird so verwendet "wie eingegeben".

Wenn eine Anweisung Leerzeichen enthält, werden diese wie ein String verkettet !
Nur das erste Leerzeichen nach einem Befehlswort wird als Trennzeichen interpretiert.
set s=abc
set t=%s%xyz
echo Ergebnis = %t%
:: Ausgabe: Ergebnis = abcxyz
set s=%t% xyz
echo Resultat = %s%
::Ausgabe: Resultat = abc xyz
Sonderzeichen werden bei vorangestelltem ^ nicht interpretiert sondern als Text-Zeichen verwendet ('maskiert').
set w=black ^& white
Teil-Strings werden durch den Operator : nach dem Namen der Variablen definiert, z.B. mit %DATE:%
Nach dem : folgen entweder die ↓ Zeichen des Teil-Strings oder der ~ Operator mit 2 Zahlen, welche Position und Länge des Teil-Strings angeben.
Die folgenden Beispiele zum Thema Teil-Strings setzen voraus, dass ihr Windows-System mit den meist-verwendeten Formaten konfiguriert ist, z.B.
echo %DATE%   liefert 31.02.2010
echo %TIME%   liefert 12:34:56,78
Teil-Strings durch Angabe von Position und Länge
In der Form :~a,b bezeichnet die Zahl a das erste Zeichen (Zählbeginn mit 0), die Zahl b die Länge des Teil-Strings.

Beispiel: %x:~6,4% bezeichnet einen Teil-String von 4 Zeichen Länge, beginnend an Position 6 des Strings %x%

Wenn keine Länge b angegeben ist, dann wird der gesamte Rest des Strings bis zum Ende bezeichnet.
Beispiel: %x:~3% entnimmt alle Zeichen von Position 3 bis zum Ende des Strings.

Negative Argumente:
%x:--3% bezeichnet die letzten 3 Zeichen.
%x:~0,-3% bezeichnet alle außer den letzten 3 Zeichen.

Beispiel: Zusammenstellung eines nach → ISO-Standard formatierten Strings aus Teil-Strings von System-Datum und Zeit:
@echo off
set iso=%DATE:~6,4%
set iso=%iso%-%DATE:~3,2%
set iso=%iso%-%DATE:~0,2%
set iso=%iso% %TIME:~0,8%
echo ISO Datum+Zeit: %iso%
@echo on
Ausführung des Beispiel-Programms sollte liefern:
ISO Datum+Zeit: 2010-11-01 12:34:56

Tipp: Ein Standard-konformes Datum erhält man besser durch Einstellung dieser Registry-Daten:
HKEY_USERS\.DEFAULT\Control Panel\International\sShortDate=yyyy-MM-dd
HKEX_CURRENT_USER\Control Panel\International\sShortDate=yyyy-MM-dd

Teil-Strings ersetzen

(Teil-Strings durch Angabe von Zeichen)
In der Form %x:y=z% bezeichnet der String y (aus 1 oder mehreren Zeichen) jeden Teil-String von %x%, der gleich y ist.
Die weitere Verarbeitung ist offenbar nur mit einem nachfolgenden = Operator möglich, welcher einen Ersatz-String z angibt.
Beispiel:
set x=aaabbb
set r=%x:a=*%
set s=%x:ab=*%
ergibt: r=***bbb und s=aa*bb

Wenn z nicht angegeben ist, dann werden alle Teil-Strings y aus dem String gelöscht: Das ist praktisch, um unerwünschte Zeichen wie Leerzeichen, " DoubleQuotes u.a. zu entfernen.

Beispiel: Erzeugung der kompakten Variante des Standard → ISO-Strings für Datum und Zeit. Das Beispiel verwendet die im letzten Absatz definierte Variable %iso% und entfernt der Reihe nach alle -, Leerzeichen und : Zeichen. Zuletzt werden die Nachkomma-Stellen abgeschnitten:
set ciso=%iso:-=%
set ciso=%ciso: =%
set ciso=%ciso::=%
set ciso=%ciso:~0,-3%
echo Compact ISO: %ciso%
Ausführung des Beispiels sollte liefern:
Compact ISO: 20101101123456

Tipp: Solche Strings haben eine fixe Länge und eignen sich als Zeit-Marken oder als Bestandteile von Datei-Namen (werden alphabetisch immer korrekt nach Datum sortiert).
Ein Leerzeichen (blank) wird mit einem Trick zugewiesen:
Variable blk wird als String der 3 Zeichen [ ] definiert. Danach wird nur das 2.Zeichen (=Leerzeichen) herausgeschnitten.
Anwendungs-Beispiel: Variable test erhält den Wert x y z

set blk=[ ]
set blk=%blk:~1,1%
set test=x%blk%y%blk%z

Text-Strings fixer Länge

Falls eine Text-Datei mit Spalten erstellt werden soll, dann ist eine gleichbleibende Text-Länge gefordert.
In diesem Beispiel wird das erste → Argument %1 in einen Text der fixen Länge 10 umgewandelt.
Zuerst wird der String rechts mit ausreichend vielen (hier 10) Leerzeichen ergänzt, am Ende wird ein beliebiges Zeichen angehängt.
Danach wird der String von links begrenzt.
Für die Ausgabe wurden [] angebracht, damit die wahre Länge des Strings sichtbar wird.
@echo off
:: String -> Text-String der Länge 10
set s=%1          #
set s=%s:~0,10%
echo [%s%]
@echo on

Zahlen-Strings fixer Länge:

Für die Eintragung in Text-Spalten oder für die korrekte Sortierung müssen Zahlen-Strings häufig auf eine fixe Länge gebracht werden:
In diesem Beispiel wird das erste → Argument %1 in einen Text der fixen Länge 5 umgewandelt.
Zuerst wird die Zahl links mit führenden Nullen (oder Leerzeichen) ergänzt, danach wird der String von rechts begrenzt.
@echo off
:: Argument 1 -> Zahl
set z=0%1
set /a z=%z%+0
:: Zahl -> Zahlen-String der Länge 5
set s=00000%z%
set s=%s:~-5%
echo %s%
@echo on
Details zu Argumenten (Parametern) und zur Extraktion von Dateinamen aus Argument-Daten.

Die Fehler-Variable ERRORLEVEL

Mit jedem SET-Befehl wird die Variable ERRORLEVEL neu gesetzt. Bei korrekter Ausführung ist ERRORLEVEL=0, bei Fehler ERRORLEVEL>0

Im Beispiel wird zuerst die Variable x fehlerfrei gesetzt.

Anschließend wird mit color 00 ein Fehler provoziert.

Vom klassischen DOS-Beteriebssystem stammen die Zahlen 0..255 als Werte von ERRORLEVEL
set x=123
:: Funktioniert:
echo errorlevel=%errorlevel%
:: Provoziert einen Fehler:
color 00
echo errorlevel=%errorlevel%
ERRORLEVEL wird häufig in bedingten → Verzweigungen verwendet
if errorlevel 1 ...
Führen sie keinesfalls eine Zuweisung an die Fehler-Variable durch !
Sie wird dadurch zur privaten Variablen und nicht mehr als Fehlervariable gesetzt.
Wenn man danach die Fehler-Variable ↓ löscht, dann funktioniert sie wieder wie gewohnt.
:: Nicht zuweisen !
set errorlevel=123
color 00
echo errorlevel=%errorlevel%
:: Reparatur
set errorlevel=

Löschen von Variablen

Die Ausführung von set mit dem Zeichen = jedoch ohne Zuweisung eines Wertes löscht die entsprechende Variable.
Mit Hilfe einer → Bedingten Verzweigung kann man den Erfolg dieser Maßnahme testen.
:: Dieser Befehl löscht Variable x
set x=

Umgebungs-Variable (Environment)

Zusätzlich empfohlen:
HTTP_PROXY zeigt Programmen (z.B. → Perl) den Pfad zum Proxy-Server. Umgebungs-Variable sind transparent und vermeiden das Stöbern in der Registry-Datenbank.
Einstellung (ersetzen sie Adresse und Port):
C:\> SET HTTP_PROXY=192.168.0.1:1234
Umgebungs-Variable sind ein sehr empfehlenswerter Weg, um wichtige Daten an mehrere Programme zu übergeben.
Mit modernen Programmiersprachen (z.B. → Perl) ist es möglich, auch auf Windows-Systemen zusätzliche System-Variable anzulegen.
Einige wenige (!) dieser Variablen sind unter gleichen Namen auch auf Linux verfügbar, darunter PATH
Die Anweisung SET bietet die Möglichkeit, alle oder nur bestimmte Umgebungs-Variablen an eine Text-Datei auszugeben:
C:\> SET >> C:\env.txt
C:\> SET P >> C:\env.txt
C:\> SET PATH >> C:\env.txt
Diese Text-Datei kann man mit jedem geeigneten Programm lesen und anzeigen (z.B. mit notepad.exe)
Ein * Stern bezeichnet Variable, die nur für Script-Programme zur Verfügung stehen, jedoch in der mit SET ausgegebenen Liste nicht oder in anderer Form enthalten sind, z.B.
CMDCMDLINE, CMDTEXTVERSION, DATE, ERRORLEVEL, RANDOM, TIME
RANDOM gibt eine Zufallszahl im Bereich 0..32768 zurück (216-1 = 32768) , z.B.
C:\> echo %random%

Lokale Reichweite

Manchmal ist es sinnvoll, die Werte von Umgebungs-Variablen zu ändern, die Wirkung jedoch zu begrenzen.
Beispiel rechts: Die Umgebungs-Variable PATH wird so ergänzt, dass Programme bevorzugt in einem bestimmten Pfad (hier C:\Daten) gesucht werden. Nach Ausführung der Programme wird die lokale Wirkung aufgehoben und die Umgebungs-Variable hat wieder ihren vorherigen Wert.

Temporäre lokale Ă„nderung der Umgebungs-Variablen PATH
setlocal
set PATH=C:\Daten;%PATH%
myprog.cmd
endlocal

Ausgewählte Links zum Thema 'Script-Variable'

Rob van der Woude - SET, ERRORLEVEL