Mrz 14 2008
[Tutorial] Batchscripting unter Windows
Da ich grade dieses Thema auch im Rahmen des Unterrichts in der Technikerschule vorgestellt habe, möchte ich dieses auch noch mal bloggen.
Allgemeines
Batch bedeutet so viel wie "Stapel". Das heißt, dass die Befehle innerhalb des Batchscripts gestapelt werden. Dabei ist darauf zu achten, dass jeder Befehl in einer eigenen Zeile steht. Ausnahmen hierbei sind z.B. if-Anweisungen oder for-Schleifen. Befehle innerhalb der Batchdatei werden grundsätzlich nacheinander und nicht zeitgleich ausgeführt, so dass er nächste Befehle erst ausgeführt wird, wenn der Aktuelle abgeschlossen ist.
Mit Hilfe von "help" können sämtliche Befehle in der Konsole aufgelistet werden.
Im Gegensatz zu Linux oder Unix sind die CMD-Befehle und Variablen innerhalb der Scripte nicht Case-sensitiv. Das bedeutet, dass die Befehle und Variablen sowohl mit Groß- und Kleinbuchstaben geschrieben werden können. Der Variablenname "meinName" ist somit gleichbedeutend mit "Meinname". Ausnahme hierbei sind Zählvariablen, wie sie z.B. in Schleifen verwendet werden. %a% und %A% sind somit unterschiedlich.
Ausgaben
Um die Ausgaben der Befehle (z.B. die Verzeichnisstruktur, welche mittels "dir" ausgegeben wird) in Dateien oder Drucker umzuleiten, hat man die Möglichkeit Ausgabe- bzw. Umleitungsoperatoren zu verwenden.
- "Befehl > Dateiname.txt"
leitet die Ausgabe, welche vom Befehl erzeugt wird in die Datei "Dateiname.txt" um. Ist die Datei noch nicht vorhanden, wird sie erstellt; ist sie bereits vorhanden, wird sie überschrieben. - "Befehl >> Dateiname.txt"
funktioniert ähnlich wie die Umleitung mit ">", hängt die Ausgabe jedoch an die Datei "Dateiname.txt" an, ohne sie zu überschreiben. - "Befehl < Dateiname.txt"
hier werden die Inhalte der Datei "Dateiname.txt" als Parameter an den Befehl übergeben und somit verarbeitet. - "Befehl1 | Befehl2"
die Ausgabe von "Befehl1" wird als Parameter an "Befehl2" übergeben, so dass dort mit den Ergebnissen von "Befehl1" weitergearbeitet werden kann.
Verknüpfungen
Verknüpfungen werden dazu benutzt, um Befehle in Abhängigkeit zur erfolgreichen Ausführung des vorangegangenen Befehls auszuführen.
- A & B
beide Anweisungen werden auf jeden Fall ausgeführt, egal ob "A" ausgeführt wurde oder nicht. - A && B
B wird nur ausgeführt, wenn A keinen Fehler geworfen hat
(Bsp.: Wenn A ein Befehl zur Sicherung von Dateien ist und B dazu dient, diese Sicherung auf ein Sicherungsmedium zu kopieren, braucht B nicht ausgeführt werden, wenn die Sicherung A fehlgeschlagen ist.) - A || B
B wird nur ausgeführt, wenn A einen Fehler geworfen hat
(Bsp.: Befehl B dient dazu, Fehler zu protokollieren. Nur wenn der Befehl A fehlschlägt, wird B ausgeführt und der Fehler von A protokolliert.)
Variablen
Um Variablen zu setzen wird der Befehl "SET" benutzt. Die Syntax dafür ist "SET Variablenname=Wert". Um Variableninhalte zu löschen wird der Variablen einfach kein Wert zugewiesen. Möchte man sich alle Variablen (inkl. der Systemvariablen) anzeigen lassen, nutzt man den Befehl "SET" ohne weitere Parameter. Um sich nur bestimmte Variablen anzeigen zu lassen, verbindet man den Befehl "SET" mit dem dem Prä- oder Postfix der Variablen, die man sich ansehen möchte. Um sich den Variableninhalt anzeigen zu lassen, kann man den echo-Befehl zu nutzen.
Beispiele
- setzen / ändern:
„SET meinName=Torsten“ - löschen:
„SET meinName=“ - anzeigen (alle):
„SET“ - anzeigen (alle mit Präfix „mein“):
„SET mein“ - ausgabe:
„echo meinName“
Script für gruppenbasierte Netzlaufwerke
Voraussetzungen
- ifmember.exe aus dem Windows Ressource Kit
- ifmember.exe und Script in NETLOGON-Freigabe des DC
Script
@echo off
net use S: /DELETE
IFMEMBER abteilung1
if %errorlevel%==1
(net use S: \\FQDN\freigabe\abteilung1 /persistent:no )
IFMEMBER abteilung2
if %errorlevel%==1
(net use S: \\FQDN\freigabe\abteilung2 /persistent:no )
IFMEMBER abteilung3
if %errorlevel%==1
(net use S: \\FQDN\freigabe\abteilung3 /persistent:no )
IFMEMBER abteilung4
if %errorlevel%==1
(net use S: \\FQDN\freigabe\abteilung4 /persistent:no )
IFMEMBER Administratoren
if %errorlevel%==1
(net use S: \\FQDN\freigabe\edv /persistent:no )
Erklärung
- @echo off
sorgt dafür, dass die "Eingaben", welche vom Script getätigt werden, nicht in der Ausgabe erscheinen - net use <Laufwerksbuchstabe>: /delete
grundsätzlich sollten die Laufwerksbuchstaben bzw. die mit ihnen verbunden Netzlaufwerke getrennt werden. - IFMEMBER abteilung1
mit Hilfe des Tools "ifmember" wird überprüft, ob der Benutzer, unter welchem das Script ausgeführt wird, in der Gruppe "abteilung1" ist. - if %errorlevel%==1
wenn das zuvor ausgeführt Tool "ifmember" den Wert "true" (1) zurückliefert, wird die nachfolgende Anweisung ausgeführt, ansonsten wird sie übersprungen. - (net use S: \\FQDN\freigabe\abteilung1 /persistent:no )
wenn die IF-Anweisung erfüllt ist, wird der Laufwerksbuchstabe S: mit dem entsprechenden Netzlaufwerk verbunden.
Der Parameter "/persistent:no" sorgt dafür, dass das Netzlaufwerk beim nächsten Systemstart nicht automatisch erneut verbunden wird.
Wer von meinen Kommilitonen schlau genug war, mal ein Blick auf meine Seite und diesen Artikel zu werfen kann sich die Hausaufgaben sparen und die "Musterlösung" nahezu 1:1 abschreiben.



















