Batch-Programmierung: Erweiterungen unter Windows NT
Variablen Kurzübersicht
[Bearbeiten]Diese Seite (in diesem Abschnitt eingefügt und überarbeitet) enthielt ursprünglich Änderungen des Kommandozeileninterpreters von DOS auf Windows NT, und beschrieb mehr oder weniger die Erweiterungen für Standard-Befehle.
Scriptvariablen und Systemvariablen
[Bearbeiten]Es gibt zweierlei Arten von Variablen: Scriptvariablen und Systemvariablen. Die Scriptvariablen werden innerhalb von Schleifen eingesetzt, beginnen mit % und einem frei wählbaren Zeichen, oder einer Zeichenfolge. Systemvariablen müssen von % begonnen und von % abgeschlossen werden. Die Variable %0 hat stets den Namen der aktuellen Datei. Die Variable %ver% hat immer den Namen der aktuellen Betriebssystemversion. Unter Windows XP muss %os% statt %ver% verwendet werden.
Gibt man unter Windows Vista und 7 den Befehl echo %os% ein, so gibt der Computer die Version des Systems aus, auf dem das System basiert. Unter Windows Vista und Windows 7 gibt es einen Befehl namens ver, mit dem man die Version direkt angezeigt bekommt. Es gibt zwar keine direkte Variable bei Vista und Windows 7, die das Betriebssystem definiert, jedoch kann man das mit folgendem Trick umgehen:
@echo off ' Autobefehlsanzeige ausgeschaltet ver > TMP.dat ' speichert die Ausgabe des Befehls in der Datei TMP.dat Set /p ver= < TMP.dat ' definiert die Variable des Betriebssystems. (NUR TEMPORÄR !) echo %ver% ' gibt nun die definierte Variable aus. pause>nul ' pause
Benutzereingaben in Variablen speichern
[Bearbeiten]Um eine Benutzereingabe in eine Variable speichern zu können, wird die Option /p benötigt.
Beispiel:
set /p EINGABE=Variable Eingeben: echo %EINGABE%
Zeichenketten in Variablen manipulieren (Stringoperationen)
[Bearbeiten]Nützliche Stringoperation für (String)-Variablen:
Teilstring
Syntax
var:~n,m
Ergibt den Teilstring von var, beginnend mit dem n-ten Zeichen (von links) und einer Länge von m Zeichen. Gezählt wird ab 0, d.h. das erste Zeichen hat die Position 0 und nicht 1. Werden negative Werte verwendet, so wird vom Ende des Strings (von rechts nach links) gezählt.
Beispiel:
Inhalt:
set str=myfile.bat set name=%str:~0,6% echo %name%
In diesem Beispiel wird der Teilstring von str vom ersten Zeichen an mit einer Länge von 6 Zeichen ausgegeben.
Ausgabe:
myfile
Stringsubstitution
Syntax
var:str1=str2
Mithilfe der Syntax var:str1=str2 kann die Zeichenkette str1 des Inhalts der Variablen var durch str2 ersetzt werden.
Beispiel:
Inhalt:
set str="mycommand /p /m file" echo %str% set str=%str:/p /m=/t% echo %str%
In diesem Beispiel werden die Optionen /p /m des Befehls mycommand durch die Option /t ersetzt.
Ausgabe:
"mycommand /p /m file" "mycommand /t file"
Mit Variablen rechnen (Arithmetische Operationen)
[Bearbeiten]Rechnungen mit Variablen sind erst mit der Option /a möglich.
Beispiel:
set WERT1=2 set WERT2=21 set /a WERT1 = %WERT1%*%WERT2% echo %WERT1%
Variablenerstellung, -zuweisung und -abruf
[Bearbeiten]Wertezuweisung
Mit dem Befehl "set" kann einer Variablen ein Wert zugewiesen werden. z.B. "set meinName=Peter"
Werteabruf
Um den Wert einer Variable abzurufen oder auszugeben, wird der Variablenname von Prozentzeichen umgeben. Der Befehl "echo %meinName%" würde die Ausgabe "Peter" erzeugen.
Links mit umfassenden Informationen zur Variablenverwendung und zum Set-Befehl
Gültigkeitsbereich von Variablen
[Bearbeiten]Allgemeine Info zum Gültigkeitsbereich von Variablen
[Bearbeiten]Unter DOS und Windows 9x/ME speichern alle Anwendungen und Skripte ihre Umgebungsvariablen in der gleichen Umgebung. Unter Windows NT-basierten Betriebssystemen ist dies etwas anders:
Zunächst gibt es einen systemweiten Bereich. Dieser enthält Variablen, die für alle Benutzer und alle Anwendungen zugänglich sind. Zusätzlich hat jeder Benutzer seinen eigenen Variablenraum. Jede Anwendung, die nun vom System gestartet wird, erhält einen eigenen Variablenraum, der als Kopie aus dem der aufrufenden Anwendung erzeugt wird. Ändert das Programm etwas (Wertänderung, neue Variable), wirkt sich dies nicht auf parallel gestartete Anwendungen oder das System aus. Lediglich Prozesse, die von der Anwendung gestartet werden, erhalten eine Kopie des Anwendungsvariablenraumes. Dadurch ist es nicht möglich, dass Anwendungen Umgebungsvariablen setzen, die dann anschließend in einer Batchdatei verwertbar sind.
Beispiel:
@echo off set a=2 echo %a% command /c: set a=1 echo %a%
Unter Dos würde die Ausgabe lauten:
2 1
Unter Windows NT/2000/XP:
2 2
Das heißt nicht, dass unter Windows NT und Nachfolgern der Befehl set a=1
keinen Effekt hätte, sondern dieser wird in einer geschützten Umgebung ausgeführt, die dann außerhalb dieser Umgebung keinen Effekt mehr hat. Für die aufgerufene Variante von command ist a nach dem set-Befehl sehr wohl gleich 1.
Gültigkeitsbereich setzen (setlocal)
[Bearbeiten]Mit dem Befehl setlocal lässt sich der Gültigkeitsbereich von Variablen kontrollieren. Für weitere Informationen helfen folgende Links:
Noch eine Änderung Variable betreffend.
Umgebungsvariablen (Windows Environment Variables)
[Bearbeiten]Umgebungsvariablen werden verwendet, um Variablen anwendungsübergreifend (und skriptübergreifend) zu speichern.
- Umgebungsvariablenreferenz auf ss64.com
- Weitergehende allgemeine Informationen zu Umgebungsvariablen auf de.wikipedia.org
Weitere "Variablenarten"
[Bearbeiten]Parameter lassen sich bedingt mit Variablen vergleichen und werden zur Werteübergabe beim Aufrufen von Batchdateien verwendet. Auch bei For-Schleifen wird eine Art Parametervariable verwendet.
Übergabeparameter
[Bearbeiten]Syntax:
- Windows XP
- batchdateiname.cmd PARAMETER1 PARAMETER2 PARAMETER3 ...
Web-Links:
- Windows XP Professional Product Documentation
- http://www.administrator.de/forum/test-cmd-parameter-76928.html
- http://ss64.com/nt/syntax-args.html
Erklärung/Verwendung/Beispiele:
Mit Hilfe von Parametern beim Aufrufen einer Batchdatei (z.B. "c:\>batchskript.cmd parameter1 parameter2"
) Zeichenketten als eine Art Variablen übergeben werden, die dann in der Batchdatei weiterverwendet werden können.
Unter Windows NT lassen sich die Parameter im Gegensatz zu DOS folgendermaßen erweitern (für 1 setze man den jeweiligen Parameter ein):
%~1 Anführungszeichen (") werden entfernt %~f1 vollständige Pfadbezeichnung %~d1 Laufwerkbuchstabe %~p1 Pfad (ohne Laufwerksbuchstabe) %~n1 Dateiname %~x1 Dateinamenserweiterung %~s1 Pfad nur mit kurzen Verzeichnis/Dateinamen (8.3-Konvention) %~a1 Dateiattribute %~t1 Datums- und Uhrzeitangaben der Datei (Geändert am) %~z1 Größe der Datei
Die Angaben können auch kombiniert werden, z.B. %~dp0 ist Laufwerksbuchstaben + Pfad der aktuellen Batchdatei.
Parametervariablen in For-Schleifen
[Bearbeiten]Für For-Schleifen werden auch eine Art von Parameter/Variable verwendet um die Anzahl der Schleifendurchläufe zu kontrollieren.
Links:
- http://ss64.com/nt/for.html For-Schleife auf ss64.com
- http://ss64.com/nt/syntax-args.html Parameter auf ss64.com (siehe Abschnitt "FOR parameters")
Stringoperationen (Manipulation von Strings in Variablen)
[Bearbeiten]Mit folgender Syntax lassen sich Teile aus einer Zeichenkette extrahieren:
set str=Hallo set str=%str:~1% echo.%str%
Die angegebene positive Zahl gibt an, wie viele Zeichen links übergangen werden sollen. Dieser Ausdruck liefert daher den Teilstring "allo" von "Hallo".
set str=Hallo set str=%str:~-4% echo.%str%
Wird eine negative Zahl eingesetzt, so gibt ihr Betrag an, wie viele Zeichen von rechts genommen werden sollen. Dieser Ausdruck liefert daher ebenfalls "allo".
Über die Angabe einer zweiten Zahl kann definiert werden, was mit dem Rest nach Auswertung der ersten Zahl entsprechend obiger Regeln geschehen soll. Während die erste Zahl die Zeichenkette links beschneidet, beschneidet die zweite Zahl sie rechts und zwar nach folgenden Regeln:
set str=Hallo set str=%str:~1,2% echo.%str%
Eine positive zweite Zahl gibt an, wie viele Zeichen ab links vom Rest genommen werden sollen. Dieser Ausdruck liefert daher "al".
set str=Hallo set str=%str:~1,-2% echo.%str%
Wird eine negative zweite Zahl eingesetzt, so gibt ihr Betrag an, wie viele Zeichen vom Rest ab rechts übergangen werden sollen. Dieser Ausdruck liefert daher ebenfalls "al".
Möchte man beispielsweise nur einen Teil der Zeichenkette ab links, so ist nach diesen Regeln als erste Zahl eine Null anzugeben:
set str=Hallo set str=%str:~0,2% echo.%str%
Dieser Ausdruck liefert daher "Ha".
Arithmetische Operationen (set /a)
[Bearbeiten]Seit Windows NT 4 kann man mit dem set
-Befehl auch rechnen.
Ein Beispiel:
set /a 1+2 3
Man kann das Ergebnis auch in Variablen schreiben:
set /a n=5+5 10 echo %n% 10
- CMD nimmt Folgendes entgegen (Auszug aus der Hilfe):
() - Gruppierung ! ~ - - unäre Operatoren * / % - arithmetische Operatoren (% bedeutet Modulo) + - - arithmetische Operatoren << >> - logische Verschiebung & - bitweise UND ^ - bitweise exklusives ODER | - bitweise ODER = *= /= %= += -= - Zuordnung &= ^= |= <<= >>= , - Trennzeichen für Ausdrücke
- Mit Klammern:
set /a (1+1)*(4-3) 2
Modulo-Zeichen muss zweimal hintereinander geschrieben werden.
set /a 11 %% 5 1
Ein- und Ausgaben in Variablen speichern ("set /p")
[Bearbeiten]Benutzereingaben
[Bearbeiten]Seit Windows 2000 kann man mit dem set
-Befehl auch Eingaben abfragen und einer Variable zuweisen:
Syntax:
set /p {variablenname}={Angezeigter Text}
Beispiel
@echo off set var= set /p var=Eingabe: echo Sie haben %var% eingegeben. pause
Ausgabe:
Eingabe: Test Sie haben Test eingegeben. {Pause}
Wichtig: Gibt der Benutzer nichts ein, so bleibt die Umgebungsvariable unverändert! Also immer initialisieren!
Prüfung, ob der Benutzer Text eingegeben hat:
@echo off set var= set /p var=Eingabe: if not defined var ( echo Bitte geben Sie etwas ein! set var=nichts REM Könnte auch was ganz anderes sein ) echo Sie haben "%var%" eingegeben. pause
Ausgabe:
Eingabe: {leer} Bitte geben Sie etwas ein! Sie haben "nichts" eingegeben. {pause}
Umgeleitete Ausgaben
[Bearbeiten]Eine Möglichkeit der Umleitung einer Ausgabe besteht über den set /p
Befehl:
Syntax:
ECHO {Befehl}> {Dateiname} SET /P {Variablenname}=<{Dateiname}
Beispiel
@ECHO OFF ECHO %date% > _.txt SET /P tmp=<_.txt ECHO Das Datum heute ist: %tmp%
Sonderzeichen verwenden
[Bearbeiten]Manchmal will man Zeichenketten mit Sonderzeichen verwenden, die als Teil eines Befehls verstanden werden – beispielsweise % < | >
. In diesem Fall muss man das betreffende Zeichen „maskieren“, sodass es nicht als Teil des Befehls, sondern als „echtes“ Zeichen interpretiert wird. Dazu werden Escape-Zeichen verwendet, beispielsweise:
% %% < ^< | ^| > ^>
Eine gute Zusammenstellung, wie man mit diesen Escape-Charakters umgeht, findet sich unter Escape Characters.