Die Agentur

Kompetenzen

Support

DREIZACK Store

Projekt in der Pipeline?

Ob Beratung, Angebot oder Anregungen. Wir sind für Sie stets über unser Kontakt-
formular erreichbar.


JTL Servicepartner

Shopify Partner

+49 (0) 345 778 990 50

Von der Konsole zum Skript – Einführung in Batch Skripte Pt.2

Lesedauer: ca. 5 Minuten

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 ;)
Geschrieben von Christian Figul

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: 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 offDabei 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
if [%1]==[] goto UNBEKANNT
echo Hallo %1
goto ENDE
:UNBEKANNT
echo Ich kenne dich nicht!
:ENDE
pause

prüft Parameter ist leer, springt
übersprungen
übersprungen
springt hier her
gibt Text aus
geht weiter
pausiert

Aufruf mit Parameter

C:\Users\Useradmin\Desktop\Tutorial\myfirstscript.bat Christian
@echo off
if [%1]==[] goto UNBEKANNT
echo Hallo %1
goto ENDE
:UNBEKANNT
echo Ich kenne dich nicht!
:ENDE
pause

prüft, ist nicht leer
Gibt Text aus
Sprunganweisung wird befolgt
übersprungen
übersprungen
springt hier her
pausiert

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

Dann seid Ihr die „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
)

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.

Bereit durchzustarten?

Sprechen Sie mit Ihrer Agentur für
e-Commerce und digitale Medien

Ob Projektanfrage oder Supportnotfall.
Schreiben Sie uns einfach eine Mail an
hallo@dreizack-medien.de

Mail schreiben

Ein heißer Draht zu Ihrem IT-Experten.
Unser Supportteam vermittelt Sie umgehend:
+49 (0) 345 778 990 50

Jetzt anrufen

Projekt im Kopf? Stellen Sie Ihre Anfrage
schnell und unkompliziert über
unser Kontaktformular

Kontakt Formular

Eine schnelle Frage? Bei uns chatten
Sie mit echten Menschen.
Chatten Sie gleich los.

Chat starten