Batch Skripte (DOS) | Tutorial

Zuletzt aktualisiert am 1. Februar 2021 von Lars

Auch in Zeiten von VBSkript und Powershell hat die DOS-Kommandoshell nicht vollkommen an Bedeutung verloren. In diesem Artikel lernst du den Umgang damit.

Bestseller Nr. 2
Standardbetriebssystem MS DOS
Standardbetriebssystem MS DOS
Freese, Peter (Autor)
5,49 EUR
Routineaufgaben lassen sich mittels Batch Skript automatisieren. Eine bestimmte Folge von Befehlen wird dabei der Reihe nach eingegeben und vom System bearbeitet. Solche relativ einfachen Befehlsfolgen lassen sich in so genannten Skripten automatisieren. Es gibt diverse Skriptsprachen, die die Möglichkeit bieten diese Befehlsfolgen automatisch ablaufen zu lassen.
Beispiel:
  • Login-Skripte für Server
  • Einfache Backup-Routinen

Im Prinzip handelt es sich hierbei um eine einfache Art und Weise der Programmierung. Der Unterschied zwischen Skripten und Programmen besteht im wesentlichen nur darin, dass
jede Anweisung der Reihe nach vom Rechner interpretiert und anschließend ausgeführt wird. Skripte sind meist auch recht kurz. Programme führen meist eine aufwändigere Aufgabe aus und bei ihnen werden erst alle Anweisungen in für den Computer verständliche Befehle übersetzt und dann das Programm als ganzes gestartet.

Beim Programmieren (egal ob Skript oder Programm) muss man eine Reihe von Anweisungen vorgeben, die der Computer dann abarbeitet. Dabei muss man diverse Randbedingungen beachten.

Vergisst man z.B. eine wichtige Bedingung, dann geht das Programm schief bzw. es kommt zu einem Absturz.

Die Befehle müssen einer genauen Syntax folgen, sonst werden sie nicht erkannt. Es gibt sehr viele Programmier- und Skriptsprachen.

Ein einfaches Beispiel

Ich will einen Roboter programmieren, der das Badewasser einlaufen lassen soll. Dieser Roboter würde in unserem Beispiel normales Deutsch verstehen. Ich sage ihm also:

  • Gehe zur Badewanne
  • Öffne den Wasserhahn

Was passiert nun?

Der Roboter geht zur Badewanne und öffnet den Wasserhahn. Was passiert aber nun wenn die Wanne voll ist? Wie warm wird das Wasser wohl sein? Der Roboter (und auch unser PC) hat keine Intuition und wird also die Wanne mit zu heissem oder zu kaltem Wasser überlaufen lassen.

Korrekter müssten die Anweisungen also lauten

  • Gehe zur Badewanne
  • Öffne den Wasserhahn
  • Stelle die Wasser auf 38° ein
  • Schliesse den Wasserhahn, wenn der Wasserstand x erreicht ist

CMD versus BAT

Batch Skripte mit der Endung .bat verwenden den alten Befehlszeilenprozessor. Speichere daher dein Skript mit der Endung .cmd.

Los geht es: DOS-Umgebung starten

Unter Windows lässt sich die DOS-Umgebung mittels

  • Start > Ausführen > cmd

starten.

Es erscheint dann der schwarze Bildschirm mit weisser Schrift und dem sogenannten Prompt (im folgenden Beispiel C:\Dokumente und Einstellungen\Lars>

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Dokumente und Einstellungen\Lars>   //<-prompt

.cmd Datei starten

Ein einfacher Doppelklick auf die Datei führt sie zwar aus, man sieht jedoch nicht, was ausgegeben wird. Deshalb muss man, wie oben beschrieben, ein DOS Fenster öffnen. Nun zieht man die Datei einfach per Drop&Drag in das DOS Fenster hinein. Mit der Enter-Taste führt man das Skript aus.

Grundaufgaben

EDIT

Edit ruft den Editor unter DOS auf. Man kann zwar auch den unter Windows verwenden, jedoch werden dann die Umlaute dort nicht richtig kodiert.Gib einfach die Befehle im Editor ein und speichere die Datei mit der Endung CMD.

ECHO

Der Befehl echo zeigt Meldungen an und gibt Texte aus.

Beispiele:

echo hallo

Zeigt hallo am Bildschirm an

echo on

Anzeige von Befehlen einschalten

echo off

Anzeige von Befehlen ausschalten

@echo

Verhindert, dass echo selbst angezeigt wird

Variablen - 1. Teil

In den DOS-Skript-Dateien kann man auch Variablen verwenden. Variablen sind verschiedene Werte, die man über den gleichen Ausdruck ansprechen kann. Du kennst das vielleicht vom Taschenrechner: Du kannst ein Rechenergebnis auf einen Speicher
nehmen und später mit diesem weiterrechen. Variablen sind immer mit % gekennzeichnet.
Beispiel: %MusterVariable%


Sytemvariablen time und date

DOS hat einige vordefinierte Variablen, dazu gehören z.B. %date% und %time%.

Ausgabeumleitung

Mit dem Zeichen > kann eine Ausgabe in eine Datei umgeleitet werden.Dabei legt > immer eine neue Datei an. Das Zeichen » hängt an eine bereits vorhandene Datei an.
echo Jetzt ist %time% >> C:LOGlog1.txt

DOS Befehle

Mit den folgenden Befehlen kann man per DOS das selbe verändern, wie man es sonst im Windows Explorer per Mausklick tut.

CD

Mit CD wechselt man das Verzeichnis.Beispiel...

CD Test

...wechselt in ein vorhandenes Unterverzeichnis Test

CD ..

Wechselt ein Verzeichnis nach oben

CD 

Wechselt in das Stammverzeichnis - Will man das Laufwerk wechseln, gibt man einfach den Buchstaben gefolgt von einem Doppelpunkt an (also z.B. C:, D:)

MD

MD legt ein Unterverzeichnis unter dem gerade aktuellen an.Beispiel:

MD Test

RD

RD löscht ein Unterverzeichnis. Dieses muss aber leer sein.Beispiel

RD Test

PAUSE

Pause hält das laufende Programm an und wartet auf einen Tastendruck.

COPY

Mit dem COPY-Befehl kopiert man eine einzelne Datei.Beispiel:

COPY logtest1.cmd logcopy.cmd

XCOPY

Mit dem XCOPY-Befehl kopiert man einzelne oder mehrere Dateien.
XCOPY ist etwas flexibler als COPY.Beispiel:
XCOPY g:\internet d:\lw_g\internet /s /e /c /r /h /k /y

kopiert den Inhalt von g:\internet nach d:\lw_g\internet

TYPE

Type gibt den Inhalt einer Datei aus.

FIND

FIND <suchbegriff> findet alle Zeilen, die den <suchbegriff> beinhalten.
FIND benötigt den zu durchsuchenden Input von einer Quelle, z.B. vom Type-Befehl.

 Die Hilfe

In der Hilfe werden alle Parameter aufgelistet von jedem Befehl. Die Hilfe erscheint immer durch: Musterbefehl /?

Beispiel:

XCOPY /?

Variablen - 2. Teil

Variablen lassen sich auch neu definieren und zuweisen.


Aufgabe - Teste das folgende Skript

%cd% ist eine Systemvariable und enthält das aktuelle
VerzeichnisBeispiel:
set CurrentDir=%cd%
echo %CurrentDir%

Stringbeandlung

Eine Variable, die einen Text enthält, bezeichnet man auch als String. Ab und zu ist es nötig, dass man Strings bearbeitet (z.B. einzelne Teile daraus ausschneidet.)

SET DIR123=%CD%
SET DRIVE123=%DIR123:~0,2%
echo DIR123=%DIR123%
pause

%date% gibt das Datum aus (klar, oder?)
%date:~0,2% gibt die ersten 2 Zeichen von %date% aus
%date:~0,3% gibt die ersten 3 Zeichen aus
%date:~3,5% gibt 5 Zeichen aus, beginnend bei Zeichen Nr. 3

GOTO

Mit GOTO kann zu einer Sprungmarke verweist werden. Die Sprungmarke beginnt immer mit einem Doppelpunkt.In der Regel muss abhängig von einer Bedingung etwas ausgeführt werden. Dies kann z.B. sein, ob ein bestimmter Befehl erfolgreich war oder nicht. Das funktioniert z.B. auch mit dem Ping-Befehl.

Beispiel:

@echo off
set serverip=192.168.121.239
ping -n 1 -w 1000 %serverip% >nul
if not errorlevel 1 (
echo %serverip% ist erreichbar
goto end
) else (
echo %serverip% ist nicht erreichbar
)
:end

Beispiel für ein einfaches Sicherungsskript

01: SET SOURCEDRIVE=%CD%
02: SET SOURCEDRIVE=%SOURCEDRIVE:~0,2%
03: SET SOURCEPATH=%CD%
04: 
05: ECHO SOURCEDRIVE=%SOURCEDRIVE%
06: ECHO SOURCEPATH=%SOURCEPATH%
07: 
08: %SOURCEDRIVE%
09: CD %SOURCEPATH%
10: MD KUNDEN
11: CD KUNDEN
12: MD KUNDE1 
13: MD KUNDE2
14: COPY "I:\KUNDEN\KUNDE1\*.xls" "%SOURCEPATH%\KUNDEN\KUNDE1" /Y
15: COPY "I:\KUNDEN\KUNDE2\*.xls" "%SOURCEPATH%\KUNDEN\KUNDE2" /Y

Nehmen wir an, sie sind gezwungen, Daten auf einen USB-Stick zu sichern. Nötig sind aber nur bestimmte Daten, diese müssen sie aber fortlaufend aktualisieren. Fortlaufende Arbeiten sind typische Arbeiten für Batch Skripte. Obiges Skript erledigt den Job.

Wenn das Skript auf beliebigen Rechnern laufen soll, hat man das Problem, dass man nicht weiss, welcher Laufwerksbuchstabe der USB-Stick hat.

Dieses Problem lösen wir, in dem wir das Skript auf dem USB-Stick ablegen und von dort aufrufen.

Zeile 01 weist der Variablen %Sourcedrive% den Inhalt der System-Umgebungsvariable %CD% (aktuelles Verzeichnis) zu.

Da diese unter Umständen auch noch einen Ordner enthält, werden in Zeile 02 nur die ersten 2 Zeichnen davon verwendet. %Sourcedrive% enthält jetzt z.B. nur "E:"

In Zeile 03 wird der neuen Variablen %Sourcepath% nun der komplette Quellepfad zugewiesen. %Sourcedrive% enthält jetzt z.B. "E:", %Sourcepath% enthält jetzt z.B. "E:"

In Zeile 05 und Zeile 06  werden diese Variablen ausgegeben.

Zeile 08 bis 12 legt den Ordner Kunden und die Unterordner Kunden1 und Kunden2 an. Wenn diese bereits angelegt sind, schlagen die Befehle einfach fehl.

Die beiden Copy-Befehle unter Zeile 14 und 15 kopieren Excel-Dateien (*.xls) in die entsprechenden Unterordner.

Beispiel für ein Login-Skript und Einbau von zusätzlichen Befehlen

@echo off
01: :: ------------------------------------------------------------------------------------------------------------
02: :: Logon-Skript
03: :: ------------------------------------------------------------------------------------------------------------
04: 
05: :: Einstellungen  für Office 2003 / 2010 setzen
06: :: --------------------------------------------
07: REG IMPORT \firma.lan\netlogon\regfilesoff_vorlagen.reg
08: 
09: :: Befehl ifmember verteilen
10: :: ------------------
11: IF NOT EXIST %windir%\SYSTEM32\IFMEMBER.EXE copy \firma.lan\netlogon\ifmember.exe %windir%\SYSTEM32\IFMEMBER.EXE 
12: ::
13: :: Alle Freigaben zurücksetzen
14: :: ---------------------------
15: net use i: /delete /yes
16: net use S: /delete /yes
17: ::
18: :: Freigaben verbinden
19: :: -------------------
20: net use i: \s35daten /PERSISTENT:NO
21: ::
22: \firma.lan\netlogon\ifmember FTP2_User
23: IF %errorlevel%==1 ( 
24:     net use S: \S27\FTPROOT /PERSISTENT:NO
25: )
26: 
27: :: Inventory Start 
28: :: Nicht bei Citrix-Servern...
29: if "%COMPUTERNAME%" == "CTXAPP1" goto noinvent
30: if "%COMPUTERNAME%" == "CTXAPP2" goto noinvent
31: if "%COMPUTERNAME%" == "CTXAPP3" goto noinvent
32: if "%COMPUTERNAME%" == "CTXAPP5" goto noinvent
33:    start /wait wscript \firma.lan\netlogon\logall.vbs
34:    start /wait wscript \firma.lan\netlogon\deleteorphanedprinters.vbs
35: :noinvent
36: 
37: :: Twixtel-Inis für alle herunterkopieren auf den Client
38: del %windir%\twix*.ini
39: del "%userprofile%"\desktop\twix*.lnk
40: copy \s32\twixtellokal\*.ini %windir% /Y
41: mkdir "%userprofile%"\TwixtelSettings
42: copy \s32\twixtellokal\*.ini "%userprofile%"\TwixtelSettings /Y
43: 
44: :: Canon IRC3380
45: \firma.lan\netlogon\ifmember G_PR_Canon_IRC3380
46: IF %errorlevel%==1 ( 
47:    \firma.lan\netlogon\con2prt /c "\s33Canon_iRC3380_PS"
48:    \firma.lan\netlogon\con2prt /c "\s33Canon_iRC3380_PCL5"
49: )
50: 
51: :: HP LaserJet 9040
52: \firma.lan\netlogon\ifmember G_PR_HP_LJ9040
53: IF %errorlevel%==1 ( 
54:    \firma.lan\netlogon\con2prt /c "\s33HP LaserJet 9040 PCL5"
55: )

Mit Login-Skripts werden wiederkehrende Aufgaben bei jedem Login automatisiert. Gängigste Aufgabe ist das Verbinden von Netzlaufwerken

Hinweis:

Vergiss nicht, dein Skript zu kommentieren. Du kannst hierzu den Befehl REM benutzen oder auch :: (zwei Doppelpunkte)!

Das Beispiel-Skript erledigt die folgenden Aufgaben:

In Zeile 07 werden Registry-Einstellungen importiert, die in diesem Fall bestimmte Office-Einstellungen setzen.

In Zeile 11 wird der IFMEMBER-Befehl (kein DOS-Befehl, sondern aus dem Windows ResourceKit Tool auf die lokalen Rechner in das Verzeichnis %windir%\SYSTEM32 verteilt (z.B. C:\WINDOWS\SYSTEM32). Mittels IF EXIST, geschieht dies nur, wenn die Datei dort nicht existiert. IFMEMBER wird später noch gebraucht, jedoch kann es natürlich später auch aus einer Netzwerkfreigabe aus aufgerufen werden.

In Zeile 15 und 16 werden die beiden Netzlaufwerke I: und S: getrennt. Dies ist ebenfalls nicht zwangsläufig nötig, man kann das machen, um zu verhindern, dass nicht eine andere Verbindung heirauf existiert.

In Zeile 20 wird das Laufwerk I: mit der der Freigabe Daten auf S35 neu verbunden.

In Zeile 22 bis 25 wird eine IF-Abfrage in Zusammenhang mit dem ifmember-Befehl (s. o.) verwendet: Wenn der Benutzer Mitglied der Active-Directory-Gruppe FTP2_User ist, dann verbinde Laufwerk S. mit der Freigabe FTPROOT auf Server S27.

Zeile 27 bis 35 zeigt ein (nicht sehr elegantes) Konstrukt mit dessen Hilfe bestimmte Befehle (Zeile 33 und 34) nicht auf bestimmten Servern aufgerufen werden. Hierzu wird der Computername abgefragt und im Positiv-Fall zu einer Marke (noinvent) hinter den entsprechenden Befehlen gesprungen.

Zeile 37 bis 42 zeigt diverse Kopiervorgänge unter Verwendung von Variablen aus der Systemumgebung. Eine komplette Liste kann man sich auf der Kommandozeile
mittels "set" anzeigen lassen. Das Ergebnis sieht so aus:

C:>set
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\lsc\AppData\Roaming
asl.log=Destination=file
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:Program Files\Common Files
COMPUTERNAME=...

Mit den Befehlen werden in diesem Fall konkret einige Desktop-Verknüpfungen und ini-Files an die korrekten Orte kopiert.

Zeile 44 bis 55 zeigt eine automatische Druckerverknüpfung. Hierzu ist der Befehl con2prt nötig (von Microsoft  - zum Download Google befragen).
Ähnlich wie bei der bedingten Laufwerksverknpüfung wird ein Drucker verbunden, wenn der Nutzer Mitglied in der entsprechenden Gruppe ist.

Damit das Login-Skript automatisch auf einem Server ausgeführt wird, packt man es in die Freigabe netlogon unter dem internen Domänennamen.

Beispiel: Interne Domäne ist "firma.lan", dann ist der Speicherort \firma.lan\netlogon

Bei den Usern, die das Skript benötigen, trägt man es unter der Registerkarte
Profil ein:

Diese Methode ist schon eine etwas in die Jahre gekommene aus NT-Zeiten stammende. Login-Skripts kann man seit Windows 2000 auch via Gruppenrichtlinien zuweisen.

Quellen

Du willst meine Arbeit unterstützen? Dann freue ich mich über eine kleine Spende!

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert