zockerman
Goto Top

Windows Batch Grundlagen


back-to-topEinleitung

Und los geht's!

Noch eins vorneweg. Wenn man über einen Befehl genaueres Erfahren will, dann öffnet man CMD und gibt ein [BEFEHL] /?.
Dadurch erhält man die genaue beschreibung des [BEFEHL'S].

Als erstes öffnen wir Notepad. Batch-Programme müssen nicht kompiliert werden, da sie von der CMD.EXE intepretiert werden.
Was ist eine Batch? Eine einfache Batch, von engl. batch(Stapel) ist eine Abfolge von Windows-Befehlen, die nacheinander abgehandelt werden.

Unsere erste Batch:

back-to-top[ECHO]

Wir wollen nun "Hello World" ausgeben lassen.
@echo OFF Diese Zeile sagt, der CMD.EXE, dass laufende Befehle nicht ausgegeben werden sollen.
ECHO Hello World Hier wird alles ausgegeben, was nach ECHO steht. ECHO gibt also an, was ausgegeben werden soll.

Speichern wir nun diese Datei unter [Name].bat und führen sie aus.
Das CMD-Fenster wird kurz aufgehen und sich sofort wieder schließen. Wieso?
Eine Batch ist, wie gesagt, eine Abfolge von Befehlen und das CMD-Fenster bleibt nur so lange offen, bis alle Befehle abgehandelt sind.
Nun wollen wir aber unseren Text lesen können. Dabei hilft uns der Befehl PAUSE.
@ECHO OFF
ECHO Hello World
PAUSE
Jetzt bleibt unser Fenster solange offen, bis wir eine Taste drücken.


Leerzeilen:

Hierbei hilft uns wieder der Befehl ECHO:
@ECHO OFF
ECHO Erste Zeile Text
ECHO.
ECHO Zweite Zeile Text
PAUSE
Das sieht dann so aus:


back-to-top[SET1]

Jetzt wissen wir, wie wir Text ausgeben, doch wie geben wir welchen ein?
Um Text einzugeben verwenden wir den Befehl SET /P
@ECHO OFF
ECHO Geben Sie den Text ein!
SET /P text=
ECHO Sie haben "%text%" eingegeben!  
PAUSE
In diesen vier Zeilen haben wir 3 neue Dinge.

1. SET /P
Mit dieser Zeile wird die Eingabe des Benutzers abgefragt.

2. text=
Damit wird die Eingabe des Benutzers in die Variable "text" geschrieben.

3. %text%
Damit geben wir den Inhalt unserer Variable aus.


back-to-top[SET2]

Variablen sind Platzhalter für Werte die definiert werden.
In unserem Beispiel der eingegebene Text.

Variablen können beliebig gesetzt werden, mit dem Befehl
SET VARIABLE=WERT
werden sie erzeugt, mit einem einfachen SET VARIABLE= werden sie wieder gelöscht. Variablen dürfen auch Leerzeichen enthalten.

Beispiel:
@ECHO OFF
SET VARIABLE1=Hallo
SET VARIABLE2=liebe Batch
ECHO %VARIABLE1% %VARIABLE2%
SET VARIABLE1=
SET VARIABLE1=
Der Befehl SET kann aber noch viel mehr.
Berechnungen werden mit SET /A durchgeführt:
@ECHO OFF
SET VARIABLE1=1
SET VARIABLE2=1
SET VARIABLE3=0
SET /A VARIABLE3 = VARIABLE1 + VARIABLE2
ECHO %VARIABLE3%
PAUSE
Damit wird "2" ausgegeben.

Da wir nun schon einiges über Variablen, Textein- /ausgabe und Berechnungen wissen, können wir unser erstes sinnvolles Programm schreiben.
Einen ganz einfachen Taschenrechner:
@ECHO OFF
ECHO Geben Sie die erste Zahl an:
SET /P zahl1=
ECHO Geben Sie die zweite Zahl an:
SET /P zahl2=
SET /A ergebnis=zahl1+zahl2
ECHO Ergebnis: %ergebnis%
PAUSE

back-to-top[GOTO]

Der Befehl GOTO bringt unsere Batch dazu, nicht in der nächsten Zeile weiterzumachen, sondern nach einer Sprungmarke zu suchen und dort fortzufahren.
Auf diese Weise lassen sich Endlosschleifen, aber auch sinnvolle Wiederholungen programmieren.

Endlosschleife:
@ECHO OFF
:start
ECHO Endlosschleife
GOTO start

back-to-top[IF]

Mithilfe der IF-ABFRAGE kann geprüft werden, ob etwas zutrifft oder nicht.
Wenn variable = 1 dann das, sonst das.

Mit der IF-Abfrage können Sie im grundlegenden 3 Dinge abfragen. Ob eine Datei vorhanden ist, die Gleichheit zweier Zeichenketten und den Rückgabewert eines Befehls(Errorlevel). Die Abfrage kann durch das hinzufügen eines NOT verneint werden.


Datei vorhanden Ja/Nein:

IF [NOT] EXIST Datei Befehl

So kann zum Beispiel geprüft werden, ob eine Datei vorhanden ist und wenn Sie vorhanden ist, soll sie gelöscht werden.
@ECHO OFF
IF EXIST "%USERPROFILE%\Desktop\test.txt" DEL "%USERPROFILE%\Desktop\test.txt" & EXIT  
ECHO Test >> "%USERPROFILE%\Desktop\test.txt"  
Diese 3-Zeilige Batch, löscht die Datei "test.txt", wenn sie auf dem Desktop ist.
Wenn Sie nicht vorhanden ist, wird sie erstellt und Test hinein geschrieben.

Neues:

1. DEL:
Dieser Befehl löscht die nachfolgende Datei.

2. & EXIT:
Die Datei wird gelöscht mit DEL UND das Programm wird vorzeitig beendet. D.h. die nachfolgenden Befehle werden nicht mehr abgearbeitet!

3. ECHO Test >> "%USERPROFILE%\Desktop\test.txt":
Diese Zeile leitet die Textausgabe weiter in die Datei "test.txt" (verantwortliches Zeichen ">>")
- ">" Überschreibt den Inhalt einer Datei falls sie vorhanden ist.
- ">>" Fügt den Text an das Ende des vorhandenen Textes an.


Zeichenkette vergleichen:

IF [NOT] "Zeichenkette1==Zeichenkette2" Befehl

Damit können zwei Zeichenketten verglichen werden. Der Vergleich sollte in Anführungszeichen stehen, da sonst keine Leerzeichen möglich sind.
@ECHO OFF
ECHO Geben Sie Text1 ein:
SET /P text1=
ECHO Geben Sie Text2 ein:
SET /P text2=
IF "text1==text2" ECHO Text1 entspricht Text2!  
IF NOT "text1==text2" ECHO Text1 entspricht nicht Text2!  
PAUSE

back-to-top[ERRORLEVEL]

Jeder Befehl hat einen Rückgabewert. Dieser Rückgabewert[ERRORCODE] wird in das ERRORLEVEL geschrieben. Wenn das Programm ohne Fehler abgelaufen ist, ist der ERRORCODE meistens 0.


back-to-top[FOR]

Die FOR-Schleife ist ein Befehl, der so oft durchlaufen wird, wie ein die Liste Datensätze vorweist. Als Dateinamen kann man den exakten Namen wählen oder Platzhalter (z.B. *.*) verwenden. Wollen wir alle Dateien eines Verzeichnisses auflisten, so ist dies so möglich.
@ECHO OFF
FOR %%i IN (*.*) DO ECHO %%i
PAUSE
Als Variable müssen immer einbuchstabige Namen verwendet werden, die mit zwei %-Zeichen versehen sind.


back-to-top[PARAMETER]

Wenn wir uns ein kleines Programm zum kopieren von Verzeichnissen schreiben, wollen wir ja nicht immer den Pfad in der Datei anpassen müssen.
Dabei kommen uns Parameter zu gute.
@ECHO OFF
ECHO Bitte USB-Stick anstecken...
COPY F:\*.* %1
ECHO Fertig.
PAUSE
Wenn wir diese Datei nun Kopieren.BAT nennen, können wir sie so aufrufen:
COPY C:\USB-Stick-Daten
Die Daten von Laufwerk F:\ werden jetzt also nach C:\USB-Stick-Daten kopiert.
COPY F:\*.* C:\USB-Stick-Daten
Es gibt 9 Paramter mit dieser Methode. %0 enthält den Namen der Batch.


back-to-top[SHIFT]

Mithilfe von Shift können wir mehr als 9 Parameter einlesen. Dieser Befehl verschiebt die Parameter einfach eins nach links. Also:
Parameter1 > fällt weg
Parameter2 > Parameter1
Parameter3 > Parameter2
Parameter4 > Parameter3
etc.
@ECHO OFF
:start
IF "%1"=="" EXIT  
ECHO %1
SHIFT
GOTO start
Diese Batch-Datei zeigt also alle Parameter an, die wir ihr gegeben haben.


back-to-top[CALL]

Mithilfe des CALL-Befehls kann eine weitere Batchdatei aufgerufen werden und auf deren Abschluss gewartet werden.

CALL [Dateipfad]Dateiname


back-to-top[WICHTIGE WINDOWS-BEFEHLE]

back-to-top[ECHO]
ECHO [ON | OFF]
ECHO [Meldung]
ECHO ohne Parameter zeigt die aktuelle Einstellung der Befehlsanzeige an.

back-to-top[PAUSE]
Stoppt die Ausführung einer Batch und zeigt folgende Meldung an:

Eine beliebige Taste drücken, um fortzusetzen...


back-to-top[IF]
IF [NOT] ERRORLEVEL Wert Befehl
IF [NOT] Zeichenfolge1==Zeichenfolge2 Befehl
IF [NOT] EXIST Datei Befehl

NOT Verneinung
ERRORLEVEL Rückgabewert eines Befehls
Befehl Der auszuführende Befehl


back-to-top[GOTO]
Lässt das Programm an eine vordefinierte Sprungmarke springen und dort weiterarbeiten.

GOTO Marke

:Marke


back-to-top[FOR]
Führt einen Vorgang für jede Zeile einer Datei aus.

FOR %%Variable IN (Datei, Dateisatz) DO Befehl

%%Variable Ein einbuchstabiger Platzhalter.
Datei, Dateisatz Die zu durchsuchende Datei, Dateien
Befehl auszuführender Befehl


back-to-top[CHOICE]
Auswahl durch Tastenabfrage

CHOICE [/C Tasten] [/N] [/S] [/T c,nn] [/M Text]

/C Tasten Die zur Verfügung stehenden Tasten
/N Keine Anzeige der zur Auswahl stehenden Tasten
/S Groß /- Kleinschreibung wird beachtet
/T c,nn Nach nn Sekunden wird Taste c gedrückt
/M Text Text der Ausgegeben werden soll

ERRORLEVEL ist die Position der gedrückten Taste aus der Tastenauswahl


back-to-top[SHIFT]
Verschiebt alle Parameter um eins nach Links

SHIFT


back-to-top[CALL]
Startet eine andere ausführbare Datei und wartet auf deren Abschluss.

CALL [Dateipfad]Dateiname


back-to-top[SET]
Setzt eine Variable auf einen bestimmten Wert oder führt Berechnungen durch

SET /P Variable= Benutzereingabe schreiben in Variable
SET /A Berechnung
SET Variable=Variableninhalt Setzen einer Variable
SET Variable= Löschen einer Variable


back-to-top[HILFE]
Wenn Sie mehr WINDOWS-Befehle haben wollen, öffnen Sie CMD und schreiben HELP hinein.
So werden alle Befehle aufgelistet.

Um genaueres über einen Befehl zu erfahren. Schreiben sie folgendes

Befehl /?


back-to-topNachwort

Ich hoffe ich konnte mit diesem Tutorial das programmieren mit Batch erleichtern.
Ärgern Sie sich nicht, wenn mal etwas nicht so klappt, wie Sie es wollen.
Es ist noch kein Meister vom Himmel gefallen.
Bei Fragen stehe ich gerne zur Verfügung.

Dieses Tutorial steht auch auf meiner Website: www.zockerman.de.to

Content-ID: 165781

Url: https://administrator.de/contentid/165781

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

60730
60730 06.05.2011 um 11:34:03 Uhr
Goto Top
Servus,

nimms mir nicht böse, aber erst wenn du es schaffst F.P.Schultze das Wasser reichen zu können, solltest du hier so eine Anleitung loslassen.

Das Thema ist zu komplex und du versucht eine Eierlegende Wollmilchsau in einem Rutsch loszulassen.

Wer Befehl /? nicht kann, soll das bätcheln sein lassen. Und viel mehr als /? - schreibst du ja nicht ab

Trotzdem danke für die Mühe - aber da fehlt noch etwas und wenns nur der rote Faden ist.
Choice z.B ist nicht immer dabei gewesen und choice saugt kräftig, wenn es wartet. Choice ist also eher die allerletzte Wahl.

Gruß
Skyemugen
Skyemugen 06.05.2011 um 11:58:20 Uhr
Goto Top
Aloha,

zusätzlich möchte ich anmerken:

Wenn man schon versucht eine „Anleitung” (die im Übrigen keine ist ...) für batch hinzuklatschen, dann sollte man auch die
Codeformatierung
verwenden und mehr als nur Dreizeilenerklärung dazuschreiben.

greetz André

P.P.S.: Mehr Textformatierungen zur bessern Übersicht (eventuell sogar mit bullets) wären auch sinnvoller gewesen.

EDIT Posting „freundlicher” gestaltet - P.P.P.S.: echo. funktioniert in manchen Anwendungsfällen nicht immer aber dazu gibt es hier im Forum bereits einen Beitrag, der dies genauer erläutert face-wink
Zusatz: Erklärungen oder Auflistungen von Parametern für einen Befehl könnte man anschaulicher mit
plaincode
darstellen, finde ich [da das normale codetagging manchmal ein wenig über wirkt und nur plaintext unschön ist]
Zockerman
Zockerman 06.05.2011 um 12:22:41 Uhr
Goto Top
Vielen Dank schonmal für deine Meinung.

Ich habe das nicht hierhergestellt, weil ich "Werbung machen wollte", sondern weil ich dachte "vielleicht hilft es dem ein oder anderen".
Dieses Tut ist entstanden, da ein Freund das lernen wollte und ich im Urlaub war. Er sagte, dass er damit gut klar gekommen ist und präsentierte mir einige gute Programme.

Was dein P.S. angeht, dann liegst du falsch. Bei mir funktioniert choice unter Windows Vista und Windows 7 wunderbar. Ich sehe gar nicht dein Problem?
Bei mir ist es genau andersrum. Nämlich, dass choice unter XP nicht funktioniert?

Du scheinst ja sehr viel Ahnung zu haben.

Gruß Zockerman
Skyemugen
Skyemugen 06.05.2011 um 12:29:53 Uhr
Goto Top
Aloha,

aha, gut, da ich zu XP-Zeiten mit Batch angefangen habe und dort wie ich auch erwähnt hatte dein genau andersrum macht keinen Sinn ... choice nicht vorhanden ist, habe ich bei Windows 7 (Vista nutzt man nicht, das deinstalliert man nur) gar nicht erst geschaut, ob es choice warumauchimmer wieder gibt aber gut, wenn dem so ist, würde ich es persönlich dennoch nicht nutzen (alleine aus dem Grund, dass solch ein Skript dann nicht mehr allround-kompatibel ist).

Nun, meine Anfangsworte waren eventuell ein wenig hart gewählt aber man ist einfach einen anderen - besseren Standard hier in Sachen Anleitungen zu Batch gewohnt.

Deinen letzen Satz lasse ich mal unkommentiert, aber retour.

greetz André

P.S.: Es freut mich, zu sehen, dass du derzeit aktiv am Überarbeiten der Optik und Codes bist =)
P.P.S.: Nun, dann einigen wir uns doch darauf, dass du bei deinem Choice den Hinweis gibst, dass dieser Befehl unter Windows 2000 und XP nicht verfügbar ist, sonst könnte dies zu Verwirrungen führen.
60730
60730 06.05.2011 um 12:38:54 Uhr
Goto Top
moin,

[OT]
choice gab es:
  • von x - 2. irgendwas bis NT4
  • bei W2k0 Client & Server und XP war es nicht mehr onboard
  • Ab W2k3 gab es das dann auch wieder
[/OT]

entspannt euch und bitte ein paar nettigkeiten mehr wegeditieren, hat doch auch in einem Tipp nix zu suchen.

back-to-topUnd ganz und gar nicht OT


  • Bitte bringe den frischlingen nicht gleich @echo off bei - ohne die Gefahren zu nennen, die das hat.
(noch ne ladung notgelandeter Schulbusinsassen die mal eben schnell ....verkrafte ich nicht mehr)


Gruß
Biber
Biber 06.05.2011 um 14:29:02 Uhr
Goto Top
Moin Zockerman,

erstmal danke für deine Mühen.

Ich musste auch erst zwei- oder dreimal draufschauen, mal ein paar Schritte zurücktreten, nochmal schauen, wieder von der anderen Seite gucken... bis ich mich zu einer Bewertung durchgerungen habe.

Weil... du behandelst hier die ganz elementaren Grundlagen, den allerersten Kontakt mit Batch unter der CMD.exe.
Und du schreibst genau das auch im Titel "Windows Batch Grundlagen" - niemand kann da eine andere Erwartungshaltung haben.

Deshalb kann ja auch nur bewertet werden, ob es für den gänzlich unerfahrenen Erst-Bätcher (oder die gänzlich unbeleckte Bachelorin)
a) eine Anleitung oder keine Anleitung sein kann
b) Hilfreich oder nicht hilfreich für den Erstkontakt ist.

Mit dieser Brille komme ich zu der Argumentation: ja, ist als "Anleitung" zu sehen; ja, kann für diese Zielgruppe "Hilfreich" sein.

Aber bitte stelle du noch zwei Sachverhalte richtig:

...Batch-Programme müssen nicht kompiliert werden, da sie von der COMMAND.COM intepretiert werden.
Nein. Was du in diesem Beitrag beschreibst, sind durch die Bank die CMD.exe, nicht die COMMAND.com-Befehle.
command.com ist Geschichte und wenn wir hier im Forum gelegentlich mal eine Batchzeile zusammenschroten, dann immer für die CMD.exe


Zweitens:
Du hast dich in deiner Übersicht -eigentlich auch richtigerweise - konsequent auf die so genannten internen Befehle beschränkt.
Also die Befehle, für die kein externes *.Exe oder *.com-Utility nötig ist, sondern nur die CMD.exe, der Befehlsinterpreter selbst.

Dann belass es auch dabei und streich das ohnehin negativ besetzte CHOICE-Utility komplett raus.
Das gehört nicht dazu und macht eh nur Ärger.

Grüße
Biber
Friemler
Friemler 06.05.2011 um 15:40:24 Uhr
Goto Top
Hallo Zockerman,

im allgemeinen haben meine Vorredner schon das wichtigste gesagt, Biber hat es dann auf den Punkt gebracht.

Von mir aber auch noch eine Bemerkung. Im Abschnitt PARAMETER schlägst Du vor, ein Batchfile namens Copy.Bat mit dem voranstehenden Code zu erstellen. Der Aufruf mit COPY C:\USB-Stick-Daten würde aber nur wie gewünscht funktionieren, wenn das beim Aufruf aktuell gesetzte Verzeichnis auch Deine Copy.Bat enthält. Sonst werden, abhängig von der Reihenfolge der Verzeichnisse in der PATH-Variablen, die Dateien aus dem übergebenen Verzeichnis ins aktuelle Verzeichnis kopiert, weil CMD evtl. zuerst die Copy.Exe aus dem System32-Verzeichnis findet und ausführt.

Merke: Batchdateien niemals so benennen, wie eine schon auf dem System vorhandene EXE/BAT/CMD/VBS.

Nebenbei: FOR mit einer Hand voll Zeilen an Erklärung abzuhaken ist schon fast ignorant. Du solltest evtl. besser auf mein Tutorial zur FOR-Schleife verweisen.

Gruß
Friemler
bastla
bastla 06.05.2011, aktualisiert am 18.10.2012 um 18:46:47 Uhr
Goto Top
Hallo Zockerman!

Die Zeile
IF "text1==text2" ECHO Text1 entspricht Text2!
wäre noch zu überdenken, und
SET /P text=Geben Sie den Text ein! 
anstelle von
ECHO Geben Sie den Text ein!
SET /P text=
wäre wohl ebenfalls eine Überlegung wert - ebenso wie eine Anpassung von
IF "%1"=="" EXIT
"EXIT" ist in den allermeisten Fällen nur mit dem Schalter "/B" sinnvoll ist und sollte durch "GOTO :EOF" ersetzt werden.

Auch zu beachten (wenn auch nicht für das konkrete Beispiel hier): Da sehr oft ein Parameter wegen der enthaltenen Leerzeichen unter Anführungszeichen "ankommt", wäre
IF "%~1"=="...
die sichere Variante.
@Friemler
Dein Hinweis auf Dein "FOR-Toturial" ist höchst angebracht (wobei anzumerken wäre, dass dieses Tutorial hier eigentlich nicht wie für die "CMD.EXE" gedacht wirkt - und früher, also unter "COMMAND.COM", konnte "FOR" eben tatsächlich nur einen Bruchteil der heutigen Funktionalität bieten) ...

Grüße
bastla
Friemler
Friemler 06.05.2011 um 22:00:57 Uhr
Goto Top
@bastla,

Zitat von @bastla:
...dieses Tutorial hier eigentlich nicht wie für die "CMD.EXE" gedacht wirkt...

damit hast Du allerdings recht. Nur kommt der TO dann so knapp 20 Jahre zu spät mit seiner Anleitung face-wink ...

Gruß
Friemler
pieh-ejdsch
pieh-ejdsch 12.05.2011 um 23:09:58 Uhr
Goto Top
moin Zockerman,

ich bin einer von der späteren Sorte
alles in allem ein sehr, sehr grober An-Schnitt von den Grundbefehlen. Was auch mal als wichtig wegelassen wurde

  • Befehlsverkettung (wurde Verwendet aber nicht erläutert)
  • Handhabung von "Handles"
  • Erweiterung der Batchparameter
  • etc.

nimm lieber mal nur einen Befehl für ein TUT, das sollte als ausführliche Behandlung genügen (überschnitte in andere Befehle wirst Du dabei nie Vermeiden können)

Gruß Phil
linkit
linkit 30.05.2011 um 17:20:49 Uhr
Goto Top
Kritik ist immer einfach. Zumindest sollte man die Arbeit anerkennen.

Eine Bitte allerdings....

Die CMD ist weder ein Interpreter noch ein Compiler. In einer Batch-Datei werden lediglich Befehle der Reihe nach an die CMD übergeben, so als wenn man diese eingibt. Deswegen heißt das Ding Batch oder auch Stapelverarbeitung. Das hat aber mit einem interpretieren bzw. einen Interpreter nichts zu tun.
Supido
Supido 13.06.2011 um 13:05:19 Uhr
Goto Top
Hello Zockerman,

vielen Dank für deine Mühe.
Ich muss zugeben, dass ich aus den vorangegangenen Kommentaren mehr gelernt habe, als aus deiner ohnehin als Hilfe verfügbaren Anleitung.
Ich denke, das der gute Wille zählt, aber man kann beim besten Willen eine kopierte Hilfe nicht als Tutorial bezeichnen. Hätte dein Freund die Hilfe benüht, wäre uns das hier erspart geblieben.

Best regards

René