Batch / CMD Scripting – Grundlagen
Batch-Skripte (.bat/.cmd) automatisieren Windows-Aufgaben ohne Installation – Grundbefehle, Variablen, Schleifen, Fehlerbehandlung und Praxisbeispiele.
Was ist ein Batch-Skript?
Ein Batch-Skript ist eine einfache Textdatei mit der Endung .bat oder .cmd, die der Windows-Kommandozeileninterpreter cmd.exe Zeile für Zeile ausführt. Das Konzept stammt aus den DOS-Zeiten der 1980er-Jahre, ist aber auch heute noch in jedem Windows-System ohne jegliche Installation sofort verfügbar.
Als IT-Allrounder in einem KMU begegnest du Batch-Skripten laufend: als Login-Skripte in der Gruppenrichtlinie, als einfache Wrapper um Installationsprogramme, als Cleanup-Jobs für alte Logdateien oder als schnelle Netzlaufwerk-Mapper. Auch wenn PowerShell die modernere und leistungsfähigere Alternative ist, bleibt Batch das Go-to-Tool für schnelle Einzeiler und einfache Aufgaben, weil jeder Techniker es sofort öffnen und lesen kann.
Batch vs. PowerShell – wann was?
| Kriterium | Batch (.bat/.cmd) | PowerShell (.ps1) |
|---|---|---|
| Lernkurve | Sehr flach | Steiler |
| Lesbarkeit | Einfach | Besser strukturiert |
| Objekte / Rückgabewerte | Nur Text | Echte .NET-Objekte |
| Fehlerbehandlung | Rudimentär | Vollständig (try/catch) |
| Einsatz | Einfache Aufgaben, Login-Skripte | Komplexe Automatisierung, AD, APIs |
| Überall verfügbar | Ja, auch auf älteren Systemen | Ab Windows 7 / Server 2008 R2 |
Skript erstellen und ausführen
Ein Batch-Skript erstellst du am einfachsten mit dem Texteditor. Speichere die Datei mit der Endung .bat oder .cmd – nicht .txt!
Öffnen per Ausführen-Dialog:
Drücke Win+R, tippe cmd und bestätige mit Enter. Wechsle dann mit cd ins Verzeichnis deines Skripts und führe es mit dem Dateinamen aus.
Als Administrator ausführen:
Rechtsklick auf die .bat-Datei > “Als Administrator ausführen”. Alternativ im Startmenü nach cmd suchen und Strg+Umschalt+Enter drücken.
Grundgerüst jedes Batch-Skripts:
@echo off
REM ============================================
REM Skriptname: mein-skript.cmd
REM Autor: IT-Admin
REM Datum: 2026-06-23
REM Zweck: Kurze Beschreibung
REM ============================================
setlocal enabledelayedexpansion
REM Hier beginnt die eigentliche Logik
echo Skript gestartet...
:ende
echo Fertig.
pause
exit /b 0
Was diese Zeilen bedeuten:
@echo off– Unterdrückt die Ausgabe jedes Befehls selbst (nur die Ergebnisse werden angezeigt). Das@verhindert, dass auchecho offselbst angezeigt wird.REM– Kommentar, wird nicht ausgeführt. Alternativ::(aber nicht in IF-Blöcken verwenden).setlocal enabledelayedexpansion– Aktiviert die verzögerte Variablenauswertung mit!VAR!statt%VAR%– wichtig innerhalb von Schleifen.exit /b 0– Beendet das Skript mit Exit-Code 0 (Erfolg)./bbeendet nur das Skript, nicht das gesamte CMD-Fenster.
Variablen
@echo off
REM Variable setzen
set COMPUTERNAME_VOLL=%COMPUTERNAME%
set BENUTZERNAME=Max Muster
set ANZAHL=5
REM Variable ausgeben
echo Computer: %COMPUTERNAME_VOLL%
echo Benutzer: %BENUTZERNAME%
echo Anzahl: %ANZAHL%
REM Systemvariablen (immer verfügbar)
echo Username: %USERNAME%
echo Domain: %USERDOMAIN%
echo Profil: %USERPROFILE%
echo Systemroot: %SystemRoot%
echo Programfiles: %ProgramFiles%
echo Datum: %DATE%
echo Uhrzeit: %TIME%
echo Computername: %COMPUTERNAME%
REM Variable aus Befehlsausgabe befüllen
for /f "tokens=*" %%i in ('hostname') do set HOSTNAME=%%i
echo Hostname: %HOSTNAME%
REM Benutzer nach Eingabe fragen
set /p EINGABE=Bitte einen Wert eingeben:
echo Du hast eingegeben: %EINGABE%
Wichtige Befehle im Überblick
Verzeichnisse und Dateien
REM Verzeichnis wechseln
cd C:\Users\Admin\Desktop
cd .. :: Eine Ebene hoch
cd /d D:\Freigaben :: Auch Laufwerk wechseln
REM Verzeichnisinhalt anzeigen
dir :: Normales Listing
dir /a /b :: Alle Dateien, nur Namen
dir /a:h :: Nur versteckte Dateien
dir /s /b *.log :: Alle .log-Dateien rekursiv
REM Verzeichnisse erstellen und löschen
mkdir C:\Temp\Backup\2026
rmdir /s /q C:\Temp\Backup\Alt :: Mit Inhalt, keine Rückfrage
REM Dateien kopieren, verschieben, löschen
copy Quelle.txt Ziel.txt
copy C:\Skripte\*.cmd D:\Backup\
xcopy C:\Daten\ D:\Backup\Daten\ /s /e /i /y :: Rekursiv, mit leeren Ordnern
robocopy C:\Quelle D:\Ziel /mir /r:3 /w:5 :: Professionelles Kopieren / Spiegeln
move Datei.txt C:\Zielordner\
del /q /f C:\Temp\*.tmp :: Ohne Rückfrage, auch Read-only
Netzwerk-Befehle
REM IP-Informationen
ipconfig /all
ipconfig /release
ipconfig /renew
ipconfig /flushdns
REM Verbindungstest
ping -n 4 8.8.8.8
ping -n 1 server.firma.ch > nul 2>&1
if %errorlevel% == 0 (echo Erreichbar) else (echo Nicht erreichbar)
REM Netzlaufwerk verbinden
net use Z: \\server01\freigaben /persistent:yes
net use Z: /delete
net use :: Alle Verbindungen anzeigen
REM Lokale Benutzer und Gruppen
net user :: Alle lokalen User
net user max.muster /domain :: Domain-User-Info
net localgroup Administrators :: Mitglieder der Admin-Gruppe
REM DNS-Auflösung
nslookup server01.firma.ch
REM Offene Verbindungen / Ports
netstat -an
netstat -b :: Mit Prozessname (als Admin)
Prozesse und Dienste
REM Prozesse
tasklist :: Alle laufenden Prozesse
tasklist /fi "imagename eq chrome.exe"
taskkill /im notepad.exe /f :: Erzwungen beenden
taskkill /pid 1234 /f
REM Dienste
sc query :: Alle Dienste
sc query wuauserv :: Windows Update Dienst
sc start "Spooler" :: Druckerspooler starten
sc stop "Spooler"
net start "Spooler" :: Alternative zu sc
net stop "Spooler"
REM System-Info
systeminfo
systeminfo | findstr /C:"OS Name" /C:"Total Physical"
Registry-Zugriff
REM Registry lesen
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
REM Registry schreiben (als Admin)
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" ^
/v "MeinTool" /t REG_SZ /d "C:\Tools\tool.exe" /f
REM Registry-Eintrag löschen
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "MeinTool" /f
REM Exportieren / Importieren
reg export "HKCU\Software\MeinProgramm" C:\Backup\settings.reg
reg import C:\Backup\settings.reg
Bedingungen (IF)
@echo off
REM Datei prüfen
if exist C:\Windows\System32\cmd.exe (
echo CMD gefunden.
) else (
echo Nicht gefunden!
)
REM Verzeichnis prüfen
if exist C:\Logs\ (
echo Log-Ordner vorhanden.
) else (
mkdir C:\Logs
echo Log-Ordner erstellt.
)
REM Variablenvergleich (Strings)
set STATUS=OK
if "%STATUS%"=="OK" echo Status ist in Ordnung.
if not "%STATUS%"=="OK" echo Status hat ein Problem.
REM Zahlenvergleich (EQU, NEQ, LSS, LEQ, GTR, GEQ)
set /a WERT=10
if %WERT% GTR 5 echo Wert ist grösser als 5.
if %WERT% EQU 10 echo Wert ist genau 10.
REM Fehlercode (ERRORLEVEL) auswerten
ping -n 1 8.8.8.8 > nul 2>&1
if %errorlevel% EQU 0 (
echo Internet erreichbar.
) else (
echo Kein Internet!
goto :fehler
)
goto :ende
:fehler
echo Skript mit Fehler beendet.
exit /b 1
:ende
echo Alles gut.
exit /b 0
Schleifen (FOR)
@echo off
setlocal enabledelayedexpansion
REM Über Dateien iterieren
for %%f in (C:\Logs\*.log) do (
echo Verarbeite: %%f
del /q "%%f"
)
REM Zahlen-Schleife: von 1 bis 10 in Schritten von 1
for /l %%i in (1,1,10) do (
echo Iteration %%i
)
REM Über eine Textdatei iterieren (jede Zeile)
for /f "tokens=*" %%z in (C:\Scripts\serverliste.txt) do (
ping -n 1 %%z > nul 2>&1
if !errorlevel! EQU 0 (
echo %%z - ONLINE
) else (
echo %%z - OFFLINE
)
)
REM Über Ordner iterieren
for /d %%d in (C:\Users\*) do (
echo Benutzerordner gefunden: %%d
)
REM Ausgabe eines Befehls verarbeiten
for /f "tokens=1,2 delims=," %%a in ('net user /domain ^| findstr /v "^$"') do (
echo Benutzer: %%a
)
FOR-Variablen in Skripten: Immer mit doppeltem Prozentzeichen %%variable schreiben (auf der Kommandozeile direkt: nur %variable).
Praxisbeispiele für den IT-Alltag
Netzlaufwerke per Login-Skript verbinden
@echo off
REM Login-Skript – wird per GPO beim Anmelden ausgeführt
REM GPO-Pfad: Benutzerkonfiguration > Windows-Einstellungen > Skripte (Anmelden)
net use H: /delete > nul 2>&1
net use S: /delete > nul 2>&1
net use H: \\srv-datei01\home$\%USERNAME% /persistent:no
net use S: \\srv-datei01\softwarefreigabe /persistent:no
if %errorlevel% NEQ 0 (
echo Netzlaufwerk konnte nicht verbunden werden. Bitte IT kontaktieren.
pause
)
exit /b 0
Alte Logdateien aufräumen
@echo off
REM Alle .log-Dateien aelter als 30 Tage im Zielordner loeschen
set LOGPFAD=C:\inetpub\logs\LogFiles
set TAGE=30
forfiles /p "%LOGPFAD%" /s /m *.log /d -%TAGE% /c "cmd /c del @path" 2>nul
echo Log-Cleanup abgeschlossen (%TAGE% Tage).
exit /b 0
Software silent installieren
@echo off
REM 7-Zip silent installieren (typisch fuer Software-Rollout)
set INSTALLER=\\srv-soft01\Software\7zip\7z2401-x64.exe
set LOGFILE=C:\Temp\install_7zip.log
if not exist "%INSTALLER%" (
echo Installer nicht gefunden: %INSTALLER%
exit /b 1
)
echo Installation wird gestartet...
"%INSTALLER%" /S /L "%LOGFILE%"
if %errorlevel% EQU 0 (
echo Installation erfolgreich.
) else (
echo Installation fehlgeschlagen! Exitcode: %errorlevel%
exit /b 1
)
exit /b 0
System-Inventar-Snapshot
@echo off
REM Schnelles Inventar des aktuellen PCs als Textdatei
set AUSGABE=C:\Temp\inventar_%COMPUTERNAME%_%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%.txt
echo Inventar %COMPUTERNAME% > "%AUSGABE%"
echo Erstellt: %DATE% %TIME% >> "%AUSGABE%"
echo ================================ >> "%AUSGABE%"
systeminfo >> "%AUSGABE%"
echo ================================ >> "%AUSGABE%"
ipconfig /all >> "%AUSGABE%"
echo ================================ >> "%AUSGABE%"
net user >> "%AUSGABE%"
echo Inventar gespeichert unter: %AUSGABE%
exit /b 0
Ausgabe umleiten und pipen
REM Standard-Ausgabe in Datei schreiben (ueberschreiben)
dir C:\Windows > C:\Temp\verzeichnis.txt
REM Standard-Ausgabe anhaengen
echo Neue Zeile >> C:\Temp\log.txt
REM Fehlerausgabe in Datei
ping falscherhost 2> C:\Temp\fehler.txt
REM Beide Streams in dieselbe Datei
robocopy C:\Quelle D:\Ziel /mir > C:\Temp\robocopy.log 2>&1
REM Ausgabe unterdrücken (Stille)
ping -n 1 google.com > nul 2>&1
REM Pipen an findstr (wie grep)
tasklist | findstr /i "chrome"
systeminfo | findstr /C:"Betriebssystemversion"
REM Pipen an more (seitenweise anzeigen)
dir C:\Windows | more
Fehlerbehandlung und ERRORLEVEL
Jeder Befehl in Batch gibt nach seiner Ausführung einen Exit-Code zurück, der in %errorlevel% gespeichert wird. 0 bedeutet Erfolg, alles andere ist ein Fehler.
@echo off
REM Einzeiler-Prüfung nach jedem kritischen Befehl
xcopy C:\Quelle D:\Ziel /s /e /y
if %errorlevel% NEQ 0 (
echo FEHLER: xcopy fehlgeschlagen mit Code %errorlevel%
echo %DATE% %TIME% - xcopy Fehler %errorlevel% >> C:\Logs\fehler.log
exit /b %errorlevel%
)
REM Kurzform: && und || (cmd.exe unterstuetzt das)
ping -n 1 8.8.8.8 > nul && echo Online || echo Offline
Skript mit Parametern aufrufen
@echo off
REM Aufruf: mein-skript.cmd MaxMuster "C:\Pfad mit Leerzeichen"
set BENUTZER=%1
set PFAD=%2
if "%BENUTZER%"=="" (
echo Fehler: Kein Benutzername angegeben.
echo Aufruf: %~nx0 ^<Benutzername^> ^<Pfad^>
exit /b 1
)
echo Verarbeite Benutzer: %BENUTZER%
echo Pfad: %PFAD%
REM %0 = Skriptname selbst
REM %1 - %9 = Parameter 1 bis 9
REM %~nx0 = Dateiname ohne Pfad (z.B. mein-skript.cmd)
REM %~dp0 = Verzeichnis des Skripts (mit abschliessendem Backslash)
REM %~f1 = Vollständiger Pfad des ersten Parameters
REM %* = Alle Parameter zusammen
Troubleshooting
Batch-Skripte debuggen ist manchmal mühsam – aber es gibt ein paar Tricks:
Schritt-für-Schritt-Debugging:
Entferne vorübergehend @echo off, damit du siehst, welcher Befehl gerade ausgeführt wird. Jede Zeile wird dann vor der Ausführung angezeigt.
pause einfügen:
Füge pause nach verdächtigen Stellen ein, damit das Fenster offenbleibt und du den aktuellen Zustand siehst.
Errorlevel ausgeben:
Gib nach jedem Befehl echo Exitcode: %errorlevel% aus, um zu sehen, was schiefgelaufen ist.
Häufige Fehler:
| Fehlerbild | Ursache | Lösung |
|---|---|---|
| Variable ist leer in Schleife | Fehlende delayed expansion | setlocal enabledelayedexpansion + !VAR! |
| Pfade mit Leerzeichen brechen | Fehlende Anführungszeichen | Pfade immer in "..." einschliessen |
'xyz' ist kein Befehl | Befehl nicht gefunden / Tippfehler | where xyz prüfen, Pfad angeben |
| Fenster schliesst sofort | Fehler vor pause | pause am Ende einfügen oder via CMD öffnen |
%%f zeigt %f | Skript aus CMD-Zeile getestet | In Skript immer %%, direkt in CMD nur % |
| Datum/Zeit-Format falsch | Regionale Einstellungen | %DATE:~0,2% etc. auf dein Format anpassen |
Vom Batch-Skript zu PowerShell wechseln
Batch-Skripte stossen schnell an Grenzen: keine echten Arrays, keine Fehlerbehandlung, keine strukturierten Daten. Sobald ein Skript komplex wird, lohnt sich der Umstieg auf PowerShell. Viele CMD-Befehle funktionieren auch in PowerShell-Skripten direkt – der Übergang ist fliessend.
Für alles rund um Active Directory, M365, Dienste, Registrierung oder komplexere Logik schau dir die Seite PowerShell im IT-Alltag an. Und wenn du Skripte regelmässig und automatisch ausführen willst, ist der Task Scheduler dein nächster Schritt.
Batch-Skripte in Gruppenrichtlinien (Login-Skripte, Startup-Skripte) sind auf der Seite GPO-Grundlagen beschrieben.
Weiterlernen
- Microsoft Learn – Windows-Befehle Referenz A–Z – Offizielle Dokumentation aller CMD-Befehle
- ss64.com – Windows CMD Referenz – Sehr gute, vollständige Befehlsreferenz mit Beispielen (englisch)
- Wikibooks – Batch-Programmierung – Umfassendes deutsches Lernbuch zur Batch-Programmierung
- administrator.de – Windows Batch Grundlagen – Praxisnahes Tutorial auf Deutsch
- Rob van der Woude’s Batch-Guide – Sehr detailliertes englisches Nachschlagewerk mit vielen Beispielen
Videos
Kommentare
Frage, Verbesserungsvorschlag oder eigene Erfahrung zu diesem Artikel? Schreib einen Kommentar. Neue Beiträge erscheinen nach kurzer Moderation.
- Lade Kommentare …