Variablen und Umgebungsvariablen mit SET in Batch Dateien Verfasst am: 31.05.2009, 22:06
In BAT-Ablaeufen lassen sich Variable benutzen, die als sogenannte
"Umgebungsvariable" in einem besonderen Speicherbereich gefuehrt
werden. Auf Konzeption und Bedeutung dieser Umgebungsvariablen-
Speicher soll hier nicht weiter eingegangen werden. Wichtig ist
zunaechst nur, dass dieser Bereich eine (variable) Liste von
Zuweisungen enthaelt.
Jede Zuweisung besteht aus einem Variablennamen und einer Zeichenfolge
(string), getrennt durch das Gleich-Zeichen, z.B.:
PROMPT=$p$g
TEMP=C:\WORK\TEMP
Der aktuelle Inhalt des Speichers kann jederzeit mit dem Befehl
SET (ohne Angaben!) auf der DOS-Befehlsebene geprueft werden.
COMMAND.COM bedient sich dieses Speichers, um bestimmte Informationen
zu ermitteln, z.B. die Verzeichnispfade, in denen
Programme gesucht werden sollen (PATH) oder die Darstellung der
Eingabeaufforderung auf der Befehlsebene (PROMPT). Aber auch
andere Programme koennen diese Informationen nutzen.
Die wichtigste Verwendung bietet sich jedoch in BAT-Dateien:
* Mit der SET-Anweisung koennen neue Zuweisungen aufgenommen,
bestehende geaendert oder geloescht werden (moeglich auch auf
der Befehlsebene).
Beispiel: SET WORT=das (neue Zuweisung oder Aenderung)
SET WORT= (Loeschung: Leer-Zuweisung)
* Durch Angabe des Variablennamens, eingeschlossenen in Prozentzeichen,
kann die aktuelle Zuweisung an jeder beliebigen
Stelle der BAT-Datei eingesetzt werden (NICHT jedoch auf der
Befehlsebene).
Beispiel: ECHO Die Variable WORT enthaelt %WORT%
Im BAT-Ablauf untersucht DOS jede Zeile vor der Ausfuehrung auf
%-Zeichen, um Variable durch die zugewiesene Zeichenfolge zu ersetzen.
Dabei ist es gleichgueltig, ob sich die Variable in einem
Text, einer Anweisung, einem GOTO-Ziel oder in sonstigen Angaben
befindet. Ausgenommen sind nur Labels. Ist eine Variable nicht
vorhanden, wird nichts eingesetzt, d.h. der %...% Ausdruck wird
einfach entfernt.
Hinweis:
Um das Prozentzeichen in einem Text zu zeigen, muss es verdoppelt
werden. Beispiel: ECHO Zuzueglich 15%% MwSt.
Regeln fuer Variablen-Namen
Bei Variablen-NAMEN wird Groá-/Kleinschreibung NICHT unterschieden
(es wird generell in Groábuchstaben umgewandelt). Die zugewiesene
Zeichenfolge wird dagegen immer unveraendert gespeichert.
Variablen-Namen duerfen nicht mit einer Ziffer beginnen, denn
%0...%9 sind fuer Befehlsparameter reserviert.
Bitte nicht versehentlich Variablennamen verwenden, die bereits
von DOS oder von Programmen benutzt werden (wie z.B. PATH oder
PROMPT).
Beim SET-Befehl werden im Variablen-Namen auch Sonderzeichen und
sogar Leerzeichen akzeptiert (kein Witz!). Um Problemen aus dem
Wege zu gehen, sollten aber nur Zeichen verwendet werden, die auch
in Dateinamen gueltig sind (ausgenommen "%"). Eine besondere Falle
fuer Ahnungslose ist das Leerzeichen am Ende des Namens:
SET TEST = JA
^
Hier ist der Variablen-Name nicht "TEST", sondern "TEST " (!)
Also: zwischen Name und "=" bitte KEIN Leerzeichen!
Inhalt der zugewiesenen Zeichenfolge
Mit SET wird der Variablen der gesamte Rest der Zeile zwischen
dem Gleichzeichen und CR zugewiesen. Die Zeichenfolge kann also
auch aus mehreren Woertern bestehen.
Beispiel: SET TEXT=Bitte Taste druecken!
Auch Leerzeichen nach dem "=" sowie eventuelle Leerzeichen am
Ende der Zeile (falls der Editor sowas nicht unterdrueckt) sind
Teil der zugewiesenen Zeichenfolge!
Es gibt also keinerlei Begrenzungszeichen. DOS nimmt praktisch
jedes Zeichen, sogar Control-Codes. Nur ein "=" in der Zeichenfolge
wird reklamiert (Syntax-Fehler).
Eine Variable kann auch eine ganze Pararmeter- oder Argument-Liste
enthalten, die sich dann mit CALL oder FOR wieder zerlegen laesst.
Hier ein Beispiel (!):
FOR %%a in (%PATH%) do ECHO %%a
Verkettung, Kombinationen
Natuerlich kann die zugewiesene Zeichenfolge ihrerseits Variable
enthalten, besser gesagt: die aktuellen Zuweisungen von Variablen.
denn diese werden ja vor Interpretation der Zeile eingesetzt.
Beispiele:
SET X=%X%/D
SET COM=%BEF% %QUELLE% %ZIEL%
SET PATH=%PATH%;C:\XYZ
FOR %%x in (A a B b) do IF %LW%==%%x set LW=%LW%:
^
Variable und IF
Solange eine Variable nur ein einfaches Wort enthaelt, koennen
IF-Abfragen wie bei Befehlsparametern gemacht werden. Aber auch
hier gelten die Grundregeln:
* Gross-/Kleinschreibung wird unterschieden
* Leere Variable gefaehrden die Syntax
Immer daran denken, dass DOS erst dann anfaengt, eine Zeile zu
interpretieren, nachdem alle Variablen eingesetzt sind.
Zur Abfrage auf leere Variable bzw. von moeglicherweise leeren
Variablen siehe Lektion #9. Beispiele:
IF "%LW%"=="A:" goto OK
IF !%LW%==! goto FEHLER
Wenn allerdings eine Variable mehrere Woerter enthaelt (getrennt
durch Leerzeichen, Komma, Semikolon), dann wird's gefaehrlich.
* Mehrere Woerter NACH dem "==" bringen die Syntax durcheinander
(verglichen wird ohnehin nur das erste Wort).
* Bei mehreren Woertern VOR dem "==" gibt es zwar keinen Fehler,
aber es wird nur das erste Wort zum Vergleich herangezogen!!
(Ausprobieren: IF DAS NICHT==DAS echo Vergleich positiv )
Mit anderen Worten: IF-Abfragen sind in diesen Faellen tabu!
Einzige Ausnahme: die Abfrage auf leere Variable funktioniert
trotzdem (mal nachdenken, warum).
Verfuegbarer Speicherplatz
Der Speicherplatz fuer Umgebungsvariable ist begrenzt. Es wird
daher dringend empfohlen, am Ende einer BAT-Datei alle nicht mehr
benoetigten Variablen zu loeschen, damit kein Muell angehaeuft
wird. Mit FOR geht das ganz elegant - Beispiel:
FOR %%a in (DATEI EL X Y Z) do SET %%a=
Wieviel Platz noch frei ist, kann man DOS leider nicht entlocken.
(Dafuer gibt es aber kleine Utilities.)
Da der Speicherplatz COMMAND.COM zugeordnet ist, kann die Groesse
des Speichers nur beim Laden des Befehlsprozessors beeinflusst
werden. Dazu dient die Option /E der SHELL-Anweisung in der
CONFIG.SYS - Beispiel (800 Bytes gewuenscht):
SHELL=C:\COMMAND.COM /P /E:800
Schaut mal ins DOS-Handbuch.
Weitere COMMAND-SHELL
Beim Laden einer weiteren COMMAND-SHELL wird ein eigener Speicherbereich
fuer Umgebungsvariable angeglegt. In diesen werden alle
Zuweisungen der ersten SHELL kopiert. Aber umgekehrt wird nach
Verlassen der SHELL (per EXIT) nichts uebernommen!
Standardmaessig wird von DOS nur recht wenig freier Speicher in
einer weiteren COMMAND-Shell zur Verfuegung gestellt. Bei Bedarf
kann auch hier Option /E verwenden werden, wobei natuerlich der
bereits verbrauchte Speicher (s.o.) zu beruecksichtigen ist.
Normalerweise wird jedoch die COMMAND-Shell von einem Programm
bereitgestellt, das dann auch fuer die Speichergroesse zustaendig
ist. Gute Programme schaffen soviel freien Umgebungsvariablenspeicher
wie in der ersten Shell noch frei war, oder lassen die
Groesse per Setup einstellen. (Falls z.B. jemand WINDOWS benutzt:
SYSTEM.INI, [NonWindowsApp], CommandEnvSize=....)
System-Variable
Von DOS bzw. COMMAND.COM werden folgende Variable benutzt:
PATH Suchpfade fuer ausfuehrbare Dateien
TEMP Verzeichnis fuer temporaere Dateien
COMSPEC Befehlsprozessor (COMMAND.COM) mit vollstaendigem Pfad
PROMPT Eingabeaufforderung auf der Befehlsebene
DIRCMD fuer DIR Optionen (ab DOS 5.0)
Zum Schluss nochmal der Hinweis: ERRORLEVEL ist keine Variable
(sondern Schluesselwort in einem IF-Ausdruck). Wie man aber den
Errorlevel in eine Variable kriegt, wird in einer der folgenden
Lektionen erklaert. _________________