- 1 Section
- 10 Lessons
- unbegrenzt
- CMD – Windows-Kommandozeile10
- 1.1CMD vs. PowerShell vs. WSL
- 1.2Navigation: cd, dir, md, rd, tree
- 1.3Dateioperationen: copy, move, del, ren, type
- 1.4Netzwerkbefehle: ipconfig, ping, tracert, nslookup
- 1.5Systeminformationen: systeminfo, tasklist, taskkill
- 1.6Batch-Scripting: Grundstruktur und Variablen
- 1.7Batch: Schleifen und Bedingungen
- 1.8Erweiterte Netzwerkdiagnose: arp, route, netsh
- 1.9Benutzer und Rechte: net user, net localgroup
- 1.10Praxisszenarien: Troubleshooting mit CMD
Batch-Scripting: Grundstruktur und Variablen
Bisher hast du CMD-Befehle einzeln eingetippt. Aber wenn du dieselbe Sequenz öfter brauchst – z.B. „Backup machen + Logs aufräumen + Dienst neu starten" – wäre es nervig das jedes Mal zu wiederholen. Batch-Skripte lösen das: Du packst die Befehle in eine .bat- oder .cmd-Datei und führst sie als Ganzes aus.
Batch ist eine der ältesten Skriptsprachen die heute noch in Gebrauch ist – ihre Wurzeln reichen bis MS-DOS 1981 zurück. Das bedeutet: extrem stabil und kompatibel, aber auch extrem eigenwillig in der Syntax. Wer aus Bash oder PowerShell kommt, wird Batch befremdlich finden. Aber: in Windows-Umgebungen sind Batch-Skripte allgegenwärtig – Build-Skripte, Install-Routinen, Backup-Jobs. Wer sie nicht lesen kann, ist als FISI eingeschränkt.
1) Mein erstes Batch-Skript
Ein Batch-Skript ist nichts anderes als eine Textdatei mit der Endung .bat oder .cmd (siehe L1). Inhalt: CMD-Befehle, eine pro Zeile. Speichere folgendes als hallo.bat:
Ausführen kannst du es per Doppelklick oder über die CMD:
Drei Zeilen, drei wichtige Konzepte: @echo off schaltet die automatische Ausgabe jedes Befehls aus (sonst würde CMD jeden Befehl vor der Ausführung anzeigen). echo TEXT gibt Text aus. %date% ist eine Variable die das aktuelle Datum enthält. Und pause wartet auf eine Tastatureingabe – praktisch wenn das Skript per Doppelklick gestartet wird, damit das Fenster nicht sofort wieder zugeht.
2) Die @echo off-Konvention
Jede ernsthafte Batch-Datei beginnt mit @echo off. Was passiert ohne? Jeder Befehl würde zweimal angezeigt – einmal als Eingabe-Echo des Interpreters, dann als Ergebnis-Ausgabe. Bei längeren Skripten unübersichtlich. Das @ bedeutet „diesen einzelnen Befehl nicht anzeigen", echo off schaltet es global ab. @echo off kombiniert beides: schaltet global ab, ohne selbst angezeigt zu werden. Konvention seit DOS-Zeiten.
Für Debugging temporär wieder einschalten: echo on. Oder einzelne Befehle vorübergehend mit echo davor sichtbar machen. Ohne @echo off debuggst du übrigens leichter – Anfänger lassen es manchmal weg um zu sehen was passiert.
3) Kommentare und Lesbarkeit
Wie jede Skriptsprache hat Batch Kommentare. REM (von „Remark") oder die abgekürzte Form :: – beides nimmt Batch nicht als Befehl wahr:
Technischer Unterschied: REM ist ein echter Befehl, :: ist ein ungültiges Label das CMD einfach ignoriert. Das hat eine kuriose Folge: :: ist in for-Schleifen und Blocks nicht erlaubt, weil es als Label interpretiert wird (Labels in Code-Blöcken sind verboten). Im Zweifel: REM nutzen, das funktioniert immer.
4) Variablen: set und %name%
Variablen in Batch sind Strings, die in der Umgebungs-Tabelle der laufenden CMD-Session leben. Setzen mit set, lesen mit %name%:
Wichtige Falle: set name = Anna mit Leerzeichen um das Gleichheitszeichen funktioniert NICHT korrekt – die Variable würde dann name (mit Space) heißen und den Wert Anna haben. Immer ohne Spaces um =: set name=Anna. Das ist eine der berüchtigsten Batch-Stolperfallen.
5) Variable-Lifecycle visualisieren
Wenn du verstehen willst wie Variablen sich verhalten, hilft eine schrittweise Visualisierung. Klick Schritt für Schritt durch und beobachte die Variablen-Tabelle:
!var! statt %var% brauchst. Mehr dazu in L7 Schleifen und Bedingungen.6) Eingabe vom Benutzer: set /p
Wenn das Skript interaktiv etwas vom User abfragen soll: set /p mit Prompt:
Bei der letzten Variante (mit vorhandenem Default) wird die Variable nur überschrieben wenn der User etwas eingibt. Drückt er nur Enter, bleibt der Default. Klassisches Pattern für Konfigurations-Skripte. Allerdings: set /p kann keine versteckte Eingabe (für Passwörter) – dafür gibt es keinen nativen Batch-Weg. Wer sowas braucht, nutzt PowerShell mit Read-Host -AsSecureString.
7) Arithmetik mit set /a
Variablen in Batch sind Strings. Aber mit set /a kannst du sie als Zahlen behandeln und rechnen:
Wichtige Eigenheiten von set /a: NUR Ganzzahlen (keine Dezimalzahlen!), Variablen werden ohne % benutzt (im Gegensatz zu set ohne /a), Modulo-Zeichen % muss in Skripten als %% geschrieben werden (weil % sonst als Variablen-Klammer interpretiert würde). Operatoren: + - * / % ** ! – ähnlich C. Größere Berechnungen oder Fließkommazahlen? Dann ist Batch das falsche Werkzeug – nimm PowerShell oder Python.
8) Eingebaute spezielle Variablen
Es gibt einige System-Variablen die immer verfügbar sind. Die wichtigsten:
set ohne Argumente. Eine bestimmte mit echo %name%. Variablen werden zur CMD-Session hinzugefügt und gehen beim Schließen verloren. Permanent setzen via System-Einstellungen oder mit setx. Mehr zu Umgebungsvariablen in L5.9) String-Manipulation mit Substring-Syntax
Batch hat eine seltsame aber mächtige Syntax für String-Operationen. Mit %var:~START,LENGTH% schneidest du Teile aus:
Das Substring-Pattern ist DAS Werkzeug für Datums-Stempel in Backup-Dateinamen: backup-%jahr%%monat%%tag%.zip wird zu backup-20260517.zip. Praktisch sortierbar, eindeutig, läuft täglich automatisch (mehr zur Automatisierung in K44 L9 Task Scheduler).
Aber Vorsicht: die Position der Datums-Teile hängt vom Gebietsschema ab! In Deutschland 17.05.2026, in US-englisch 05/17/2026. Bei portablen Skripten lieber einen WMI-Trick nutzen oder gleich PowerShell.
10) Skript-Argumente: %1, %2, %~dp0
Wenn dein Skript Parameter erwarten soll – z.B. backup.bat C:\Daten D:\Sicherung – greifst du sie über %1, %2, %3, ... ab. Genau wie in Bash mit $1, $2:
Die spezielle Form %~1 entfernt eventuelle Anführungszeichen vom Argument. Wenn jemand backup.bat "C:\Mit Leerzeichen" aufruft, ist %1 mit Quotes, %~1 ohne. Faustregel: fast immer %~1 nutzen.
Es gibt noch mehr Modifier:
| Modifier | Was es macht | Beispiel-Wert |
|---|---|---|
%1 | Original-Argument | "C:\Mein Pfad" |
%~1 | Ohne Anführungszeichen | C:\Mein Pfad |
%~d1 | Nur Laufwerk | C: |
%~p1 | Nur Pfad | \Mein Pfad\ |
%~n1 | Nur Dateiname (ohne Endung) | file |
%~x1 | Nur Endung | .txt |
%~dp1 | Laufwerk + Pfad (kombiniert) | C:\Mein Pfad\ |
%~f1 | Voller absoluter Pfad | C:\Mein Pfad\file.txt |
%~z1 | Dateigröße in Bytes | 1245 |
Besonders wichtig: %~dp0 – das gibt dir den Pfad des Skripts selbst. Damit kannst du Hilfsdateien neben dem Skript referenzieren, egal wo das Skript aufgerufen wird:
11) Alle Argumente auf einmal: %*
%* ist die Sammlung aller Argumente. Praktisch um sie an einen anderen Befehl weiterzureichen:
Auch nützlich: shift verschiebt die Argument-Liste um eins. Nach shift wird aus dem alten %2 das neue %1. Praktisch für Skripte die beliebig viele Argumente verarbeiten:
12) Errorlevel: hat der Befehl funktioniert?
Jeder Befehl in Windows setzt nach Ausführung einen Exit-Code in der Variable %errorlevel%. Konvention: 0 = Erfolg, alles andere = irgendein Fehler. Damit kannst du auf Fehler reagieren:
Der eigene Skript-Exit-Code wird mit exit /b N gesetzt. Das ist wichtig wenn andere Skripte dein Skript aufrufen – sie können dann auf den Code reagieren. Mehr zu Bedingungen (if, else) in L7.
13) Umleitung und Pipes
Wie in Bash oder PowerShell kann auch Batch Ausgaben in Dateien umleiten oder zwischen Befehlen verketten:
Wichtige Konstrukte: > überschreibt, >> hängt an, 2> für stderr, 2>&1 verknüpft stderr mit stdout, nul ist das Windows-Pendant zu /dev/null. Mit der Pipe | verkettest du Befehle – find und findstr sind die wichtigsten Filter-Tools.
14) findstr – Filter wie grep
Der Such-Befehl: findstr sucht Text in Dateien oder Pipe-Input. Vergleichbar mit grep in Bash, allerdings deutlich weniger mächtig:
Wichtige Optionen: /i ignore case, /n mit Zeilennummern, /v invers (was NICHT matcht), /c: für exakte Phrasen mit Leerzeichen, /r für eingeschränkte Regex. Für ernsthaftere Textverarbeitung in einem Skript ist Batch aber wirklich nicht ideal – PowerShell mit Select-String oder Python mit re sind dafür viel besser.
15) Ein realistisches Beispiel-Skript
Zum Abschluss alles zusammen – ein Backup-Skript mit Datums-Stempel, Logging, Fehlerbehandlung:
Das ist ein realistisches Pattern: Argument-Validierung, Zeitstempel-Logik, Logging, Errorlevel-Handling, klare Exit-Codes. setlocal / endlocal begrenzen Variablen-Änderungen auf das Skript (sie werden nicht in die aufrufende CMD-Session „durchsickern"). Auch if not exist ist ein Pattern für Pre-Checks – mehr zu Bedingungen in L7.
Zusammenfassung
Batch-Skripte sind .bat/.cmd-Dateien mit CMD-Befehlen. Beginnen mit @echo off für saubere Ausgabe. Kommentare mit REM oder :: (in Blocks: nur REM!). Variablen: set name=Wert setzen (keine Spaces um =!), %name% lesen. Eingabe: set /p. Rechnen: set /a nur Ganzzahlen. Spezielle Variablen: %date%, %time%, %cd%, %username%, %errorlevel%, %random%. Substring-Syntax: %var:~START,LEN% für Zeichen-Bereiche. Argumente: %1 bis %9, modifier %~1 (ohne Quotes), %~dp1 (Pfad), %~dp0 (Pfad des Skripts), %* (alle), shift für Schleife. Exit-Code: %errorlevel% prüfen, eigener mit exit /b N. Umleitung: >, >>, 2>nul, |. Filter: findstr mit /i, /n, /v. Scoping: setlocal/endlocal. Im Vergleich zu Bash und PowerShell deutlich limitierter – aber überall verfügbar und seit 40 Jahren stabil.
