Kurzreferenz Windows Kommandozeile
Windows Scripting
Gerätenamen und deren Verwendung
| CON | Konsole (Standardeingabe/Standardausgabe) Standardeingabe - sofern nicht anders festgelegt, die Tastatur Standardausgabe - sofern nicht anders festgelegt, der Monitor |
| LPT1 bis LPT9 | Parallele Schnittstellen |
| PRN | Alter Name für LPT1 |
| COM1 bis COM9 | Serielle Schnittstelle |
| AUX | Alter Name für COM1 |
| $CLOCK$ | interner Zeitgeber |
| NUL | Dummygerä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.txt | Das Verzeichnislisting wird in die Datei Inhalt.txt geschrieben. |
| echo Hallo Welt > dat1 | Schreibt "Hallo Welt" in die Datei dat1 |
| echo Hallo >> dat1 | Hängt "Hallo" an die Datei dat1 an. |
| del *.* < JA | Dem Del Kommando wird der Inhalt der Datei JA zugeführt. |
| Standardausgabe | Zahlenwert |
| Stdin | 0 |
| Stdout | 1 |
| Stderr | 2 |
| md xx 2>d1 | Fehlermeldunge in die Datei d1 umleiten. |
| dir xx 2>nul | Fehlermeldungen unterdrücken. |
| 2>&1 | Kanal umleiten. |
| dir verz1 >d1 2>nul | listing in d1 und Fehler wegschmeißen. |
| dir verz1 >d1 2>&1 | Inhalt 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 Morgen | Gibt "guten Morgen" aus |
| md xx 2>nul && cd xx | Erstellen 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=Test | Definition 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. |
| %~f1 | erweitert zu einer voll qualifizierten Pfadbezeichnung |
| %~d1 | gibt den Laufwerkbuchstaben zurück |
| %~p1 | erweitert zu einem Pfad |
| %~n1 | gibt den Dateinamen zurück |
| %~x1 | gibt die Dateinamenerweiterung zurück |
| %~s1 | gibt den Pfad mit kurzem Dateinamen zurück |
| %~a1 | gibt Dateiattribute zurück |
| %~t1 | gibt Datums- und Uhrzeitangaben zurück |
| %~z1 | gibt die Größe der Datei zurück |
| %~dp1 | Kombinationen 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.
| EQU | gleich |
| NEQ | nicht gleich |
| LSS | kleiner als |
| LEQ | kleiner als oder gleich |
| GTR | größer als |
| GEQ | größ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 *.%%A | Listet alle Bat und TXT Dateien auf. |
| FOR /D %%A in (*) DO echo %%A | Gibt Verzeichnisnamen aus |
| FOR /D /R %%A in (*) DO echo %%A | Gibt Verzeichnisnamen und Unterverzeichnisse aus |
| FOR /L %%A in (1,1,5) DO echo %%A | Gibt "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 %%A | Listet alle Dateien im aktuellen Verzeichnis auf |
| FOR /r c:\Daten %%A in (*) do echo %%A | Listet 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:
| A | Archiv Jede neue oder veränderte Datei bekommt dieses Attribut. Bei einer Sicherung werden die A's wieder entfernt. |
| R | Read Only nur Lesen, bedingt löschgeschützt. |
| S | System File Systemdatei |
| H | Hidden File versteckte Dateien, wird evtl. bei Auflistungen nicht angezeigt, wird beim Kopieren nicht mitkopiert. |
| attrib | Anzeigen der gesetzten Attribute im akt. Verz. |
| attrib /s | Anzeige der gesetzten Attribute inkl. Dateien der Unterverzeichnisse |
| attrib /s /d | Anzeige der gesetzen Attribute inklusive der Unterverzeichnisse und deren Dateien |
| attrib +R dat1 | dat1 wird schreibgeschützt |
| attrib -R dat1 | Schreibschutz wird entfernt |
| attrib -H +R | Alle Dateien des akt. Verzeichnisses schreibschützen und nicht mehr verstecken. |
| attrib +R /S | Schreibschutz 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/uverz | Absolute Pfadangabe |
| cd test/uverz | Relative Pfadangabe |
| cd .. | Stufe höher |
copy
Kopiert Dateien oder den Inhalt von Verzeichnissen
| copy dat dat2 | Kopie 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. |
| copy verz verz2 | Kopiert 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\*.cmd | Kopiert alle Batdateien und benennt dabei die Endung um. |
| copy D1+D2+D3 D4 | Kopiert den Inhalt der Dateien D1-D3 in die Datei D4 |
| copy D1+D2+D3 | Kopiert den inhalt von D1 bis D3 in die Datei D1 |
del
Entfernt den Inhalt des angegebenen Ordners.
| /p | Fordert vor dem Löschen jeder Datei zur Bestätigung auf |
| /f | Erzwingt 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 ^> Datei | Das 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)" | more | Erstellt 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 | more | Der Inhalt von Dat wird seitenweise ausgegeben. |
| xcopy /? | more | Die Hilfe von xcopy wird seitenweise ausgegeben. |
| more > dat1 | Text 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 neuerName | Benennt den Ordner um |
| move dat1 dat2 | Datei wird umbenannt. |
| move dat1 vz1 | verschiebt die Datei dat1 in den Ordner vz1 |
| move dat1 vz1\dat2 | Verschiebt 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 verz | Entfernt das Verzeichnis verz mit Inhalt. |
| rd /s /q verz | Stiller 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 | sort | Wie oben. |
| sort namen > neu | Inhalt 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 /f | Kombination 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 /e | Kopiert alle Dateien aus vz1 und sämtliche Unterordner inkl Ordnerstruktur. |
Aktualisiert (Sonntag, den 11. April 2010 um 20:05 Uhr)