Von der Konsole zum Skript – Einführung in Batch Skripte Pt.2
Im ersten Teil unserer Serie haben wir uns grundlegend mit der Konsole auseinandergesetzt, die ersten Befehle kennengelernt und unser erstes Programm gestartet. Falls du es noch ein mal nachlesen möchtest, findest du hier den Beitrag Was hat es denn nun mit den Batch-Skripten auf sich? Alles was du mit der Konsole machen kannst, kannst du in ein Batch Skript schreiben und so nacheinander ausführen lassen. Ob nun einzelne Befehle oder gleich mehrere. Grenzen existieren meist nur in deinem Kopf....und in deinem Können ;)
Dein erstes Batch Skript
Wir starten einfach. Lege auf deinem Desktop einen Ordner „Tutorial“ an. Profis unter euch kennen schon den Befehl mkdir
und navigieren gekonnt auf den Desktop und erstellen den Ordner per Konsole. Für die Nicht-Streber unter euch hier noch ein kleiner Tipp: Öffnet den Ordner wie gewohnt auf dem Desktop und klickt nun ein mal in die Addresszeile. Überschreibt die gesamte Zeile mit cmd
Prompt öffnet sich die Konsole. Das Beste daran: Ihr seid schon im richtigen Verzeichnis.
Jetzt aber wieder etwas für Könner. Wir erstellen eine neue Datei mit dem folgendem Befehl
> copy NUL myFirstScript.bat
EXKURS
Copy Befehl
Es gibt keinen Befehl für das Erstellen einer leeren Datei, aber einen zum kopieren, nämlich copy
Der erste Parameter, für diesen Befehl mal ohne –, steht für den Ursprung und der zweite Parameter für das Ziel. In diesem Fall kopieren wir einfach „Nichts“ in eine Datei myFirstScript.bat
, die durch den Kopiervorgang erzeugt wird. Heraus kommt eine leere Batch Datei.
HINWEIS
Relative Pfade
Hier seht ihr auch noch mal die Wirkung eines relativen Pfades. Weil ihr im Ordner Tutorial seid und der Pfad zur Datei ein relativer ist, wurde die Datei direkt in diesem Ordner angelegt. Man hätte den Dateipfad aber auch absolut angeben können.
Die neu erstellte Batch Datei lässt sich einfach per Rechts-Klick >>> Bearbeiten mit dem Texteditor öffnen. Wer mag kann sich einen professionelleren Code Editor wie Microsoft VS Code installieren und die Dateien damit bearbeiten. Für Batch Files genügt der Texteditor aber auch.
Hallo Welt – echo und pause
Schreiben wir nun unsere erste Zeile:Der Befehl echo
macht nichts anderes als den gegebenen Text wieder auszugeben. Das kann bei umfangreicheren Skripten nützlich sein, um zB Anweisungen zu geben.Schreiben wir also in unsere Batch Datei:
echo Hello World
Speichern, schließen, fertig.Mit einem Doppelklick auf die Batchdatei startet Ihr nun das Script. Etwas gesehen? Nicht? Nur ein kurzes Flimmern? Klar! Denn nach Ausführung des Scripts schließt sich die Konsole sofort wieder.Wollt ihr das verhindern, ein wichtiger Tipp auch bei der Fehlersuche, schreibt in eine neue Zeile den Befehl pause
echo Hello World
pause
Speichern, schließen, Doppelklick…ein Traum!Das Fenster bleibt offen und ihr seht euer Ergebnis.
EXKURS
@echo off
Ihr habt sicher bemerkt, dass jeder Befehl auch noch mal gelistet wird als hättet ihr ihn selbst in die Konsole geschrieben. Um diese unschöne Ausgabe zu unterbinden, schreibt vor euer Skript@echo off
Dabei ist echo off
der eigentliche Befehl um alle folgenden Befehlsausgaben zu unterdrücken. Das @
Davor unterdrückt die Ausgabe von echo off
selbstNutzt also @
um einzelne Befehlsausgaben zu unterdrücken, echo off/on
um die Befehlsausgabe generell aus und einzuschalten und @echo off
um schon diesen Befehl auszublenden.Übrig bleibt dann nur das, was ihr auch wirklich in der Konsole sehen wollt.
Weitere Beispiele
Herzlichen Glückwunsch. Du hast schon viel gelernt und dein erstes Skript geschrieben.Ein Batch File macht also nichts anderes als eine Reihe von Befehlen auszuführen, als würdet ihr sie selbst in die Konsole eingeben.Probieren wir etwas aus:Wir wollen einen Ordner „Unterordner“ anlegen, diesen betreten, darin einen weiteren Unterordner „UnterUnterOrdner“ anlegen, diesen wieder betreten und darin eine Textdatei „test.txt“ anlegen.Versucht es selbst, die Lösung folgt hier:
mkdir Unterordner
cd Unterordner
mkdir UnterUnterOrdner
cd UnterUnterOrdner
copy NUL test.txt
Ihr seht, das Skript navigiert sich selbst in die Unterebenen. Man hätte es natürlich auch einfacher mit einer Verkettung von Pfaden machen können. Löscht die Ordner wieder und versucht das:
mkdir Unterordner
mkdir Unterordner\UnterUnterOrdner
copy NUL UnterOrdner\UnterUnterOrdner\test.txt
Eigene Parameter übergeben
Wenn Ihr euer Skript variabel gestalten wollt, könnte es hilfreich eigene Parameter zu übergeben. Beispielsweise könnte man mittels Workflow ein Batch Skript starten, welches die Artikelnummer eines Artikels oder eine Auftragsnummer übergibt. Mit einem geeigneten SQL Script könnte man anschließend einen ganzen Export passend zum übergebenen Parameter anstoßen.Einen Parameter übergebt ihr genau so wie gewohnt. Lasst ein Leerzeichen hinter dem Namen eures Skripts und schreibt den Wert, den ihr übergeben wollt.Den Wert könnt ihr einfach mit %1
in eurem Skript abrufenHabt ihr 2 Parameter, bekommt ihr sie beide mit %1
und %2
und so weiterSchreibt in euer Skript also folgendes:
@echo off
echo %1 %2
pause
Startet nun eure Konsole im Verzeichnis eures Skripts und startet es mit:
C:\Users\Useradmin\Desktop\Tutorial\myfirstscript.bat Hallo Christian
>>Hallo Christian
Das Prinzip wird klar, oder?
Sprungmarken
Jetzt wirds komplex. Statt ein Skript einfach nur linear ablaufen zu lassen können wir auch Sprungmarken setzen und je nach Bedingung zu dem einen oder andern Teil im Skript springen.
Eine Sprungmarke setzt du mit goto MEINEMARKE
. Das Ziel gibst du mit einem Doppelpunkt an :MEINEMARKE
Dabei muss der Name exakt übereinstimmen.Um das Thema im richtigen Kontext zu verstehen prüfen wir gleich noch, ob ein Parameter überhaupt übergeben wurde mit if [%1]==[]
Sprich: Wenn Parameter1 gleich leer istDas Skript könnte so aussehen:
@echo off
if [%1]==[] goto UNBEKANNT
echo Hallo %1
goto ENDE
:UNBEKANNT
echo Ich kenne dich nicht!
:ENDE
pause
Je nachdem, ob ihr nun das Skript mit oder ohne Parameter startet passiert folgendes:
Aufruf ohne Parameter
C:\Users\Useradmin\Desktop\Tutorial\myfirstscript.bat
@echo off
:: prüft Parameter ist leer, springt
if [%1]==[] goto UNBEKANNT
:: übersprungen
echo Hallo %1
:: übersprungen
goto ENDE
:: springt hier her
:UNBEKANNT
:: gibt Text aus
echo Ich kenne dich nicht!
:: geht weiter
:ENDE
::pausiert
pause
Aufruf mit Parameter
C:\Users\Useradmin\Desktop\Tutorial\myfirstscript.bat Christian
@echo off
:: prüft, ist nicht leer
if [%1]==[] goto UNBEKANNT
:: gibt Text aus
echo Hallo %1
:: Sprunganweisung wird befolgt
goto ENDE
:: übersprungen
:UNBEKANNT
:: übersprungen
echo Ich kenne dich nicht!
:: springt hier her
:ENDE
::pausiert
pause
ACHTUNG
Achtung: Hütet euch vor Endlosschleifen!
Bitte nicht nachmachen, aber Ihr könntet natürlich auch so etwas basteln:
@echo off
:MARKE
echo Hallo
goto MARKE
Sprünge funktionieren also auch zurück und ihr könnt schleifen basteln.
Logische Operatoren und Platzhalter
Abgesehen vom Überprüfen einer leeren Variable könnt ihr noch mehr Vergleiche anstellen:
@echo off
if 1==1 echo 1 ist gleich 1
if not 1==2 echo 1 ist nicht 2
if 1 neq 2 echo 1 ist immer noch nicht 2
pause
Probiert es aus.
==
prüft also zwei Werte auf Gleichheit.
not
vor der Prüfung negiert das Ergebnis.
Anstelle von not
und ==
könnt ihr aber auch neq
benutzen – n
ot eq
ual
Um zu prüfen, ob eine Datei oder ein Verzeichnis existiert nutzen wir exist
, sehr hilfreich auch im Zusammenhang mit Plathhaltern *
Legt eine Datei test.txt
und einen Ordner subordner
im Verzeichnis Tutorial an und probiert folgendes aus
@echo off
if exist test.txt echo Die Datei test.txt existiert
if exist *.txt echo Eine Datei mit Endung .txt existiert
if exist *ubordn* echo Ein Ordner existiert
if exist sub*ner echo So ein Ordner exisitert auch
pause
Ihr seht, das Sternchen kann euch viele Muster bestätigen.
Zusammenfassung – Put it all together
Na? Ideen wozu wir das nutzen könnten?
Wie wäre es damit zuerst zu prüfen, ob ein Unterordner existiert bevor wir eine Datei kopieren und den Ordner hilfsweise selbst anlegen. Die Datei könnten wir dabei gleich als Parameter übergeben.Versuchen wir nun die existierende Datei text.txt
in den noch nicht existierenden Ordner importiert
zu verschieben:
@echo off
if [%1]==[] goto FEHLER
goto CHECKDIR
:FEHLER
echo Parameter wurde nicht übergeben
goto ENDE
:CHECKDIR
if not exist importiert mkdir importiert
if exist %1 goto COPY
echo Datei existiert nicht!
goto ENDE
:COPY
move %1 importiert\%1
:ENDE
pause
Klar soweit? Ab jetzt wird es vielleicht etwas unübersichtlich. Es hilft jeden Ausgang einer Frage Schritt für Schritt nachzuprüfen. Vielleicht auch hier und da mal eine pause
einlegen und in Ruhe schauen wo ihr steht 😉
Loops – Schleifen
Mittels for
lassen sich diverse Schleifen bauen, die einen bestimmten Skriptcode für eine bestimmte Anzahl an Durchläufen wiederholen.
Einfache Schleife
Die einfachste Schleife wiederholt sich durch eine definiertes Intervall.
for /l %%x in (1, 1, 100) do echo %%x
Das /l
gibt dabei an, dass es sich bei den Schleifendurchläufen um einen nummerischen Wert handelt. Die Variable %%x
nimmt für jeden Schleifendurchlauf den Wert des aktuellen Elements aus dem definierten Intervall an. (1, 1, 100)
Gibt das Intervall von 1 bis 100 an mit einer Schrittlänge von 1. Hingegen würde (1,5,100)
mit 1 beginnen, der Wert der Variable im zweiten Durchlauf wäre dann aber 6, 11, 16 …
Nach der Definition des Bereichs folgt die eigentliche Aufgabe für jeden Schleifendurchlauf, angezeigt durch do
Im Beispiel geben wir also immer die aktuelle Zahl aus dem Intervall aus.Hat man mehrere Anweisungen, lassen sich diese wie folgt definieren:
for /l %%x in (1, 1, 100) do (
echo %%x
echo hallo
)
INFO
Die %%
sind eine Schreibweise innerhalb von Batchscripten.
Wenn Ihr Schleifen direkt mit der Konsole konstruiert braucht ihr nur ein %
Schleifen über Dateien
Schleifen lassen sich auch über ein Set von Dateien schreiben:
for %%x in (C:\Users\Useradmin\Desktop\Tutorial\*) do @echo %%x
Das Beispiel gibt die vollständigen Pfade aller Dateien innerhalb unseres Tutorialordners aus.Wer das gleiche für Verzeichnisse sucht, probiert den Parameter /d
for /d %%x in (C:\Users\Useradmin\Desktop\Tutorial\*) do @echo %%x
forfiles – Loop
Für Dateien gibt es noch eine weitere Art von Schleife.
Der forfiles
loop ist sehr nützlich, wenn man Dateien nach bestimmten Kriterien weiterverarbeiten möchte oder mehr Informationen über die Dateien ausgegeben bekommen möchte.
forfiles /p "C:\Users\Useradmin\Desktop\Tutorial" /d -7 /c "cmd /c del @file"
/p
gibt das Startverzeichnis an in dem gesucht werden soll/d
ist ein optionaler Parameter, der sich auf das Änderungsdatum der Dateien bezieht. -7 Sagt hier, dass nur Dateien gewählt werden sollen, deren letzte Änderung länger als 7 Tage her ist.
Mit /c
übergebt ihr dann ein Kommando. Um auf Standard Konsolen-Befehle zurückzugreifen, müsst ihr cmd
als Programm angeben und wiederum mit /c
dem cmd
einen Befehl übergeben. @file
ist eine besondere Variable von forfiles
und gibt euch den Dateinamen aus.der Befehl del
löscht die angegebene Datei.
Mit dem optionalen Parameter /s
Kann die Suche nach Dateien rekursiv angesetzt werden. D.h. es werden auch alle Unterordner ab dem Startverzeichnis untersucht und Dateien so behandelt wie ihr es wünscht.
Spielereien mit dem Datum und Variablen
Variablen setzen und ausspielen
Variablen sind super, um Werte zwischenzuspeichern, die man im späteren Verlauf noch benötigtEine Variable setzt ihr einfach so:
set meineVariable="mein Wert"
und ruft sie so ab:
echo %meineVariable%
Merken wir uns das, denn wir brauchen es gleich wieder. Aber zuerst kommen wir zum Datum.
Datum, Zeit und Slice-Funktion
Gerade wenn durch Batchdateien regelmäßig Dateien geschrieben oder übertragen werden sollen, ist es sinnvoll den Dateien ein Datum zu geben, damit sie eindeutig sind.
Hilfreich ist hier die Datumsvariable date
Versucht es mal aus:
echo %date%
>08.03.2022
Diese Variable habt ihr nicht definiert, aber sie ist immer und überall verfügbar. Allerdings könnten die Punkte stören und für eine Sortierung wäre ein Format yyyy-MM-dd wünschenswert.
Hier hilft die „Slice“-Funktion mit der wir Text an beliebigen Stellen und zu beliebigen Stücken auftrennen könnenDie Funktion ist folgendermaßen aufgebaut:
%meineVariable:~<Start>,<AnzahlZeichen>%
Im Realen Beispiel:
%date:~6,4%
Was erhalten wir? Richtig! Das Jahr! Nicht erkannt? Kein Problem, Hier noch mal.
Wir zählen die Zahlen aus der Ausgabe des Datums ein mal durch beginnend mit 0:
0123456789
08.03.2022
%date:~6,4%
nimmt sich die Ausgabe der Variable date
vor, beginnt ab Stelle 6
und gibt von dort aus 4
Zeichen aus
Jetzt der Monat dazu:
echo %date:~6,4%-%date:~3,2%
>2022-03
und den Tag? Easy!
echo %date:~6,4%-%date:~3,2%-%date:~0,2%
>2022-03-08
Ein Traum. Jetzt speichern wir das Ganze in eine Variable:
set meinDatum=%date:~6,4%-%date:~3,2%-%date:~0,2%
echo %meinDatum%
>2022-03-08
Der Wahnsinn!
Und was machen wir jetzt damit? Dateien beschriften!
Und wer es genauer haben möchte, nutzt die time
Variable und bastelt sich noch Stunden, oder Sekunden davor.
Tipp: Bei einstelligen Stundenangaben nutzt ihr die Funktion
%time: =0%
um aus den Leerzeichen führende Nullen zu machen.
Eine Datei lässt sich nun mittels move
command und Datumsvariable einfach neu beschriften:
@echo off
set meinDatum=%date:~6,4%-%date:~3,2%-%date:~0,2%
move test.txt %meinDatum%_test.txt
pause
Funktioniert natürlich auch mit copy
und/oder Unterordnern
Zusammenfassung
Qualmt der Kopf? Nein? Dann freut euch auf das nächste Tutorial. Mit Abschluss dieses Tutorials hast du sehr viele wichtige Basics gelernt, die du für einfache bis komplexere Szenarien benutzen kannst.
Im nächsten Tutorial schauen wir uns komplexere Skripte an, laden Dateien von einem FTP Server und exportieren Daten via SQL als CSV.
Über uns
Als zertifizierter JTL Servicepartner und Full Service Agentur, stehen wir dir jederzeit zur Verfügung. Das Team um DREIZACK Medien steht dir mit umfassender Kompetenz, langjähriger Erfahrunug und unbegrenzter Leidenschaft für digitale Produkte zur Verfügung.