Einsatz der Umgebungsvariablen in Skripts
2. Januar 2010Ganz gleich ob eine Programmiersprache nur sehr einfach ist oder ob sie für komplexe Aufgabenstellungen konzipiert wurde – sie wird immer Bereiche zur Verfügung stellen müssen, in denen der Programmierer Daten ablegen kann. Die Batch-Sprache der Windows-Systeme macht da keine Ausnahme. Sie nutzt beispielsweise zum Schreiben in Umgebungsvariablen das Set-Kommando, das wir hier an Beispielen detailliert vorstellen.
Die von allen Windows-Systemen für Batch-Befehle zur Verfügung gestellte Programmiersprache zählt ohne Zweifel zu den einfachsten Vertretern ihrer Zunft und eignet sich für komplexe Programmiervorhaben nicht sonderlich gut. Aber selbst in einfachen Anwendungsfällen muss sie, wie jede andere Programmiersprache auch, dem Programmierer eine Möglichkeit zur Verfügung stellen, um Daten abzuspeichern, die während des Programmablaufs anfallen. Diese Aufgabe wird bei den Windows-Betriebssystemen unter anderem von dem sogenannten Umgebungsvariablen übernommen.
Umgebungsvariablen – Überblick und Hintergrund
Es gehört zu den Aufgaben der Umgebungsvariablen in den Microsoft-Betriebssystemen, Informationen zu speichern, die für eine bestimmte Installation spezifisch sind. Dazu gehören unter anderem Daten wie der Namen der Maschine, ob es sich dem Rechner um ein 64- oder 32-Bit-System handelt, oder der Pfad, unter dem das Betriebssystem nach ausführbaren Programmen suchen soll. Dabei fallen die Umgebungsvariablen grundsätzlich in eine der drei folgenden Kategorien:
- Variable, auf deren Inhalt das Betriebssystem aufsetzt und zugreift (wie die Prozessorarchitektur),
- Variable, die Programme von Drittherstellern nutzen (zum Beispielsweise spezielle Pfade) und
- Variable, die von Windows-Batch-Programmen eingesetzt werden.
Für den Zugriff auf diese Werte aus Batch-Programmen heraus stellt das System ein Werkzeug zur Verfügung: das Set-Kommando. Bei Set handelt es sich um eines der grundlegenden Kommandos für die Batch-Programmierung, das Microsoft bereits seit 1982 seinen Windows-Systemen mitgibt. Es kann Umgebungsvariable anlegen und wieder löschen, sowie diese mit Werten versehen und ist nach Meinung des Autors im Lauf der Jahre immer besser und mächtiger geworden.
Viele Administratoren und Systemprofis werden jetzt wahrscheinlich aufstöhnen und darauf hinweisen, „dass doch wohl jeder Anwender mit dem Set-Kommando umgehen kann“. Aber das ist nach Erfahrung des Autors ganz und gar nicht zutreffen. So wissen die wenigsten Anwender und auch nur weniger Systemverwalter, dass dieses Set-Kommando in der Lage ist, arithmetische Operationen auszuführen oder dass in existierenden Umgebungsvariablen Operationen auf Teile von darin enthaltenen Zeichenketten ausführen kann.
Ebenso wenige Nutzer werden wissen, dass ein Set-Kommando auch Eingaben vom Anwender verlangen oder Zufallszahlen generieren kann. Das Kommando stellt dem Programmierer noch eine ganze Reihe von weiteren Möglichkeiten zur Verfügung, aber dieser Artikel befasst hauptsächlich mit arithmetischen Operationen und mit den beiden letztgenannten Fähigkeiten des Kommandos: Input anfordern und das Generieren von Zufallszahlen.
Rate welche Zahl es ist – Zufallszahlen im Batchprogramm
Im Listing 1 mit dem Namen „GuessNumber1.cmd“ (siehe Listing-Bereich 1) werden diese Fähigkeiten demonstriert. Wer dieses Programm benutzen möchte, muss den Code aus dem Listing mittels eines Editors wie Notepad in eine Datei kopieren, die er dann beispielsweise unter dem Namen GuessNumber.cmd in einem Verzeichnis abspeichern kann.
Es sollte innerhalb des Windows-Pfads liegen, auf dem sein System ausführbare Dateien sucht. Danach lässt sich das Programm direkt von der Kommandozeile aus aufrufen. Sollte das Verzeichnis sich nicht innerhalb des Pfades für ausführbare Dateien befinden, so ist das auch kein Problem. Die Datei muss dann nur in der folgenden Art aufgerufen werden:
.\GuessNumber.cmd
Dem System wird auf diese Art mitgeteilt, dass es diese Datei direkt von aktuellen Standpunkt (.\) aus starten soll. Nach dem Start braucht der Nutzer nur noch den Prompts zu folgen, die das Programm auf dem Bildschirm anzeigt.
Es handelt sich dabei um ein simples Ratespiel, bei dem die Batch-Datei eine zufällige Zahl generiert und den Anwender veranlasst, diese zu erraten. Danach gibt es aus, ob die eingegeben Zahl korrekt, zu klein oder zu groß ist.
Hat der Nutzer die Zahl nicht richtig erraten, bekommt er eine neue Chance. Der Autor hat es zumeist geschafft, die Zahl in weniger als 16 Versuchen zu finden. Natürlich handelt es sich hier nicht um die „Killer-Applikation“ oder das Spiel des Jahres, aber die Batch-Datei verdeutlicht die Grundprinzipien und kann auch auf dem Server-Core des Windows Servers 2008 betrieben werden.
Im folgenden Abschnitt werden einige wichtige Teile dieses Programms vorgestellt. Eine erste, für die Funktion des Programms wichtige Zeile ist dabei der folgende Aufruf:
set gamevalue=%random“
Diese %random“-Funktion stellt Microsoft seit dem Release des Windows Servers 2000 innerhalb des Kommando-Prozessors der Windows-Systeme zur Verfügung. Sie gibt eine zufällige Zahl (genau genommen eine Pseudo-Zufallszahl) zwischen den Werten „0“ und „32767“ zurück.
Nachdem die Batch-Datei diese Zufallszahl angelegt hat, muss sie eine Möglichkeit besitzen, den Anwender immer wieder nach seinen Vorschlägen zu fragen. Bei allen Betriebssystem-Versionen vor Windows 2000 stellte die Batch-Kommandosprache dem Entwickler keinen sinnvoll zu nutzenden Weg zur Verfügung, den Nutzer nach Input zu fragen.
Jeder Systemprofi, der sich vor dieser Version an den „Choice“-Befehlen der Batch-Sprache versucht hat, wird diese Einschätzung bestätigen können. Seit Windows 2000 stellt das Set-Kommando mit dem Schalter /p aber eine gut zu verwendende Möglichkeit zur Verfügung, Eingaben vom Anwender in die Batch-Datei hinein zu bekommen. Der folgende Aufruf aus dem „GuessNumber“-Listing zeigt diese Form des Set-Kommandos:
set /p latestguess=What do you think?
Der grundsätzliche Aufruf eines derartigen Befehls besitzt dann die folgende Form:
set /p Name_der_Umgebungsvariablen=[Text im Prompt]
Das Kommando wird dann den String „What do you think?“ als Prompt ausgeben. Sinnvoller Weise sollte der Entwickler hinter dem Fragezeichen noch ein Leerzeichen mit eingeben, so dass der Anwender seine Antwort nicht direkt hinter dem Zeichen eingeben muss. Alles was der Nutzer nun eingibt, wird in unserem Beispiel in der Umgebungsvariablen mit dem Name „latestguess“ abgespeichert.
Auch das ist möglich: Rechnen mit Hilfe des Set-Kommandos
Bei unserem ersten Beispielprogramm sind wir davon ausgegangen, dass der Anwender dazu in der Lage ist, die vorgegebene Zahl aus einer Menge von 32768 Integer-Werten in 16 Versuchen zu erraten. Allerdings wurde er durch das Programm nicht eingeschränkt und kann im Prinzip so lange wie er möchte weiterraten.
Im zweiten Beispiel wollen wir nun zeigen, wie die Anzahl der Versuche auf 16 festgelegt werden kann. Dafür muss das Programm nun einige arithmetische Operationen durchführen, um auf diese Weise überprüfen zu können, wie viele Versuche der Nutzer bereits durchgeführt hat und wie viele ihm noch bleiben. Im Listing 2 findet sich das leicht abgeänderte Programm, das nun den Namen „GuessNumber2.cmd“
Wer einen kurzen Blick auf dieses Listing wirft, wird zunächst einmal feststellen, dass nur minimale Änderungen im Vergleich zum ersten Beispiel vorgenommen wurden. Dabei wird auch sofort ersichtlich, dass dieses Programm nicht in Hinblick auf eine elegante Programmierung erstellt wurde, sonders dass es hier darum geht, das Prinzip in aller Kürze zu verdeutlichen.
Jeder Anwender und Systemprofi, der mit irgendeinem Microsoft-Betriebssystem seit den Zeiten von MS-DOS 2.0 gearbeitet hat, wird die folgende Zeile und ihren Einsatzzweck sofort wiedererkennen:
set guessleft=16
Mit diesem Statement wird eine neue Umgebungsvariable mit dem Namen „guessleft“ angelegt und ihr wird zugleich der Integer-Wert 16 zugewiesen. Im folgenden Aufruf wird dann gezeigt, wie die relativ neuen Rechenoperationen des Set-Kommandos zu verwenden sind:
set /a guessleft=%guessleft-1
Rechenoperationen kann das Set-Kommando mit Hilfe des Parameters „/a“ ausführen. Dabei stehen dem Anwender neben den vier Grundrechenarbeiten Addition, Subtraktion, Multiplikation und Division auch noch der Modulo-Operator (ganzzahliger Rest einer Division) und einige Bit-orientierte Operationen wie ein bitweise UND- beziehungsweise ODER-Verknüpfung zur Verfügung.
Mit diesen einfachen Beispielen haben wir hoffentlich einigen Systemprofis genug Grund gegeben, sie erstmals und wieder neu mit dem Set-Kommando und den einfachen Batch-Programmen auf den Windows-Systemen zu befassen: Wer etwas damit experimentiert wird schnell feststellen, dass es sich lohnt auch diese einfachen Werkzeuge einzusetzen.
Mark Minasi/fms
Das Listing zu GuessNumber1.cmd
echo off
set gamevalue=%random%
echo I’m thinking of a number between 0 and 32767.
:looptop
set /p latestguess=What do you think it is?
set guessright=false
if /i %latestguess% equ %gamevalue% echo You got it! & set guessright=true
if /i %latestguess% lss %gamevalue% echo Too small.
if /i %latestguess% gtr %gamevalue% echo Too large.
if NOT %guessright%==true goto looptop
Das Listing zu GuessNumber2.cmd
echo off
set guessesleft=16
set gamevalue=%random%
echo I’m thinking of a number between 0 and 32767.
echo %gamevalue%
:looptop
set /p latestguess=What’s your guess (only %guessesleft% left)?
set guessright=false
set /a guessesleft=%guessesleft%-1
if /i %latestguess% equ %gamevalue% echo You got it! & set guessright=true
if /i %latestguess% lss %gamevalue% echo Too small.
if /i %latestguess% gtr %gamevalue% echo Too large.
if /i %guessesleft% leq 0 goto byebye
if NOT %guessright%==true goto looptop
:byebye
if NOT %guessright%==true echo Sorry … you used up all your turns. The number was %gamevalue%.