Batch-Programmierung: Erweiterungen unter Windows NT

Aus Wikibooks


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.

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:


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:

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".

Mehr zu Stringmanipulation


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.