
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.
- 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
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
Grundaufgaben
EDIT
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
nehmen und später mit diesem weiterrechen. Variablen sind immer mit % gekennzeichnet.
Sytemvariablen time und date
Ausgabeumleitung
echo Jetzt ist %time% >> C:LOGlog1.txt
DOS Befehle
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
COPY
Mit dem COPY-Befehl kopiert man eine einzelne Datei.Beispiel:
COPY logtest1.cmd logcopy.cmd
XCOPY
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
FIND
FIND benötigt den zu durchsuchenden Input von einer Quelle, z.B. vom Type-Befehl.
Die Hilfe
Beispiel:
XCOPY /?
Variablen - 2. Teil
Aufgabe - Teste das folgende Skript
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
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



Hallo, hier schreibt Lars. Dipl-Ing. Ingenieurinformatik (FH). Seit Jahrzehnten in der IT tätig. Geprüfter (und begeisterter) Webmaster. Ebenso begeisterter Windows-, Apple-, und Office-User. Ich schreibe über alle möglichen Themen rund um IT. Mehr über mich erfährst du hier: Über mich. Danke für deinen Besuch!