Kurzreferenz Windows Kommandozeile

Dieser Artikel beschreibt den Umgang mit der Windows Kommandozeile.   

Windows Scripting

Gerätenamen und deren Verwendung

CONKonsole (Standardeingabe/Standardausgabe)
Standardeingabe - sofern nicht anders festgelegt, die Tastatur
Standardausgabe - sofern nicht anders festgelegt, der Monitor 
LPT1 bis LPT9Parallele Schnittstellen 
PRNAlter Name für LPT1 
COM1 bis COM9Serielle Schnittstelle 
AUXAlter Name für COM1 
$CLOCK$interner Zeitgeber 
NULDummygerät für Testzwecke oder zum Unterdrücken von Bildschirmmeldungen.  

Einfaches Schreiben in Textdateien

copy con dat1
Text Zeile1
Text Zeile2
Text Zeile3
^Z

(^Z = STRG+Z oder )
Abbruch mit STRG+C

Umleitungen/Streams

von > nach
nach < von
von >> nach (anhängen)

dir > Inhalt.txtDas Verzeichnislisting wird in die Datei Inhalt.txt geschrieben.
echo Hallo Welt > dat1Schreibt "Hallo Welt" in die Datei dat1 
echo Hallo >> dat1Hängt "Hallo" an die Datei dat1 an.
del *.* < JADem Del Kommando wird der Inhalt der Datei JA zugeführt. 

StandardausgabeZahlenwert 
Stdin 
Stdout 
Stderr 

md xx 2>d1 Fehlermeldunge in die Datei d1 umleiten. 
dir xx 2>nul Fehlermeldungen unterdrücken. 
2>&1Kanal umleiten. 
dir verz1 >d1 2>nullisting in d1 und Fehler wegschmeißen.  
dir verz1 >d1 2>&1Inhalt und Fehler in d1 

Kombination von Befehlen.

&Trennt verschiedene Befehle voneinander 
()Gruppierung von Befehlsblöcken 
&&Nachfolgender Befehl wird nur im Erfolgsfall des ersten Befehls ausgeführt. 
||Nachfolgender Befehl wird nur ausgeführt, wenn der vorhergehende Befehl mit Fehlern abgeschlossen wurde.  

echo guten & echo MorgenGibt "guten Morgen" aus
md xx 2>nul && cd xxErstellen des Verzeichnisses und Wechsel in dieses im Erfolgsfall.
md xx 2>nul || echo hat nicht funktioniert. Eigene Fehlermeldung ausgeben. 

Pipelining

Die Ausgabe eines Kommandos wird zur Eingabe für ein zweites Kommando

type read.me | more Der Inhalt der Datei read.me wird nicht auf dem Bildschirm ausgegeben, sondern an das Kommando more übergeben. Dieses gibt den Inhalt dann seitenweise aus.   
 echo J | del *.*Das Del Kommando würde normalerweise eine Rückfrage stellen, die mit J zu beantworten ist, damit alle Dateien gelöscht werden. Dieses J erhält es nun automatisch.  

Variablen

Grundsätzliches

SET V1=TestDefinition der Variable V1. Zwischen = und den anderen Zeichen darf kein Leerzeichen folgen.  
echo %V1%Ausgabe von %V1% 
SET V1=Löschen von V1 

Variablen Sonderfunktionen

set Zahl=%Zahl:1=2% Im String Zahl werden allle Vorkommen von 1 durch 2 ersetzt.  
set Zahl=%Zahl:A=%Alle Zeichen A im String Zahl werden gelöscht.  
set Zahl=%Zahl:~5,3% Nach dem 5. Zeichen 3 Zeichen in Zahl schreiben. 
set Zahl=%Zahl:~-5% Die letzten 5 Zeichen in Zahl speichern. 
set Zahl=%Zahl:~0,-5% Alle außer den letzten 5 Zeichen in Zahl speichern.  

Rechnen mit Variablen

Mittels des Schalters /a kann auch gerechnet werden.

set /A 3+4 
set /a alter1=aktjahr-gebjahr

Dynamische Systemvariablen

%CD% Aktuelles Verzeichnis
%DATE%Aktuelles Datum
%TIME%Aktuelle Zeit
%RANDOM%Zufällige Dezimalzahl zwischen 0 und 32767
%ERRORLEVEL%Errorlevel des letzten Programmes
%CMDLINE%Ursprünglich aufgerufene Befehlszeile 

Batchdateien

Erste Zeile 

Erste Zeile fast jeder Batchdatei ist, die Standardausgabe der Befehle zu deaktivieren. Das @-Zeichen für sich alleine unterdrückt dabei nur die Ausgabe einer einzigen Zeile. Der nachstehende Befehl deaktiviert die Ausgabe für das ganze Script. 

@echo off

Kommentarzeichen

Alle Anweisungen einer Zeile, die mit rem beginnt, werden ignoriert.

Sprungbefehl

Per Befehl goto wird die Verarbeitung in einer anderen Zeile / ab einer anderen Marke fortgesetzt.  
goto sprungmarke
Definition Sprungmarke: :sprungmarke

call/start

Wird ein Programm oder eine andere Batchdatei aus einer Batchdatei aufgerufen, wird das Batchprogramm nicht fortgeführt, wenn es nicht explizit mit dem Befehl call aufgerufen wird. Die Ausführung der Batchdatei wird so lange unterbrochen, bis das aufgerufene Programm beendet ist. 

Soll die Batchdatei nicht warten, muss statt dessen der Befehl start verwendet werden.  

Unterprozeduren

Unterprozeduren können auch mit call realisiert werden. Auch Stellungsparameter können übergeben werden.

Bsp.:

@echo off
echo hauptprogramm
call :unter1 Hans
echo Hauptprogramm
call :unter2
%1
echo Hauptprogramm
goto :eof

:unter1
echo %1

goto :eof

:unter2
echo %1
goto :eof

Aus einer Unterroutine kann nur dann zurückgekehrt werden, wenn das Script am Ende angekommen ist. Daher der Sprung nach :eof.
Genauso muss am Ende des Hauptteils nach :eof gesprungen werden um zu verhindern, dass die Unterprozeduren ungewollt erneut durchlaufen werden.

Ersetzbare Parameter (Stellungsparameter)

Parameter sind die Werte, die beim Aufruf an eine Batchdatei übergeben werden.

Aufruf: Test Otto Susi Eva

Script: echo %1 %2 %3

Erweiterungsoptionen:

%~1 umgebende Anführungszeichen werden entfernt.  
%~f1erweitert zu einer voll qualifizierten Pfadbezeichnung
%~d1gibt den Laufwerkbuchstaben zurück
%~p1erweitert zu einem Pfad
%~n1gibt den Dateinamen zurück
%~x1gibt die Dateinamenerweiterung zurück
%~s1gibt den Pfad mit kurzem Dateinamen zurück
%~a1gibt Dateiattribute zurück 
%~t1gibt Datums- und Uhrzeitangaben zurück 
%~z1gibt die Größe der Datei zurück 
%~dp1Kombinationen sind möglich

Mit dem Befehl shift kann der erste Parameter gelöscht werden. Alle weiteren rutschen eins nach. Auf diese Weise können beliebig viele Parameter verarbeitet werden. Über den Schalter /n kann der n-te und nicht der erste Parameter entfernt werden.

Bsp:

Aufruf: Test Hugo Hans Peter Mary

@echo off
:anfang
IF !%1==! goto :eof
echo Hallo %1
shift
goto anfang
 

Bedingte Verarbeitung (IF)

Syntax

IF [/i] [NOT] Zeichenfolge==Zeichenfolge Befehl [ELSE Ausdruck] //Schalter i ignoriert Groß- und Kleinschreibung.
IF [NOT] EXIST Datei Befehl [ELSE Ausdruck]
IF [NOT] ERRORLEVEL Zahl Befehl [ELSE Ausdruck]
IF ERRORLEVEL N Befehl

Verwendung
IF EXIST text.txt (
      DEL text.txt
) ELSE (
      echo text.txt fehlt
)
 

Achtung: Die Verwendung der Klammern muss genauso angewendet werden, wie im obigen Beispiel. Also mit Leerzeichen davor und danach und in der richtigen Zeile. Ansonsten droht ein Syntaxfehler. Das passiert schon, wenn z.B die öffnende Klammer nach dem If in eine neue Zelie geschrieben wird. Sie wird dann nicht mehr mit dem If-Kommando in Beziehung gesetzt.

Vergleichsoperatoren.

EQUgleich 
NEQ nicht gleich
LSSkleiner als
LEQ kleiner als oder gleich
GTRgrößer als
GEQgrößer als oder gleich

Sonderfall Vergleich auf Leerzeichen

Soll festgestellt werden, ob eine Variable oder ein Parameter leer ist oder ist eine Variable oder ein Parameter leer, führt das zu einem Syntaxfehler, da in jedem Fall etwas rechts und links des Gleichheitszeichens stehen muss. Ansonsten Syntaxfehler. Verhindert kann das werden, indem man noch ein Zeichen an beide Seiten anhängt.

IF !%1==!abc ECHO JA
IF !%1==! ECHO JA

Mehrere Bedingungen

Mehrere Bedingungen in einer If-Abfrage sind nicht möglich. Ein ähnliches Verhalten kann aber konstruiert werden.

Rem Eingabeprüfung
if !%1 LEQ !2 goto :bed1
goto :end
:bed1
if !%1 GEQ !1 goto :m1
goto :end 
 
Rem Arbeitsblock
:m1
echo Parameter 1 ist 1 oder 2

Rem Parameterfehler
:end
echo Parameter 1 falsch. Programm wird beendet.

Schleifen

Mittels der bekannten Konstrukte können auch Schleiifen realisiert werden.

@echo off
set x=0
set y=5

:anfang
if %x% == %y% goto :eof
set /a x=x+1
echo Hallo
goto :anfang

setlocal/endlocal

Mittels des Befehls setlocal werden die Variablen in der Batch Datei gehalten und gehen nicht in die Umgebung hinaus.
Achtung! Variablen aus der Umgebung können aber trotzdem im Script abgefragt werden.
Mit endlocal wird der Zustand wieder aufgehoben.  

For-Kommando

Das For-Kommando ist eigentlich ein For-Each Konstrukt. Damit kann ein Vorgang für mehrere Elemente wiederholt werden.

Variablen eines For-Kommandos haben eine eigene Schreibweise:
Dialog: %A
Batch: %%A

Genauso kann man auch eine Zählschleife einrichten. Das funktioniert mit dem Schalter /L

FOR %%A in (eins zwei drei) DO ECHO %%A Gibt eins zwei drei untereinander aus.  
FOR %%A in (BAT TXT) DO DIR *.%%AListet alle Bat und TXT Dateien auf.
FOR /D %%A in (*) DO echo %%AGibt Verzeichnisnamen aus 
FOR /D /R %%A in (*) DO echo %%AGibt Verzeichnisnamen und Unterverzeichnisse aus
FOR /L %%A in (1,1,5) DO echo %%AGibt "1 2 3 4 5" aus. 
FOR /L %%A in (5,-1,1) DO echo %%A Gibt "5 4 3 2 1" aus. 
FOR /L %%a in (0,1,9) do (FOR /L %%b in (0,1,9) do echo %%a%%b)Zählt bis 100
FOR /r %%A in (*) do echo %%AListet alle Dateien im aktuellen Verzeichnis auf
FOR /r c:\Daten %%A in (*) do echo %%AListet alle Dateien im Verzeichnis C:\Daten auf

Einlesen von Dateien:

Daten.txt

;Stadt Land Fluss
Deggendorf,Bayern,Donau
Plattling,Bayern,Isar
Frankfurt,Hessen,Main

FOR /F "eol=; tokens=2,3 delims=, " %%a in (Daten.txt) DO @echo %%a %%b

eol=; Das Zeilenende wird durch das Semikolon bestimmt. Alles danach wird ignoriert.
Verwendung am Zeilenanfang entspricht Kommentarzeichen.  
tokens=2,3 Es soll nur der 2. und 3. Satz (Land,Fluss) verwendet werden.  
delims=,Die einzelnen Token werden durch das Komma getrennt.  

Weitergabe von Parametern an Funktionen.

Sollen aus einer For-Scheife heraus Daten an eine Funktion übergeben werden, mussen beim Aufruf Parameter übergeben werden. Die Variablen aus der Schleife sind in der Funktion nicht gültig.

for /f "eol=# tokens=1,2 delims=," %%a in (data.txt) do call :up1 %%a %%b
goto :eof
:up1
mkdir D:\Test\%1\%2
goto :eof

Beispiele

neu.cmd

Erstellt Dateinamen mit führenden Nullen.

Aufruf: neu 23

@echo off
set ausgabe=0000
:m1
if !%1==! goto :eof
set tmp1=%ausgabe%%1
echo %tmp1:~-4%.txt
shift
goto :m1

matrix.cmd

Erstellt ein Rechteck aus x-en

Aufruf: matrix  5 5

@echo off
set x=0
set zeile=

if !%1==!  (echo keine Angaben
  goto :eof)
if !%2==!  (echo nur eine Angabe gemacht!
  goto :eof)

:step1
if %x%==%1 goto :weiter
set /a x=x+1
set zeile=%zeile% x
goto :step1

:weiter

set x=0
:step2
if !%x%==!%2 goto :eof
set /a x=x+1
echo %zeile%
goto step2

make2.cmd

Dieses Script zeigt, dass man Stellungsparameter auch an eine Funktion übergeben kann.

@echo off
call :vz %1 "Gruppe 1" Meier
call :vz %1 "Gruppe 1" Mueller
call :vz %1 "Gruppe 2" Huber
call :vz %1 "Gruppe 2" Wurst
goto :eof

:vz
md %1\%2\%3\Daten
md %1\%2\%3\Profil
goto :eof

gebtag.cmd

Berechnet das Alter.

Aufruf: gebtag 05.03.1975

@echo off
set geb=%1
set aktjahr=%date:~6,4%
set aktmonat=%date:~3,2%
set akttag=%date:~0,2%

set gebjahr=%geb:~6,4%
set gebmonat=%geb:~3,2%
set gebtag=%geb:~0,2%

set /a alter1=aktjahr-gebjahr
if %gebmonat% GTR %aktmonat% goto :monat
if %gebmonat% LSS %aktmonat% goto :monat2
if %gebmonat% == %aktmonat% goto :tag

:monat
set /a alter1= alter1-1
echo %alter1%
goto :eof

:monat2
echo %alter1%
goto :eof

:tag
if %gebtag% gtr %akttag% set /a alter1=alter1-1
if %gebtag% == %akttag% echo Heute Geburtstag
echo %alter1%

gruss.cmd

Gibt einen Gruß in Abhängigkeit vom Geschlecht aus

@echo off
SET FrWiederholung=0

:Frage
SET /P Geschlecht=Sind Sie ein Mann oder eine Frau (m/w):

set /a FrWiederholung=%FrWiederholung%+1

if /i !%Geschlecht%==!m goto weiter
if /i !%Geschlecht%==!w goto weiter
if %FrWiederholung% gtr 1 goto unbekannt

echo Damit kann ich nichts anfangen. Versuchen Sie es erneut!

goto Frage

:unbekannt
echo Dann sind Sie wohl was Besonderes?
set Geschlecht=b

:weiter
SET /P Vorname=Wie ist Ihr Vorname:
SET /P Nachname=Wie ist Ihr Nachname:
echo.
echo.
if /i !%Geschlecht%==!m echo Sehr geehrter Herr %Vorname% %Nachname%
if /i !%Geschlecht%==!w echo Sehr geehrte Frau %Vorname% %Nachname%
if /i !%Geschlecht%==!b echo Sehr geehrtes Irgendwas %Vorname% %Nachname%

echo ich bedanke mich fuer diese Information

if "%time%" gtr "12:00:00,00" (
      echo und wuensche Ihnen noch einen schoenen Nachmittag
) ELSE (
      echo und wuensche Ihnen noch einen schoenen Vormittag

Befehlsreferenz

attrib

Attributstypen:

AArchiv Jede neue oder veränderte Datei bekommt dieses Attribut. Bei einer Sicherung werden die A's wieder entfernt.  
Read Only nur Lesen, bedingt löschgeschützt.
System File Systemdatei
Hidden File versteckte Dateien, wird evtl. bei Auflistungen nicht angezeigt, wird beim Kopieren nicht mitkopiert.

attrib Anzeigen der gesetzten Attribute im akt. Verz.
attrib /sAnzeige der gesetzten Attribute inkl. Dateien der Unterverzeichnisse 
attrib /s /dAnzeige der gesetzen Attribute inklusive der Unterverzeichnisse und deren Dateien 
attrib +R dat1dat1 wird schreibgeschützt 
attrib -R dat1Schreibschutz wird entfernt 
attrib -H +RAlle Dateien des akt. Verzeichnisses schreibschützen und nicht mehr verstecken. 
attrib +R /SSchreibschutz für alle Dateien des akt. Vzs und aller Dateien in UVZs 

Die Attribute S und H können nur gemeinsam entfernt werden.

cd

Wechselt in ein anderes Verzeichnis

cd / Wechsel in das Hauptverzeichnis des aktuellen Datenträgers 
cd /test/uverzAbsolute Pfadangabe 
cd test/uverzRelative Pfadangabe 
cd ..  Stufe höher 

copy

Kopiert Dateien oder den Inhalt von Verzeichnissen

copy dat dat2Kopie am gleichen Ort mit umbenennen 
copy dat C:\test/dat2

Wenn innerhalb des Ordners test kein Verzeichnis mit dem Namen dat2 existiert, wird die Datei unter dem Namen dat2 in das Verzeichnis test kopiert.
Sollte ein Verzeichnis dat2 in test existieren, wird die Datei unter dem gleichen Namen in das Verzeichnis dat2 kopiert.  

copy verz verz2Kopiert den Inhalt von Verzeichnis verz in das Verzeichnis verz2. 
copy *.doc C:\Test/uverz Kopiert alle Dateien mit der Endung doc in das uverz. Existiert das uverz nict, werden alle gefundenen Daten in eine einzige Datei mit dem Namen uverz kopiert.  
copy *.bat c:\test\uvz\*.cmdKopiert alle Batdateien und benennt dabei die Endung um. 
copy D1+D2+D3 D4Kopiert den Inhalt der Dateien D1-D3 in die Datei D4 
copy D1+D2+D3Kopiert den inhalt von D1 bis D3 in die Datei D1

del

Entfernt den Inhalt des angegebenen Ordners.

/pFordert vor dem Löschen jeder Datei zur Bestätigung auf
/fErzwingt das Löschen schreibgeschützter Dateien 
/s Löscht alle Dateien, auch in allen Unterordnern 
/q Keine Rückfrage bei Benutzung globaler Platzhalter wie z.B. *.* 
/a Wählt die zu löschenden Dateien nach den Attributen a/r/s/h aus.  

dir

Zeigt den Inhalt des aktuellen Verzeichnisses an.

dir /p Listet den Ordnerinhalt seitenweise auf. 
dir /ogn /p Listet den Ordnerinhalt sortiert und bildschimseitenweise auf. Ordner zuerst, dann Dateien nach Namen sortiert. 

echo

zeigt den angegebenen Text am Bildschirm an.

echo Hans Ausgabe : Hans
echo. Ausgabe einer Leerzeile
echo Texi in ^> DateiDas Caret-Zeichen entwertet Sonderzeichen. 

find

sucht nach Zeichenketten in Dateien.

find /I "Hall" C:\Test\dat1 Findet alle Zeilen mit "Hall". Durch den Schalter /i wird die Groß und Kleinschreibung ignoriert.  
type c:\Test\dat1 |find /I "Hall"Wie oben. 
dir c:\ /S/A/-P | find /i "Datei(en)" | moreErstellt aufgrund des Schlüsselwortes "Datei(en)" eine Liste mit allen Größenangaben der Verzeichnisse auf c:. Diese wird dann seitenweise ausgegeben.

md

Make Directory. Erstellt ein Verzeichnis. Das Verzeichnis kann nur angelegt werden, wenn am Zielort kein gleichnamiges Verzeichnis oder Datei existiert.

md verz1 Erstellt verz1 
md verz/verz2/verz3 Erstellt verz3. Wenn verz und verz2 nicht existieren, werden sie auch angelegt. 
md verz1 verz2 verz3 Erstellt die 3 Verzeichnisse auf einer Ebene. 
md "Verz Name" Erstellt ein Verzeichnis mit Leerzeichen im Namen 
md verz/verz1 verz/verz2 verz/"verz 3"Kombination der Möglichkeiten. 

more

Gibt Texte seitenweise aus.

more dat1 Der Inhalt von Dat wird seitenweise ausgegeben.  
Type dat1 | moreDer Inhalt von Dat wird seitenweise ausgegeben.  
xcopy /? | moreDie Hilfe von xcopy wird seitenweise ausgegeben.  
more > dat1Text wird von der Tastatur weg in die Datei dat1 geschrieben. Beenden mit F6 und Return. 

move

Benennt eine Datei oder Ordner um, bzw verschiebt Dateien und Ordner.

move verzName neuerNameBenennt den Ordner um 
move dat1 dat2Datei wird umbenannt.
move dat1 vz1verschiebt die Datei dat1 in den Ordner vz1 
move dat1 vz1\dat2Verschiebt die Datei in den Ordner vz1 und benennt sie dabei um 

pause

Hällt die Verarbeitung einer Batchdatei auf und wartet auf einen Tastendruck

Pause kann auch mit einer eigenen Meldung versehen werden.
echo CD einlegen und dann eine Taste drücken.
pause > NUL

rd

Entfernt Verzeichnisse

rd /s verzEntfernt das Verzeichnis verz mit Inhalt. 
rd /s /q verzStiller Modus. Entfernt Verzeichnisse ohne Rückfrage.  

ren

Benennt eine Datei um.

ren alterName neuerName
ren C:\Test\alterName neuerName

sort

Sortiert den Inhalt einer Textdatei

sort name Inhalt von name wird sortiert auf dem Bildschirm ausgegeben.  
type namen | sortWie oben. 
sort namen > neuInhalt von namen wird sortiert in neu geschrieben.  
sort namen > namen!!Funktioniert nicht. Inhalt wird zerstört.   
sort namen /o namen Originaldatei wird sortiert und bleibt erhalten.  

tree

Stellt den Verzeichnisinhalt grafisch dar.

tree H:\Daten listet ab dem angegebenen Ordner 
tree /f zeigt auch die Dateien in den Ordnern 
tree H:\Daten /fKombination der beiden Möglichkeiten. 

xcopy

Kopiert Ordnerstrukturen inkl. Dateien.

xcopy vz1 vz2 Kopiert alle Dateien aus vz1 nach vz2 (ohne UVZs) 
xcopy vz1 vz2 /s /eKopiert alle Dateien aus vz1 und sämtliche Unterordner inkl Ordnerstruktur.  

Aktualisiert (Sonntag, den 11. April 2010 um 20:05 Uhr)