Letzte Änderung: 08. Juli 2021
GPG Logo

Windows Shell


Batch Datei erstellen
Das erste Programm
Kopierprogramm
Computer im Netzwerk anzeigen
Sleep oder Wait
Endlosschleifen und Sprungmarken
Datei ohne Sicherheitsfrage löschen
Variablen
IF Bedingung
For Schleife
Zusatzbefehle
Weitere Beispiel Scripte



Batch Datei erstellen

Eine Batch Datei erstellt man indem man ein Textdokument öffnet und sie dann mit der Endung .bat oder .cmd (Stapelverarbeitung) abspeichert.
Wenn bei ihnen die Dateierweiterungen ausgestellt sind können sie sie einfach oben in einem Ordner in

Extras > Ordneroptionen > Ansicht

(machen sie da den Pfeil bei Dateierweiterungen bei bekannten Dateitypen weg) einstellen.

Alle Shellbefehle auflisten = Start -> Ausführen -> cmd.exe -> Geben Sie 'help' ein.




Das erste Programm

Das erste Programm was fast jeder Programmierer erstellt hat war das Programm "Hello World". Deswegen will ich auch in diesem Tutorial damit anfangen.

Öffnen sie eine Textdatei und schreiben sie folgendes hinein:
@Echo off
echo Hello world
pause
speichern sie nun die Textdatei als .bat oder .cmd ab.

Dies ist zwar ein soweit simples Programm aber man kann trotzdem daraus einiges lernen.

Der Befehl "pause" hält das Programm an und wartet auf eine Reaktion (Tastendruck) des Benutzers.

Nun erkläre ich was es mit dem @Echo off auf sich hat.

@echo bzw. @echo off steuern die Anzeige der Batch Datei

Ohne dem @ vor jedem echo Befehl wird beim Ausführen immer die Befehlszeile und dann Das Ergebnis angezeigt. zum Veranschaulichen ein kleines Beispiel des echo Befehles:
echo hallo
dann liefert die Ausgabe der Befehlszeile (echo hallo) und das Ergebnis: (hallo). Ausgabe also:

echo hallo
hallo

ein @ vor einem Befehl unterdrückt die Ausgabe der Befehlszeile:
@echo hallo
Ausgabe ist nun :

hallo

um nicht vor jeden Befehl ein @ schreiben zu müssen gibts den Befehl echo off.
um die Ausgabe des Befehles echo off selbst zu unterdrücken kannst du dann @echo off verwenden.

zurück zum Beispiel:
@echo off
echo hallo
gibt folgendes zurück:

hallo



Kopierprogramm

Das zweite Programm das ich vorführe ist ein Kopierprogramm es soll bei einem Tastendruck des Benutzers, die Daten eines Ordners in einen ausgesuchten anderen kopieren.

Dazu benutzen wir den Befehl "xcopy". Das erstellte Programm sollte jetzt so aussehen:
@Echo off
echo Wollen sie wirklich die Dateien in C:\Dokumente nach

echo E:\Dokumente kopieren?
echo.
echo.
pause
xcopy "C:\Dokumente und Einstellungen" E:\Dokumente
;exit
Der erste Pfad hinter xcopy zeit den Quellpfad an der hintere den Zielpfad.

Dann haben wir in diesem Programm noch einen weiteren Unbekannten Befehl nämlich den ";exit" Befehl. Der ";exit" Befehl sorgt dafür dass das Programm beendet wird.



Computer im Netzwerk anzeigen

Da sich die Batch- Programmierung zum großen Teil um das Netzwerk dreht, will ich hier den ersten Netzwerk Befehl vorstellen.
@Echo off
echo Alle Computer im Netzwerk anzeigen?
pause
net view
pause
Zu beachten ist das vor jedem Befehl der sich auf das Netzwerk bezieht ein "net" steht.



Sleep oder Wait

sleep or wait mit ping

Befehl: "@ping -n 10 localhost> nul" wartet in etwa 10 Sekunden (-n 10) und führt die Batchdatei dann weiter aus.

Seit Windows 7 gibt es den Befehl: timeout

timeout /T 10 wartet 10 Sekunden, die Wartezeit kann mit einer beliebigen Taste übersprungen werden, um dies zu verhindern gibt es den Parameter: /nobreak

timeout /T 10 /nobreak



Endlosschleifen und Sprungmarken

In diesem Teil lernen sie wie sie anderen Rechnern im Netzwerk Endlosschleifen von Nachrichten schicken können.

Hier für unerfahrene PC- Benutzer ein sehr gemeines Programm:
@echo off
:start
net send 192.168.0.1 hallo
goto start
Mit ":name" setzt man eine Sprungmarke, zu der man per "goto name" springen kann.

Beispiel 2 :
@echo off
goto springe
echo hallo
:springe
echo gesprungen
pause
Ausgabe: gesprungen (echo hallo wird ignoriert da mit dem Befehl "goto springe" die Zeile "echo hallo" übersprungen wird)



Datei ohne Sicherheitsfrage löschen

Der Code dafür lautet:
Del "Pfad"
In die Anführungszeichen wird der Pfad der zu löschenden Datei geschrieben.

Del ist der Befehl um eine Datei zu löschen es gibt noch andere Befehle die das gleiche Ergebnis liefern aber ich benutze diesen Befehl.

Um eine Meldung anzuzeigen, das die Datei wirklich gelöscht wurde ergänzt man den Code um: (löscht auch alle Dateien in Unterverzeichnissen und Systemdateien)

/S also:

Del /S "Pfad"

mit /P müssen sie das löschen erst bestätigen bevor fortgefahren wird
mit /F löschen sie sogar schreibgeschützte Dateien
mit /H löschen sie auch versteckte Dateien



Variablen

Variablen sind sozusagen Abkürzungen für einen bestimmten Wert. Eine Zeichenkette hat dann einen Wert. Das kann man dem Computer beibringen. Die wichtigsten Befehle sind:

:: Einer Variable einen Wert zuweisen
set var=Das ist der Wert der Variable
:: Eine Tasteneingabe einer Variable zuweisen :
set /p var=Bitte geben sie den Wert der Variable ein :
:: Um eine Variable zu verwenden, muss man sie immer in "%"-Zeichen setzen.
echo %var% :: Gibt die Variable var aus.
:: Man kann mit Variablen auch rechnen, z.B. als Rundenzähler

Beispiel:
set counter=0
set counter=counter+1
echo Runde %counter%
pause
Die Rechenzeichen sind * / + - man verwendet sie wie oben gezeigt. Wichtig: Wenn man mit Variablen rechnet, muss man die %-Zeichen weglassen
und man muss die Variablen, mit denen man rechnen will, vorher auf eine Zahl (0-...) setzen.

:: Um eine Variable zu löschen bzw. zu leeren machen wir :
set var=



IF Bedingung

Mit If-Abfragen kann man zwei Strings vergleichen und dann eine Funktion ausführen. Das geht so:

Beispiel:
:start //Hier ist die Sprungmarke "start"
set /p pa=Passwort: //Hier wird das Passwort abgefragt
if "%pa%"=="Passwort" goto drin // Falls die Variable "pa" den Wert "Passwort" hat, gehe zu "drin".
if not "%pa%"=="Passwort" goto start //Falls das Passwort nicht "Passwort" ist, gehe zu start.
Statt den beiden == Zeichen kann man auch anderes einsetzen:

EQU ist gleich
NEQ nicht gleich
LSS kleiner als
LEQ kleiner als oder gleich
GTR größer als
GEQ größer als oder gleich
if "alle"=="%1" del *.tmp
Erklärung: %1 ist eine beim Aufruf auf an die Batch-Datei angehängte Variable:
z.B. batchdatei.cmd Variable. Wenn also in diesem Beispiel an die Batchdatei alle angehängt wird: batchdatei.cmd alle dann werden alle Dateien mit Endung .tmp aus dem aktuellen Verzeichnis gelöscht.

Es gibt auch noch viele andere Arten von If-Abfragen, z.B. "if exist...", das testet ob eine Datei existiert.

Beispiel:
@echo off
if exist %datei.txt goto existiert
echo Datei nicht gefunden!
goto ENDE
:existiert
echo die Datei existiert!
:ENDE
pause
Ausgabe: wenn die Datei datei.txt existiert: die Datei existiert! wenn die Datei datei.txt nicht existiert: Datei nicht gefunden!



For Schleife

Die FOR-Konstruktion ermöglicht die mehrfache Ausführung eines Befehls mit einem variablen Argument. Die Argumente werden nacheinander aus einer Liste entnommen.

Beispiel:
FOR %%a IN (X Y Z) DO echo %%a
                    -------       --------
                     Liste          Befehl
Das hat die gleiche Wirkung wie:
echo X
echo Y
echo Z

Die Schlüsselwörter "IN" und "DO" sind vorgeschrieben. Die Argument-Liste muß immer in Klammern gesetzt werden.

Und jetzt zu diesem "%%a":

Erstens: Es kann jeder beliebige Buchstabe verwendet werden, nur keine Ziffer (für Befehlsparameter reserviert).
Daß überhaupt verschiedene Buchstaben möglich sind, macht eigentlich keinen Sinn, denn diese Variable ist nur innerhalb der FOR-Zeile gültig, und ein mehrfaches FOR (Schachtelung) ist nicht zulässig.

Zweitens: Das doppelte %-Zeichen ist in BAT-Dateien Vorschrift. Auf der Befehlsebene (wo die FOR-Konstruktion auch möglich ist) darf jedoch nur EIN %-Zeichen verwendet werden.

Anmerkung: DOS ersetzt in einer BAT-Zeile vorab grundsätzlich doppelte %-Zeichen durch ein einfaches, und versucht in diesem Falle nicht, Umgebungsvariable oder Befehlsparameter einzusetzen.
Danach sieht also eine FOR-Zeile genauso aus wie auf der Befehlsebene.

Als Befehl in einer FOR-Konstruktion sind beliebige BAT-Befehle (auch CALL), DOS-Befehle oder Programmaufrufe möglich. Nur ein weiteres FOR ist nicht möglich.

Beispiel :

FOR %%f IN (c:\batch\*.bat c:\bat\*.bat) DO Copy %%f
Erklärung: diese Zeile kopiert alle Dateien im Ordner c:\batch mit Dateiendung .bat nach c:\bat



Zusatzbefehle

">nul" leitet die Ausgabe ins nul (Nirvana, Nichts) um. Das Zeichen ">" leitet immer die Ausgabe um, 2>&1 bedeutet soviel wie "schreibe
die Ausgabe von Kanal 2 (stderr) dorthin, wo die Ausgabe von Kanal 1 (stdout) geschrieben wird".

echo Das wird nun in eine Datei geschrieben > c:\Test.txt 2>&1
---

Der "cls"-Befehl leert den Bildschirm, so das nichts mehr angezeigt wird.

---

Kommentare in eine Batch Datei einzufügen :

Beispiel:

REM ich bin ein Kommentar
oder
:: ich bin ein Kommentar

ignoriert die komplette Zeile

---

In einer Batchdatei eine andere Batchdatei aufrufen :
call "%PROGRAMFILES%/test.cmd"
---

Errorlevel :

jeder Befehl gibt bestimmte errorlevel zurück. Meist bedeutet der errorlevel 1, dass der Befehl nicht erfolgreich war:

Beispiel:
@echo off
xcopy c:\so c:\so2
if errorlevel 1 goto error
goto ende
:error
echo das kopieren war nicht erfolgreich!
:ende
pause
in diesem Beispiel wird das Verzeichnis c:\so in c:\so2 kopiert, wenn jetzt z.B. so nicht existiert, schreibt die Batch-Datei: "das kopieren war nicht erfolgreich!"

Achtung !!! if errorlevel 0 prüft nicht nur auf den Wert 0 sondern prüft mit >= 0 auch alle Werte, die größer sind als 0.
Das heißt egal ob ein Programm 0 zurück gibt, 1 oder 213, der Befehl hinter if errorlevel 0 wird immer ausgeführt.

z.B.
md c:\checkdir
if errorlevel 0 echo Test
würde also immer ein "Test" ausgeben :-)

---

Datum & Zeit ausgeben :
@echo Zeit = %date% - %time%
---

Einen Zeilenumbruch macht man mit "echo." oder mit "echo\"

---

Mit start kann man Programme starten und in der Batchdatei weitergehen. /D gibt mir das Startverzeichnis an.
start /D "C:\Programme\Software" Software.exe
Hier ist die Syntax : Startverzeichnis - Fenstertitel - Auszuführendes Programm
start /D "C:\Programme\Software" "Fenstertitel" "Software.exe"
Hier ist die Syntax : Startverzeichnis - Auszuführendes Programm - Parameter
start /D "C:\Programme\Software" Software.exe -P=Parameter



Weitere Beispiel Scripte

warte auf Task :
:LOOP
echo in der Schleife
@ping -n 10 localhost> nul
TaskList|Find "Taskname" >NUL || If Errorlevel 1 Goto WEITER
Goto LOOP
:WEITER
Erklärung:

mit @ping -n 10 localhost> nul wird in der Schleife 10 Sekunden gewartet,
die Befehlszeile TaskList|Find "Taskname" >NUL || If Errorlevel 1 Goto WEITER verlässt die Schleife erst, wenn der Task: "Taskname" nich mehr läuft

---

touch Befehl :

type nul > z:\shutdown.flag