Zum Inhalt springen
sw
en

Tippe um zu suchen

Scripting & Automatisierung

Batch / CMD Scripting – Grundlagen

Batch-Skripte (.bat/.cmd) automatisieren Windows-Aufgaben ohne Installation – Grundbefehle, Variablen, Schleifen, Fehlerbehandlung und Praxisbeispiele.

11 Min Lesezeit Anfänger Zuletzt aktualisiert:

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?

KriteriumBatch (.bat/.cmd)PowerShell (.ps1)
LernkurveSehr flachSteiler
LesbarkeitEinfachBesser strukturiert
Objekte / RückgabewerteNur TextEchte .NET-Objekte
FehlerbehandlungRudimentärVollständig (try/catch)
EinsatzEinfache Aufgaben, Login-SkripteKomplexe Automatisierung, AD, APIs
Überall verfügbarJa, auch auf älteren SystemenAb 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 auch echo off selbst 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). /b beendet 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:

FehlerbildUrsacheLösung
Variable ist leer in SchleifeFehlende delayed expansionsetlocal enabledelayedexpansion + !VAR!
Pfade mit Leerzeichen brechenFehlende AnführungszeichenPfade immer in "..." einschliessen
'xyz' ist kein BefehlBefehl nicht gefunden / Tippfehlerwhere xyz prüfen, Pfad angeben
Fenster schliesst sofortFehler vor pausepause am Ende einfügen oder via CMD öffnen
%%f zeigt %fSkript aus CMD-Zeile getestetIn Skript immer %%, direkt in CMD nur %
Datum/Zeit-Format falschRegionale 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

Videos

YouTube
Batch-Programmierung-Tutorial (deutsch) Teil 1: Einführung

Kommentare

Frage, Verbesserungsvorschlag oder eigene Erfahrung zu diesem Artikel? Schreib einen Kommentar. Neue Beiträge erscheinen nach kurzer Moderation.

  • Lade Kommentare …
Kommentar schreiben