| 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
|
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
echo PATH(vorher)=%PATH%:: (temporär !) set PATH=%PATH%;c:\scripts echo PATH(nachher)=%PATH% :: Ausgabe von Variablen
set pathset p :: Löschen einer Variablen
set x=
|
||||||||||
Lange und kurze DateinamenDOS 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:
|
||||||||||
|
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-RegistryDie 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. 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
Die links gezeigte Pfad-Zuweisung ist jedoch nur temporär gültig. Eine
dauerhafte Zuweisung kann man hier eintragen:
C:\irgendwo> t2 D:\> t3 D:\irgendwo\anders> t4 |
||||||||||
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-VolumesDie 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 !!!
set x =
abc
:: Variable %x % mit Wert " 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%
Ergebnis: Die beiden letzten Anweisungen zeigen an:
C:\> set y y=123 abc 456 xyz
|
TestDer 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 |
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:
|
||||||||||||
|
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". 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% xyzecho 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
Ausführung des Beispiel-Programms sollte liefern: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 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
ergibt: r=***bbb und s=aa*bb set r=%x:a=*% set s=%x:ab=*% • 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:-=%
Ausführung des Beispiels sollte liefern:set ciso=%ciso: =% set ciso=%ciso::=% set ciso=%ciso:~0,-3% echo Compact ISO: %ciso% 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ängeFalls 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%1set /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 00echo errorlevel=%errorlevel% |
| ERRORLEVEL wird häufig in bedingten → Verzweigungen verwendet | if errorlevel 1 ... |
|
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=123color 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 ReichweiteManchmal 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
|
|
|
| Rob van der Woude - SET, ERRORLEVEL | |
|