Batch-Programmierung/ Druckversion
Aus Wikibooks
[Bearbeiten] Allgemeine Information
[Bearbeiten] Batch Programmierung
Batchprogramme (englisch ursprünglich: Backform, häufig mit Stapelverarbeitungsprogramme oder kurz Stapelprogramm übersetzt) sind meist kurze Dateien, die Befehle der Kommandozeile der Reihe nach abarbeiten. Batchprogrammierung erfüllte die grundlegenden Anforderungen an eine Programmiersprache wie z.B. if, if not und while. Da Batch sich in den Bereich Shellscripting einordnen lässt, kann man von einer interpreterbasierten Skriptsprache reden. Das heißt, dass die im Editor erstellte Textdatei nicht mit einem Compiler einmal in Maschinensprache übersetzt und in einer ausführbaren Binärdatei im *.exe Format gespeichert, sondern bei jedem Aufruf durch einen Interpreter zur Laufzeit in ein für den Computer verständliches Format übersetzt wird. Ein Texteditor wie MS Notepad, den Windows von Haus aus mitbringt, reicht vollkommen aus um Batchprogramme zu schreiben. Batchprogrammierung ist speziell für die Steuerung des Betriebssystems gedacht, für die Entwicklung von Anwendungen ist sie nicht geeignet. Hierzu verwendet man Sprachen wie C/C++ und Java (nicht zu verwechseln mit JavaScript!!).
Viele wiederkehrende Installations- und Verwaltungsaufgaben, die man traditionell mit Tastatur und Maus ausführt, lassen sich mit Stapeldateien ausführen. Hat man genügend Kommentarzeilen in die Batchdatei eingefügt, genügt der Ausdruck der Stapeldatei meist als Dokumentation.
Kommandozeilenbefehle und Batchdateien sind keine veraltete Technologie. Auf Wunsch vieler Systemadministratoren hat Microsoft dafür gesorgt, dass Windows Server 2003 vollständig von der Kommandozeile installiert und administriert werden kann, ohne die Maus zu benutzen.
In diesem Buch geht es ausschließlich um die Erstellung von Batch-Dateien unter Windows und DOS. Andere Betriebssysteme bieten vergleichbare und wesentlich mächtigere Funktionen (wie z. B. die in der Linux-Welt weit verbreitete Bash oder AppleScript für den Mac).
Die Begriffe "Stapelprogramm" und "Stapelverarbeitung" rühren aus der Zeit her, als Permanentspeicher wie Festplatten sehr sehr teuer war, zu dieser Zeit begab man sich mit einem Stapel Lochkarten aus Pappe, auf denen sich das Programm und die Daten in gestanzter Form befanden, zum Rechnenzentrum und übergab dem Administrator seinen Stapel. Die Stapel aller Benutzer wurden gesammelt und dann sequentiell an den Rechner übergeben. Nach einiger Zeit konnte man sich dann die (meist ausgedruckten) Ergebnisse abholen.
[Bearbeiten] Wie erstelle ich eine Batchdatei?
Wie bereits gesagt, reicht ein einfacher Editor aus. Empfehlen kann man guten Gewissens den quelloffenen und kostenlosen Notepad++-Editor, als bessere Alternative zu MS Notepad. Speichern Sie dann die Datei mit der Endung *.bat ab. Anschließend müssen Sie nur die Datei starten: Dies können Sie entweder direkt in Windows oder indem Sie in der DOS-Eingabeaufforderung in das entsprechende Verzeichnis wechseln und den Dateinamen eingeben.
Unter Windows NT-kompatiblen Betriebssystemen gibt es seit Windows 2000 auch Batchdateien mit der Endung *.cmd. Diese werden genau wie Batchdateien mit der Endung *.bat verarbeitet bzw. ausgeführt. Die Endung *.cmd wurde ursprünglich aus Kompatibilitätsgründen zu OS/2, einem Betriebssystem das MS ursprünglich in Kooperation mit IBM entwickelte, mit Windows NT 3.x eingeführt.
[Bearbeiten] Allgemeine Informationen
- Allgemeine Informationen: Wikipedia: batch
- Infos zur cmd.exe: Wikipedia: cmd.exe
- Die für Windows XP verfügbaren Kommandos können auch im Hilfesystem von Windows direkt eingesehen werden:
- START - Hilfe und Support
- "Befehlszeilenreferenz A-Z" in das Suchfeld eintragen.
[Bearbeiten] Alternativen
Es existieren noch diverse andere Batch-ähnliche Skriptsprachen, darunter WinBatch und RapidBATCH.
[Bearbeiten] Wichtige DOS-Kommandos
Man unterscheidet bei DOS-Befehlen grundsätzlich zwischen internen und externen Befehlen. Interne Befehle sind Bestandteil der Shell selbst, während externe Befehle als eigene Programme vorliegen. Die DOS-Befehle, die interessant für die Batch-Programmierung sein könnten, sind im Folgenden aufgelistet:
[Bearbeiten] attrib
Ändert das Dateiattribut. Möglich sind "schreibgeschützt" (+r/-r), "versteckt" (+h/-h) und "archiv" (+a/-a)
[Bearbeiten] cd / chdir
Über den cd- oder chdir-Befehl (change directory) kann das aktuelle Verzeichnis gewechselt werden. Beachte: Nach dem "cd" folgt ein Leerzeichen, das bei nachfolgendem .. oder \ je nach Betriebssystemversion weggelassen werden darf. Wird der Befehl ohne Parameter ausgeführt, so wird der Pfad des aktuellen Verzeichnisses ausgegeben.
relative Angaben:
Die Eingabe von "cd .." wechselt in das nächsthöhere Verzeichnis ("cd ..\.." zwei Ebenen höher usw.).
Die Eingabe von "cd ORDNERNAME" wechselt in den Unterordner ORDNERNAME.
absolute Angaben:
Die Eingabe von "cd \" wechselt in das Hauptverzeichnis auf dem derzeitig befindlichen Laufwerk.
Die Eingabe von "cd \ORDNERNAME" wechselt absolut in den Ordner ORDNERNAME auf dem derzeitig befindlichen Laufwerk.
Die Eingabe von "LAUFWERKSBUCHSTABE:" (ohne vorangestelltes "cd") wechselt in das aktuelle Verzeichnis des gewählten Laufwerks LAUFWERKSBUCHSTABE.
Die Eingabe von "cd LAUFWERKSBUCHSTABE:\ORDNERNAME" wechselt absolut in den Ordner ORDNERNAME auf dem gewählten Laufwerk von LAUFWERKSBUCHSTABE jedoch nicht von einem Laufwerk auf ein anderes.
Pfadangaben mit Leerschlägen (Bsp "C:\program files\") müssen in Anführungs-/Schlusszeichen eingeschlossen sein.
Der Befehl "cd /D %~d0%~p0" wechselt in den Ordner des Batch-Skripts. (sinnvoll bei Windows-Doppelklicks)
Wildcards:
Ist die Pfadangabe eindeutig kann der Ordnername durch Nutzen von Wildcards (z.b. \win* für \windows oder \winnt) abgekürzt werden. Dies ist jedoch im Batchbetrieb nicht ratsam.
Remotesysteme:
Pfade von nicht als Laufwerken verbundenen Remotesystemen können (Berechtigung vorausgesetzt) entweder über die Administrative Freigabe oder durch das Verbinden eines Netzlaufwerks angesprochen werden. Beispiel für administrative Freigabe: \\[computername]\[laufwerk]$\[Weiterer Pfad]
Pfad in Variable:
Der Befehl "set PFAD=%cd%" schreibt das aktuelle Verzeichnis in die Variable %PFAD%. (als letztes im Batch-Script mit "cd %PFAD%" wieder ins Startverzeichnis wechseln!)
[Bearbeiten] cls
Löscht den Bildschirminhalt (clear screen)
[Bearbeiten] comp oder fc
Vergleicht den Inhalt zweier Dateien und stellt die Unterschiede dar (compare / file compare).
[Bearbeiten] (x)copy/robocopy
Mit dem Befehl copy können eine Datei oder mehrere Dateien kopiert werden.
xcopy ist die erweiterte Version von copy, die mehr Optionen bietet. Diese ist nicht in allen Windows-Versionen verfügbar.
Das weitaus mächtigere robocopy ist ab Vista standardmäßig wieder verfügbar, bei Windows XP und 2000 fehlt dieses Programm zunächst. Microsoft stellt robocopy aber im Windows Server 2003 Resource Kit Tools 2003 auch für diese Betriebssystemsversionen bereit.
Mit dem Befehl copy /b "DATEI" + "DATEI" "NEUE DATEI" kann man Dateien zusammenfügen.
[Bearbeiten] date
Gibt das aktuelle Datum aus und ermöglicht dem Benutzer die Änderung des Datums. Wird der Befehl mit dem Parameter /t aufgerufen, so wird nur das aktuelle Datum ausgegeben. Um das Datum zu teilen, also z.B. nur das Jahr zu verwenden, gibt es folgende Syntax:
date:~6,4
Hier werden vom Datum die ersten 6 Zeichen weggelassen und dann vier Stellen angezeigt. Bei time funktioniert das analog.
Bei einigen Betriebssystemversionen erfordert das Ändern des Systemdatums administrative Rechte.
[Bearbeiten] del / erase
Löscht eine Datei, die sich im aktuellen Verzeichnis befindet. Als Parameter muss mindestens der Dateiname angegeben werden. Weitere Parameter sind optional:
- /p - sollen mehrere Dateien gelöscht werden, muss jede einzelne Löschung bestätigt werden.
- /f - auch schreibgeschützte Dateien werden gelöscht.
- /s - löscht auch Dateien, die sich in den Unterverzeichnissen befinden.
- /q - Unterbindet Bestätigung.
Funktioniert nicht immer.
[Bearbeiten] deltree
Löscht Verzeichnis(se) inkl. untergeordnete Dateien.
Unter Windows XP lautet der Befehl rmdir. Deltree kennt es nicht mehr.
[Bearbeiten] dir
Der Befehl dir (directory) zeigt alle Verzeichnisse und Unterverzeichnisse an. Verzeichnisse werden seit Windows 95 als Ordner bezeichnet, unterscheiden sich allerdings nicht von Verzeichnissen.
Der dir-Befehl hat zahlreiche Optionen:
- /b - Nur der Dateiname wird ausgegeben. Die Ausgabe aller weiteren Informationen wie beispielsweise Datum, Größe oder Datenträgerbezeichnung wird unterdrückt.
- /c - Die Dateigröße wird mit einem Punkt als Trennzeichen zwischen jeweils drei Dezimalstellen angegeben, also beispielsweise 343.232 (Standardeinstellung). Soll dies unterdrückt werden, geben Sie als Option /-c an.
- /p - Bei jedem Seitenumbruch wird die Ausgabe unterbrochen, bis der Anwender eine Taste drückt.
- /on - Gibt das Verzeichnis alphabetisch sortiert aus.
- /w - Mehrere Einträge in einer Zeile werden angezeigt.
- /ah - Versteckte Dateien werden angezeigt.
- /a - Alle versteckten- und System-Dateien werden angezeigt.
- /s - Zeigt auch den Inhalt der Unterverzeichnisse an.
Mit dem Befehl dir [Dateiname] ist es auch möglich, Dateien im aktuellen Verzeichnis zu suchen. Alternativ kann auch der Platzhalter * (bspw.: dir *.* ) verwendet werden, um nach bestimmten Dateien zu suchen.
Mit dir *. werden nur Objekte ohne Dateinamen-Erweiterung angezeigt. In der Regel haben Ordner keine Erweiterung und Dateien eine Erweiterung. In diesem Fall werden nur Ordner angezeigt. Ordner werden im DOS mit <dir> vor dem ordnernamen gekennzeichnet.
[Bearbeiten] Kombinationen
dir /w/o/s/p durchsucht den ganzen Rechner nach einer Datei und stellt das Ergebnis seitenweise dar.
[Bearbeiten] edit
Mit edit wird ein Editor geöffnet, zum Beispiel zum Bearbeiten von Batch- oder Textdateien.
[Bearbeiten] exit
Beendet die Eingabeaufforderung/kehrt zu Windows zurück.
[Bearbeiten] fdisk
Partitioniert die Festplatte.
[Bearbeiten] find
Mit dem Befehl find kann - auch in mehreren Dateien - nach einer Zeichenfolge gesucht werden.
Auch find kann mit Parametern gesteuert werden:
find /iignoriert Groß-/Kleinschreibung beim Suchbegrifffind /vZeigt alle Zeilen an, die die Zeichenfolge NICHT enthalten.find /cZeigt nur die Anzahl der die Zeichenfolge enthaltenden Zeilen an.find /nZeigt die Zeilen mit ihren Zeilennummern an.
[Bearbeiten] format
Formatiert die Festplatte oder Diskette. Mit format c: wird die Festplatte c: formatiert. Mit format a: wird die Diskette im Laufwerk a: formatiert. Mit format c: -s bzw. format a: -s kann man die Festplatte/Diskette mit Systemdateien formatieren, so das sie nachher bootfähig sind.
[Bearbeiten] help
Die Hilfe-Funktion steht in allen Windows-Systemen (außer Win9X, d. h. 95/98/ME) zur Verfügung. Der allgemeine Befehl hierzu lautet help. Als Ausgabe wird eine Liste mit einem Teil der verfügbaren Kommandozeilen-Befehle ausgegeben. Diese Listen umfasst den Befehlsnamen (linke Spalte) und eine Beschreibung (rechte Spalte). Soll ein Befehl genauer erklärt werden, so lautet die Eingabe help BEFEHLSNAME oder auch BEFEHLSNAME /?. Diese Eingabe in die Kommandozeile fördert detaillierte Informationen und z.T. auch Beispiele zu einem Befehl zu Tage. Es werden jedoch nicht alle Befehle die es im DOS gibt angezeigt.
[Bearbeiten] keyb
Lädt Tastaturtreiber. keyb gr,,c:\dos\keyboard.sys lädt den deutschen Tastaturtreiber (keyboard.sys muss sich im Verzeichis c:\dos\ befinden)
[Bearbeiten] loadhigh
Lädt Programme in freie UMB Upper-Memory-Blocks
[Bearbeiten] md
Der Befehl md (make directory) legt ein neues Verzeichnis an.
[Bearbeiten] more
Mit der Ausgabeumleitung | more (bspw.: type [Dateiname] | more ) wird bei Seitenwechsel zur Bestätigung aufgefordert.
Damit besteht die Möglichkeit über mehrere Seiten führende Dokumente anzuzeigen.
more ist der einzige Befehl, bei der auch in der DOS-Welt die sogenannte Pipe verwendet wird. Bei der Pipe handelt es sich um das Zeichen |. Mit diesem Zeichen ist es möglich, zwei Befehle miteinander auf eine spezielle Weise zu verbinden. Dabei wird der erste Befehl ausgeführt, seine Ausgaben werden jedoch nicht auf den Bildschirm geschrieben, sondern in einen Puffer. Der zweite Befehl wird auf eine Weise gestartet, dass er seine Eingaben nicht von der Tastatur, sondern von eben diesem Puffer bekommt.
[Bearbeiten] move
Verschieben von einer oder mehrerer Dateien von einem Verzeichnis in ein anderes.
[Bearbeiten] path
Durch die Angabe eines Pfades wird das Betriebssystem auf der Kommandozeile dazu aufgefordert, neben dem aktuellen Verzeichnis auch in weiteren Verzeichnissen zu suchen. Wird der Befehl ohne Parameter ausgeführt, so werden alle aktuellen Pfade ausgegeben.
[Bearbeiten] prompt
Legt das Aussehen der Eingabezeile fest.
[Bearbeiten] rd / rmdir
Der Befehl rd oder rmdir (remove directory) löscht ein Verzeichnis, wenn dieses leer ist.
Parameter:
- /s Löscht einen ganzen Verzeichnisbaum mit Dateien
- /q Löscht ohne Nachfrage ganze Verzeichnisbäume. Kann in Batch-Dateien praktisch sein.
Beispiel: rmdir /s /q C:\temp
[Bearbeiten] ren oder rename
Datein(en) umbenennen.
[Bearbeiten] start
Öffnet neues Fenster für eigenes Programm.
Beispiel: (WinXP) zum öffnen eines neuen Konsolenfensters in dem eine Datei aufgerufen wird.
start "Name des neuen Fensters" /WAIT /D C:\temp /NORMAL call test.bat
/WAIT = Wartet bis Anwendung geschlossen wird.
/NORMAL = Startet Anwendung in der NORMAL-Prioritätsklasse.
/D = Danach folgt das Startverzeichnis
[Bearbeiten] set
set setzt eine temporäre Umgebungsvariable oder gibt die Variablenwerte aus. Temporär bedeutet jeweils nur für die aktuelle cmd Session.
[Bearbeiten] setlocal
setlocale Steuert die Begrenzung des Gültigkeitsbereiches von Änderungen. Wird mit endlocal beendet.
[Bearbeiten] time
Gibt die aktuelle Zeit aus und ermöglicht dem Benutzer die Änderung der Uhrzeit.
Bei einigen Betriebssystemversionen erfordert das Ändern des Systemdatums administrative Rechte.
[Bearbeiten] type
Gibt den (reinen Text-)Inhalt der angegebenen Datei (z. B. *.bat, *.cmd oder *.txt) aus.
[Bearbeiten] cacls
Ändert die Rechte (Access Controll List)auf NTFS Partitionen oder zeigt diese an.
cacls *.* /E /T /G Bob:C
Fügt beispielsweise dem User Bob das Recht "Ändern" für alle Dateien und Ordner im aktuellen und allen Unterordnern hinzu. Achtung! Standardmäßig werden Rechte ersetzt!
[Bearbeiten] title
Dieser Befehl ändert die Fensterüberschrift des Programmfensters.
title Beispiel
[Bearbeiten] taskkill
Ab Windows XP kann man mit diesem Befehl einen Prozess beenden, beispielsweise wenn dieser nicht mehr reagiert. Unter Einbindung von /t werden auch alle untergeordneten Prozese beendet, und wenn man /f hinzufügt, wird das Beenden erzwungen.
taskkill /f iexplore.exe /t
[Bearbeiten] assoc
Mit Hilfe dieses Befehls kann man die Dateierweiterungen bearbeiten bzw. anzeigen lassen.
assoc [.dateiendung[=Dateibeschreibung]]
[Bearbeiten] Batch Befehle
[Bearbeiten] @
Schaltet die Ausgabe der Befehlszeile auf dem Bildschirm nur für den aktuellen Befehl aus und ist selbst kein eigener Befehl.
Syntax
@befehl
Stapelanweisung: Ab MS-DOS bis Windows Vista
Beispiel:
Inhalt
echo Diese Zeile wird mit Befehlszeile ausgefuehrt... @echo und diese ohne!
Ausgabe
C:\>echo Diese Zeile wird mit Befehlszeile ausgefuehrt... Diese Zeile wird mit Befehlszeile ausgefuehrt... und diese ohne!
In Batch Files verhindert @echo off, dass Kommentare (mit : oder REM) angezeigt werden:
@echo off REM Verhindert, dass dieser Kommentar angezeigt wird.
Ohne @echo off:
C:\>REM Dieser Kommentar wird so angezeigt
[Bearbeiten] : (Doppelpunkt)
Sprungmarke für ein Unterprogramm bzw. eine Kommentarzeile.
Sprungmarken werden benötigt, wenn mittels der Batchdatei eine Bedingung überprüft und erfüllt bzw nicht erfüllt wird und entsprechend weiter verfahren werden soll.
Mit dem Batchbefehl goto wird die Sprungmarke angesprungen.
Anmerkung:
Der Doppelpunkt hat auch die Funktion der Manipulation von Variablen wenn er direkt hinter einer Variablen steht. Siehe Kapitel "Variablen" in dieser Publikation.
Syntax
:NAMEDERSPRUNGMARKE
Sprungmarken können eine beliebige Länge haben, von cmd behandelt werden allerdings nur die ersten 8 Zeichen, der Rest wird ignoriert. Kommen in einer Batch also :Sprungmarke1 und :Sprungmarke2 vor, so wird nur die erste beim Aufruf einer der Beiden gefunden.
Beispiel:
Inhalt
if exist C:\blabla.txt goto EDITBLA goto END :: Kommentarzeile, sofern es erforderlich ist, einen Kommentar zu schreiben :: Zur Unterscheidung von Sprungmarken verwende ich zwei "::" :EDITBLA edit blabla.txt :END
Sofern die Datei C:\blabla.txt existiert, wird sie mit edit geöffnet, sonst wird das Unterprogramm übersprungen und die Batchdatei bei der Marke :END fortgesetzt, also beendet.
Seit die Befehlserweiterungen aktiviert sind, steht in Batchdateien die Sprungmarke :EOF zur Verfügung, welche sich unsichtbar am Ende der Batch-Datei befindet.
[Bearbeiten] CALL
Mit call kann man eine andere Batch-Datei aufrufen. Sobald diese beendet wurde, wird die ursprüngliche Batchdatei weiter ausgeführt.
Beispiel:
REM Call.cmd @echo off echo Diese Batchdatei ruft eine andere auf. call anderedatei.bat pause
REM anderedatei.bat @echo off echo Die andere Datei
Die Ausgabe wenn man die Datei Call.cmd startet:
Diese Batchdatei ruft eine andere auf.
Die andere Datei
{Pause}
Wenn die Befehlserweiterungen aktiviert sind (Standard ab Windows 2000) kann man auch Sprungmarken aufrufen (und auch Parameter übergeben):
Beispiel:
@echo off REM Diese Batchdatei ruft eine eigene Sprungmarke auf echo Vor dem Sprung call :sprungmarke echo Nach dem Sprung pause goto end :sprungmarke echo Sprungmarke aufgerufen! goto :eof :end exit
Die Ausgabe:
Vor dem Sprung Sprungmarke aufgerufen! Nach dem Sprung
Beispiel mit Parameter:
@echo off REM Diese Batchdatei ruft eine eigene Sprungmarke auf echo Vor dem Sprung call :sprungmarke meinParameter echo Nach dem Sprung pause goto end :sprungmarke echo Sprungmarke aufgerufen und Parameter %1 uebergeben! goto :eof :end exit
Die Ausgabe:
Vor dem Sprung Sprungmarke aufgerufen und Parameter meinParameter uebergeben! Nach dem Sprung
goto :eof
Dieser Befehl springt automatisch zum Ende der Batchdatei (beendet die aktuelle Prozedur)
[Bearbeiten] CLS
Mit cls (clear screen) wird der Bildschirm gelöscht.
Syntax
cls
Interner Befehl: Ab MS-DOS bis Windows Vista
Beispiel:
Inhalt
@echo off echo Hier schreibe ich jetzt ganz viel Text. echo Hier kann ich z.B. hinschreiben, dass ich jemanden mag. echo. echo Aber den Text sieht man gleich sowieso nicht mehr... Hihi! cls echo War irgendetwas? pause>nul
Ausgabe
War irgendetwas?
[Bearbeiten] CMD
Das Programm, das es möglich macht, DOS-Befehle auf einem NT-System zu benutzen. CMD ist die NT-Entsprechung von COMMAND.
Syntax:
cmd /a|/u|/q|/d|/e (ON|OFF)|/f (ON|OFF)|/v (ON|OFF)|/c befehl|/s|/k|/y
Konsole: Ab Windows NT 4.0 bis Windows NT 6.1 (Windows 7)
Beispiel:
Inhalt
cmd
Ausgabe (unter XP)
C:\>cmd Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\>
Ausgabe (unter Vista)
C:\>cmd Microsoft Windows [Version 6.0.6001] Copyright (c) 2006 Microsoft Corporation. Alle Rechte vorbehalten.
[Bearbeiten] COMMAND
Startet einen neuen Kommandointerpreter. Dieser kann mit exit wieder beendet werden.
Syntax:
command Laufwerk:Pfad Gerät /e /l /u /P /MSG /LOW (/Y (/c|/k) Befehl)
Konsole: Ab MS-DOS bis Windows XP
Beispiel:
Inhalt
command
Ausgabe (unter Windows 95)
C:\WINDOWS>command Microsoft(R) Windows 95 (C)Copyright Microsoft Corp 1981-1996. C:\WINDOWS>
[Bearbeiten] ECHO
Gibt einen Text aus oder schaltet die Befehlszeilen an/aus. Wenn ein Text ausgegeben wird, können dort auch Variablen angezeigt werden, wie z. B. die Variable %ver% (in Windows XP %os%).
Syntax:
echo text|ON|OFF oder alternativ echo.[text]
Interner Befehl: Ab MS-DOS bis Windows NT 5.1 (XP)
Beispiel:
Inhalt
@echo off echo Die aktuelle Datei heißt %0%. echo Die aktuelle Version Ihrer Befehls-Konsole oder -OS heißt %ver%
Ausgabe
Die aktuelle Datei heißt beispiel.bat. Die aktuelle Version Ihrer Befehls-Konsole oder -OS heißt Windows NT
Mit echo. können Sie zudem leere Zeilen ausgeben. Beispiel:
Inhalt
@echo off echo Jetzt gibt es 3 Leere Zeilen zu sehen! echo. echo. echo. echo So! Da waren sie.
Ausgabe
Jetzt gibt es 3 Leere Zeilen zu sehen! So! Da waren sie.
[Bearbeiten] Benutzereingaben mit ECHO
Mit Hilfe des echo-Befehls können Sie auch in einem Skript Benutzereingaben simulieren, indem Sie den Pipe-Operator | verwenden.
Beispiel: Uhrzeit anzeigen ohne Nachfrage
Das normale Verhalten des time-Befehls ist, die aktuelle Zeit der verwendeten Systemuhr anzuzeigen und in der nächsten Zeile die Eingabe einer neuen Uhrzeit zu erwarten. Drückt man auf Enter, bleibt die Systemzeit unverändert. Will man die Zeit nur anzeigen lassen (z. B. in einer Batchdatei vor und nach einer Befehlsfolge, um zu messen, wie lange der PC dafür braucht), lässt sich die Betätigung der Enter-Taste durch einen entsprechenden echo-Befehl ersetzen.
echo.|time
Über den Pipe-Mechanismus lässt sich darüber hinaus die Zeile „Geben Sie die neue Uhrzeit ein:“ unterdrücken:
echo.|time|find /v "neue"
Dabei ist die Groß-/Kleinschreibung von "neue" zu beachten oder der Schalter /I zu verwenden, denn find ist case-sensitiv! Diese Beispiele dienen allerdings nur zur Demonstration, denn die Zeitausgabe wäre auch ohne Pipes (aber erst ab Windows 2000) möglich mit:
time /t
oder einfach:
echo %time%
Sehr nützlich ist das echo-Piping auch zur Übergabe von Benutzereingaben, welche von einzelnen Befehlen abgefragt werden.
Beispiel: Überprüfung einer Festplatte
chkdsk c: /f /r
kann (da es sich beim Laufwerk C um das Systemlaufwerk handelt) erst nach einem Systemstart ausgeführt werden. Normalerweise müsste der Benutzer deswegen den Systemstart durch Eingabe von "Y" bestätigen. Diese Aktion kann man in einem Batch so abbilden:
echo y | chkdsk c: /f /r
.
[Bearbeiten] FOR
Ermöglicht die Schleifenbearbeitung.
Syntax:
for Variable in Satz do Befehl [Parameter]
Interner Befehl: Ab MS-DOS bis Windows NT 6.1 (Windows 7)
Beispiel:
Zeigt alle Dateien im Verzeichnis %temp% an. Es werden nur Dateien, keine Verzeichnisse angezeigt. Um Verzeichnisse anzuzeigen siehe Liste der FOR-Optionen unten. Der Parameter /R bewirkt, dass alle Unterverzeichnisse mit einbezogen werden (Rekursive Schleife).
ACHTUNG:
Die Variable darf nur aus einem Buchstaben bestehen! "%t" ist erlaubt, "%test" nicht! Bei der Verwendung mehrerer Befehle muss zwischen "DO" und der Klammer "(" ein Leerzeichen sein.
Falsch
for Variable in Satz do(
RICHTIG
for Variable in Satz do ( Befehl1 Befehl2 )
Inhalt
@echo off
for /R %temp% %%f in (*.*) do (
echo %%f
)
REM Den Befehl könnte man auch einzeilig schreiben.
pause
Ausgabe
(Alle Temp-Dateien) Bitte beliebige Taste drücken...
Zählschleifen
Mit solchen Schleifen kann man Aktionen eine bestimmte Anzahl oft ausführen. Dazu muss man den Parameter /L angeben.
Syntax: for /L {Variable} IN (Startzahl, Schrittweite, Endzahl) DO (Aktion)
REM Schreibe Text 5 Mal for /L %%N IN (1, 1, 5) DO echo Nummer %%N
Ausgabe:
C:\>for /L %N IN (1, 1, 5) DO echo Nummer %N C:\>echo Nummer 1 Nummer 1 C:\>echo Nummer 2 Nummer 2 C:\>echo Nummer 3 Nummer 3 C:\>echo Nummer 4 Nummer 4 C:\>echo Nummer 5 Nummer 5
verschachtelte Zählschleife:
for /L %%N IN (1, 1, 5) DO ( for /L %%N IN (1, 1, %%N)DO echo Nummer %%N )
Ausgabe:
C:\>for /L %N IN (1 1 5) DO (for /L %N IN (1 1 %N) DO echo Nummer %N ) C:\>(for /L %N IN (1 1 1) DO echo Nummer %N ) C:\>echo Nummer 1 Nummer 1 C:\>(for /L %N IN (1 1 2) DO echo Nummer %N ) C:\>echo Nummer 1 Nummer 1 C:\>echo Nummer 2 Nummer 2 C:\>(for /L %N IN (1 1 3) DO echo Nummer %N ) C:\>echo Nummer 1 Nummer 1 C:\>echo Nummer 2 Nummer 2 C:\>echo Nummer 3 Nummer 3 C:\>(for /L %N IN (1 1 4) DO echo Nummer %N ) C:\>echo Nummer 1 Nummer 1 C:\>echo Nummer 2 Nummer 2 C:\>echo Nummer 3 Nummer 3 C:\>echo Nummer 4 Nummer 4 C:\>(for /L %N IN (1 1 5) DO echo Nummer %N ) C:\>echo Nummer 1 Nummer 1 C:\>echo Nummer 2 Nummer 2 C:\>echo Nummer 3 Nummer 3 C:\>echo Nummer 4 Nummer 4 C:\>echo Nummer 5 Nummer 5
Weitere Möglichkeiten der FOR-Schleife:
syntax-FOR-Files
FOR %%parameter IN (set) DO command
syntax-FOR-Files-Rooted at Path
FOR /R [[drive:]path] %%parameter IN (set) DO command
syntax-FOR-Folders
FOR /D %%parameter IN (folder_set) DO command
syntax-FOR-List of numbers
FOR /L %%parameter IN (start,step,end) DO command
syntax-FOR-File contents
FOR /F ["options"] %%parameter IN (filenameset) DO command
FOR /F ["options"] %%parameter IN ("Text string to process") DO command
syntax-FOR-Command Results
FOR /F ["options"] %%parameter IN (`command to process`) DO command
Zählvariablen in Zeichenketten einbetten
Um die Zählvariable %%f (%f auf der Kommandozeile) in einer Zeichenfolge zu verwenden, wird einfach die Variable in dem String eingebettet
FOR %%f IN (A B C D E) DO (
echo mitten%%fdrinnen
)
[Bearbeiten] GOTO
Mit dem Batchbefehl goto wird eine Sprungmarke : (s.o.) angesprungen.
Syntax
goto NAMEDERSPRUNGMARKE
Beispiel
Siehe unter : (Doppelpunkt).
[Bearbeiten] IF
Der IF Befehl ermöglicht eine einfache Verzweigung und wird oft zusammen mit dem GOTO Befehl eingesetzt. IF ermöglicht hierbei sowohl die Prüfung auf eine Gleichheit als auch auf das Vorhandensein von Dateien.
Beispiel 1:
IF exist c:\temp\my.log echo.>c:\temp\my.log echo.Log Datei erstellt>>c:\temp\my.log
Beispiel 1 prüft ob eine Logdatei vorhanden ist und erstellt ggf. eine Neue.
Beispiel 2:
IF "%COMPUTERNAME%" == "Bastie" GOTO :WAHR REM hier landet man wenn der if-Ausdruck falsch ist GOTO WEITER :WAHR REM hier landet man wenn der if-Ausdruck wahr ist echo Willkommen Zuhause REM Jetzt wird der if Zweig verlassen GOTO WEITER :WEITER echo.Have a nice Day!
Beispiel 3:
IF "%COMPUTERNAME%" == "Bastie" (
echo Willkommen zu Hause!
) ELSE (
echo Du bist auf Computer: %COMPUTERNAME%
)
echo. Schönen Tag noch!
Beachten Sie, bei der Prüfung von Umgebungsvariablen niemals
IF %Umgebungsvariable% == Prüfwert ...
zu schreiben, wenn die Umgebungsvariable nicht gesetzt ist; Sie erhalten sonst einen Syntaxfehler. Der Parameter /i unterbindet eine Differenzierung der Groß-/Kleinbuchstaben.
ACHTUNG:
Bei der Verwendung mehrerer Befehle muss zwischen Bedingung und der Klammer "(" ein Leerzeichen sein.
Falsch
IF Bedingung(
Richtig
IF Bedingung ( Befehl1 Befehl2 )
[Bearbeiten] Syntax Vergleiche
IF <NOT> Variable1==Variable2
NOTDer Befehl wird nur ausgeführt, wenn die Bedingung NICHT Wahr ist. Optional.==ist gleichEQUist gleichNEQnicht gleichLSSkleiner alsLEQkleiner als oder gleichGTRgrößer alsGEQgrößer als oder gleich
[Bearbeiten] PAUSE
Unterbricht die Eingabeaufforderung und wartet auf einen Tastendruck.
Syntax
pause
Interner Befehl: Ab MS-DOS bis Windows NT 5.1 (XP)
Beispiel 1:
Inhalt
@echo off echo Willkommen zur Batchdatei %0 !!! echo. echo Die Batchdatei wird auf einer neuen Seite fortgeführt. pause cls echo Hier fängt meine Batchdatei an... pause
Ausgabe
Willkommen zur Batchdatei beispiel.bat !!! Die Batchdatei wird auf einer neuen Seite fortgeführt. Bitte beliebige Taste drücken...
(Neue Seite)
Hier fängt meine Batchdatei an... Bitte beliebige Taste drücken...
Beispiel 2:
Inhalt
@echo off echo Diese Zeile wird angezeigt anstelle von "Bitte beliebige Taste drücken..." pause > NUL
Ausgabe
Diese Zeile wird angezeigt anstelle von "Bitte beliebige Taste drücken..."
[Bearbeiten] REM
REM leitet einen Kommentar ein. Die Zeile wird ignoriert, beachten Sie jedoch, dass REM von einem Leerzeichen / Tabulator gefolgt werden muss. Alternativ dazu werden häufig auch Sprungmarken eingesetzt, da hier nur ein statt vier Zeichen verwendet werden muss. Häufig wird jedoch die Sprungmarke zur besseren Übersicht doppelt hintereinander geschreiben ::
Beispiel:
REM kill iexplore.exe :kill iexplore.exe ::kill iexplore.exe
[Bearbeiten] START
Startet ein Programm.
Syntax:
START ["Titel"] [/D <Pfad>] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME] [/WAIT] [/B] [Befehl/Programm] [Parameter]
Optionen:
- "Titel" Der Titel des neuen Fensters.
- /D <Pfad> Startverzeichnis
- /I Die neue Umgebung soll die dem CMD.EXE beim Aufruf übergebene sein und nicht die aktuelle Umgebung.
- /MIN Startet das Fenster minimiert.
- /MAX Startet das Fenster maximiert.
- /SEPARATE Startet 16-Bit-Windows-Programm in separatem Speicherbereich.
- /SHARED Startet 16-Bit-Windows-Programm in gemeinsamen Speicherbereich.
- /LOW Startet Anwendung in IDLE-Prioritätsklasse.
- /NORMAL Startet Anwendung in der NORMAL-Prioritätsklasse.
- /HIGH Startet Anwendung in der HIGH-Prioritätsklasse.
- /REALTIME Startet Anwendung in der REALTIME-Prioritätsklasse.
- /WAIT Startet die Anwendung und wartet auf das Ende.
- /B Startet die Anwendung ohne ein neues Fenster zu öffnen. Die Anwendung ignoriert STRG+C. Wenn die Anwendung nicht selbständig STRG+C überprüft, ist STRG+UNTBR die einzige Möglichkeit, um die Anwendung abzubrechen.
- /? Gibt die Hilfe aus.
Hier eine Liste der nützlichen (System)Programme, die man so ausführen kann:
regedit.exe = neuer Registrierungseditor
(regedt32.exe = älterer Registrierungseditor)
explorer.exe = Windows Ordner Explorer
taskmgr.exe = Windows Taskmanager
taskeng.exe = Aufgabenplanungsmodul
calc.exe = Taschenrechner
mshta.exe = Scripthost für HTA (HTML) Scripting
W/CScript.exe = Beides Bestandteil des Windows Scripthostes für JS und VBS
iexplore.exe = Microsoft Windows Internet Explorer, Standardbrowser für Windows
firefox.exe = Mozilla Firefox, Internetbrowser
dialer.exe = Windows-Hilfeprogramm für DFÜ Einwahlverbindungen
Notepad.exe = Standard-Textbearbeitungsprogramm von Microsoft
cmd.exe = Microsoft Windows Befehlsprozessor für Batch
[Bearbeiten] Variablen
Es gibt zweierlei Arten von Variablen: Scriptvariablen und Systemvariablen. Die Scriptvariablen werden innerhalb von Schleifen eingesetzt, beginnen mit % und einem frei wählbaren Zeichen, oder einer Zeichenfolge. Systemvariablen müssen von % begonnen und von % abgeschlossen werden. Sie sind fest definiert. Die Variable %0% hat stets den Namen der aktuellen Datei. Die Variable %ver% hat immer den Namen der aktuellen Betriebssystemversion. Unter Windows XP muss %os% statt %ver% verwendet werden.
Gibt man unter Windows Vista den Befehl echo %os% ein, so gibt der Computer die Version des Systems aus, auf dem das System basiert. Unter Windows Vista gibt es einen Befehl namen ver, mit dem man die Version direkt angezeigt bekommt. Es gibt zwar keine direkte Variable bei Vista, die das Betriebsystem definiert, jedoch kann man das mit folgendem Trick umgehen:
@echo off ' Autobefehlsanzeige ausgeschaltet ver > TMP.dat ' speichert die Ausgabe des Befehls in der Datei TMP.dat Set ver= < TMP.dat ' definiert die Variable des Betriebssystems. (NUR TEMPORÄR !) echo %ver% ' gibt nun die defninierte Variable aus. pause>nul ' pause
Nützliche Stringoperation für Variablen:
Teilstring
Syntax
var:~n,m
Ergibt den Teilstring von var, beginnend mit dem n-ten Zeichen ( von links) und einer Länge von m Zeichen. Gezählt wird ab 0, d.h. das erste Zeichen hat die Position 0 und nicht 1. Werden negative Werte verwendet, so wird vom Ende des Strings /von rechts nach links) gezählt.
Beispiel:
Inhalt:
set str=myfile.bat set name=%str:~0,6% echo %name%
In diesem Beispiel wird der Teilstring von str vom ersten Zeichen an mit einer Länge von 6 Zeichen ausgegeben.
Ausgabe:
myfile
Stringsubstitution
Syntax
var:str1=str2
Mithilfe des Syntax var:str1=str2 kann die Zeichenkette str1 des Inhalts der Variable var durch str2 ersetzt werden.
Beispiel:
Inhalt:
set str="mycommand /p /m file" echo %str% set str=%str:/p /m=/t % echo %str%
In diesem Beispiel werden die Optionen /p /m des Befehls mycommand durch die Option /t ersetzt.
Ausgabe:
"mycommand /p /m file" "mycommand /t file"
[Bearbeiten] COLOR
Mit dem Befehl COLOR kann man die Vorder- und Hintergrundfarbe verändern. Die COLOR Werte bestehen aus zwei HEX-Werten.
0 = Black
1 = Blue
2 = Green
3 = Aqua
4 = Red
5 = Purple
6 = Yellow
7 = White
8 = Gray
9 = Light Blue
A = Light Green
B = Light Aqua
C = Light Red
D = Light Purple
E = Light Yellow
F = Bright White
Der Befehl
COLOR 2F
ergibt zB einen grünen Hintergrund mit weißer Schrift.
[Bearbeiten] TASKKILL
Beendet Prozesse direkt über den Taskmanager. (Nur unter Windows XP Professional)
Syntax
taskkill /IM prozessname.dateiendung
Beispiel:
Inhalt:
@echo off echo Der Internetexplorer wird gestartet und in 5 Sekunden geschlossen start iexplore http://de.wikibooks.org @ping localhost -n 5 >NUL taskkill /IM iexplore.exe pause
In diesem Beispiel wird die Anwendung Internetexplorer gestartet und 5 Sekunden nach dem Start wieder geschlossen. Das Kommanozeilenfenster bleibt offen, bis der Benutzer eine beliebige Taste drückt.
[Bearbeiten] Erweiterungen unter Windows NT
Unter Windows NT, Windows 2000 und Windows XP stehen einige weitere Befehle zur Verfügung, zum Teil sind dort auch erweiterte Optionen für Standard-Befehle enthalten.
[Bearbeiten] Batchparameter
Die Parameter lassen sich jetzt folgendermaßen erweitern (für 1 setze man den jeweiligen Parameter ein):
%~1 Anführungszeichen (") werden entfernt
%~f1 vollständige Pfadbezeichnung
%~d1 Laufwerkbuchstabe
%~p1 Pfad (ohne Laufwerksbuchstabe)
%~n1 Dateiname
%~x1 Dateinamenserweiterung
%~s1 Pfad nur mit kurzen Verzeichnis/Dateinamen (8.3-Konvention)
%~a1 Dateiattribute
%~t1 Datums- und Uhrzeitangaben der Datei (Geändert am)
%~z1 Größe der Datei
Die Angaben können auch kombiniert werden, z.B. %~dp0 ist Laufwerksbuchstaben + Pfad der aktuellen Batchdatei.
[Bearbeiten] Stringmanipulation
Mit folgender Syntax lassen sich Teile aus einer Zeichenkette extrahieren:
set str=Hallo set str=%str:~1% echo.%str%
Die angegebene positive Zahl gibt an, wie viele Zeichen links übergangen werden sollen. Dieser Ausdruck liefert daher den Teilstring "allo" von "Hallo".
set str=Hallo set str=%str:~-4% echo.%str%
Wird eine negative Zahl eingesetzt, so gibt ihr Betrag an, wieviele Zeichen von rechts genommen werden sollen. Dieser Ausdruck liefert daher ebenfalls "allo".
Über die Angabe einer zweiten Zahl kann definiert werden, was mit dem Rest nach Auswertung der ersten Zahl entsprechend obiger Regeln geschehen soll. Während die erste Zahl die Zeichenkette links beschneidet, beschneidet die zweite Zahl sie rechts und zwar nach folgenden Regeln:
set str=Hallo set str=%str:~1,2% echo.%str%
Eine positive zweite Zahl gibt an wie viele Zeichen ab links vom Rest genommen werden sollen. Dieser Ausdruck liefert daher "al".
set str=Hallo set str=%str:~1,-2% echo.%str%
Wird eine negative zweite Zahl eingesetzt, so gibt ihr Betrag an, wie viele Zeichen vom Rest ab rechts übergangen werden sollen. Dieser Ausdruck liefert daher ebenfalls "al".
Möchte man beispielsweise nur einen Teil der Zeichenkette ab links, so ist nach diesen Regeln als erste Zahl eine Null anzugeben:
set str=Hallo set str=%str:~0,2% echo.%str%
Dieser Ausdruck liefert daher "Ha".
[Bearbeiten] Umgebungsvariablen
Unter DOS und Windows 9x/ME speichern alle Anwendungen und Skripte ihre Umgebungsvariablen in der gleichen Umgebung. Unter Windows NT-basierten Betriebssystemen ist dies etwas anders:
Zunächst gibt es einen systemweiten Bereich. Dieser enthält Variablen, die für alle Benutzer und alle Anwendungen zugänglich sind. Zusätzlich hat jeder Benutzer seinen eigenen Variablenraum. Jede Anwendung, die nun vom System gestartet wird, erhält einen eigenen Variablenraum, der als Kopie aus dem der aufrufenden Anwendung erzeugt wird. Ändert das Programm etwas (Wertänderung, neue Variable), wirkt sich dies nicht auf parallel gestartete Anwendungen oder das System aus. Lediglich Prozesse, die von der Anwendung gestartet werden erhalten eine Kopie des Anwendungsvariablenraumes. Dadurch ist es nicht möglich, dass Anwendungen Umgebungsvariablen setzen, die dann anschließend in einer Batchdatei verwertbar sind.
Beispiel:
@echo off set a=2 echo %a% command /c: set a=1 echo %a%
Unter Dos würde die Ausgabe lauten:
2 1
Unter Windows NT/2000/XP:
2 2
Das heißt nicht, dass unter Windows NT und Nachfolgern der Befehl set a=1 keinen Effekt hätte, sondern dieser wird in einer geschützten Umgebung ausgeführt, die dann außerhalb dieser Umgebung keinen Effekt mehr hat. Für die aufgerufene Variante von command ist a nach dem set-Befehl sehr wohl gleich 1.
Noch eine Änderung Variablen betreffend.
[Bearbeiten] Die Kommandozeile lernt Rechnen
Seit Windows NT 4 kann man mit dem set Befehl auch Rechnen.
Ein Beispiel:
set /a 1+2 3
Man kann das Ergebnis auch in Variablen schreiben:
set /a n=5+5 10 echo %n% 10
- CMD nimmt folgendes entgegen (Auszug aus der Hilfe):
() - Gruppierung
! ~ - - unäre Operatoren
* / % - arithmetische Operatoren (% bedeutet Modulo)
+ - - arithmetische Operatoren
<< >> - logische Verschiebung
& - bitweise UND
^ - bitweise exklusives ODER
| - bitweise ODER
= *= /= %= += -= - Zuordnung
- Mit Klammern:
set /a (1+1)*(4-3) 2
[Bearbeiten] Benutzereingaben
Seit Windows 2000 kann man mit dem set Befehl auch Eingaben abfragen:
Syntax:
set /p {variablenname}={Angezeigter Text}
[Bearbeiten] Beispiel
@echo off set /p var=Eingabe: echo Sie haben %var% eingegeben. pause
Ausgabe:
Eingabe: Test
Sie haben Test eingegeben.
{Pause}
Prüfung ob der Benutzer Text eingegeben hat:
@echo off set /p var=Eingabe: if not defined var ( echo Bitte geben sie etwas ein! set var=nichts REM Könnte auch was ganz anderes sein ) echo Sie haben "%var%" eingegeben. pause
Ausgabe:
Eingabe: {leer}
Bitte geben sie etwas ein!
Sie haben "nichts" eingegeben.
{pause}
[Bearbeiten] Ausgaben in eine Variable umleiten
Eine Möglichkeit der Umleitung einer Ausgabe besteht über den set /p Befehl:
Syntax:
ECHO {Befehl}> {Dateiname}
SET /P {Variablenname}=<{Dateiname}
[Bearbeiten] Beispiel
@ECHO OFF ECHO %date% > _.txt SET /P tmp=<_.txt ECHO Das Datum heute ist: %tmp%
- siehe auch Net-Befehle
[Bearbeiten] Programmierungshilfen
[Bearbeiten] Ändern des Editors zum Bearbeiten von Batchdateien
Wenn man im Windows Explorer mit der Rechten-Maus-Taste (RMT) auf eine *.bat klickt, so werden einem die Befehle Öffnen und Bearbeiten angeboten.
Öffnen: führt die Batchdatei aus. Mit dem Befehl
Bearbeiten: wird die Batchdatei in den Texteditor notepad.exe zum Bearbeiten geöffnet.
Auch wenn Notpad zum Bearbeiten von Batchdateien ausreicht, so möchte man häufig doch die Batchdateien mit einem anderen, konfortableren Editor bearbeiten, der z.B. Syntaxhervorhebung (Syntaxhighlighting) beherrscht.
Um einen anderen Editor (z.b. Syn) zu verwenden, muss man in der Registry an der Stelle:
HKEY_CLASSES_ROOT\batfile\shell\edit\command
den Standard Wert
(Standard) = %SystemRoot%\System32\NOTEPAD.EXE %1
auf den Startbefehl des entsprechenden Editors ändern. Z.B.
HKEY_CLASSES_ROOT\batfile\shell\edit\command | (Standard) = c:\Programme\Editor\syn\syn.exe %1
[Bearbeiten] Datum und Uhrzeit anzeigen
Für Log-Dateien ist es wichtig, dass man die Logeinträge mit Datum und Uhrzeit versehen kann:
echo %date:~0% - %time:~0,8% Uhr
Ergebnis: 12.01.2007 - 15:59:53 Uhr
Hierbei steht ":~0,8" für die Angabe der Stellen. Mit "0,8" wird angegeben, dass die Ausgabe der Zeit bei Position 0 beginnen soll und insgesamt 8 Stellen beinhalten soll. Die maximale Stellenanzahl ist 11 (0,11).
Beim Datum ist diese Angabe hier nicht nötig, da dieses standardmäßig im dd.mm.yyyy-Format ausgegeben wird. Wer aber nur das Jahr haben will, kann "%date:~-4%" eingeben und erhält damit die letzten 4 Zeichen. Für ein sortiergerechtes Datum in der Umgebungsvariablen sortdate sorgt z.B.
set SORTDATE=%date:~-4%-%date:~3,2%-%date:~0,2% echo %SORTDATE%
Wert der Umgebungsvariable: 2009-04-20
Beachte:
In einer Batchdatei kann die Verwendung von %DATE% und insbesondere von %TIME% dazuführen, das die ausgegebene Uhrzeit sich nicht aktualisiert.
Hierzu folgendes Beispiel:
@echo off echo ## Die aktuelle Zeit ist: %TIME% echo ## bitte ca. 5 Sec. warten ... ping -n 5 localhost>NUL echo ## jetzt sollten ca. 5 Sec. vergangen sein, TIME liefert %TIME%, das ist noch OK echo ## doch in der FOR Schleife wird bereits die alte Zeit verwendet. for /L %%N IN (0, 1, 3) DO ( echo %time% pause ) echo ## und dies beleibt fuer jede Ausgabe innerhalb der FOR-Schleife so. echo. echo ## Auch in z.B. IF-Schleifen ist das so. if TRUE==TRUE ( echo 1. Zeit in der If Schleife: %TIME% echo Warte ca. 5 Sec. ping -n 5 localhost >NUL echo 2. Zeit in der If Schleife: %TIME% echo Warte nochmals ca. 5 Sec. ping -n 5 localhost >NUL echo 3. Zeit in der If Schleife: %TIME% ) echo ## Dabei ist es bereits: %TIME% pause
Damit %DATE% und %TIME% die richtigen Werte ausgeben, muss unbedingt die verzögerte Erweiterung von Umgebungsvariablen mit dem Befehl SETLOCAL ENABLEEXTENSIONS aktiviert werden.
Hier das korrekte Beispiel:
@echo off SetLocal EnableDelayedExpansion echo ## Die aktuelle Zeit ist: !time:~0,8! echo ## bitte ca. 5 Sec. warten ... ping -n 5 localhost>NUL echo ## jetzt sollten ca. 5 Sec. vergangen sein, TIME liefert !TIME!, das ist OK echo ## Jetzt gibt auch die FOR Schleife die korrekte Zeit aus. for /L %%N IN (0, 1, 3) DO ( echo !TIME! pause ) echo. echo ## Auch in z.B. IF-Schleifen ist es jetzt richtig. if TRUE==TRUE ( echo 1. Zeit in der If Schleife: !TIME! echo Warte ca. 5 Sec. ping -n 5 localhost >NUL echo 2. Zeit in der If Schleife: !TIME! echo Warte nochmals ca. 5 Sec. ping -n 5 localhost >NUL echo 3. Zeit in der If Schleife: !TIME! ) echo ## Es ist jetzt: !TIME! EndLocal pause
[Bearbeiten] Ausgaben besser anzeigen
Wenn man nicht die Ausgabe von Befehlen per @echo off "Ausblendet" kann man am besten das Prompt ändern, sodass man besser erkennen kann, was passiert:
@prompt -$G
Der Prompt ist dann ->
[Bearbeiten] Unterroutinen und Unterprogramme
Unterroutinen kann man mittels goto oder call und Unterprogramme mit Hilfe von call realisieren.
call:unterroutine Hallo
echo Fertig!
goto:eof
:unterroutine
echo Übergebener Parameter an Unterroutine: %1
goto:eof
Beachten Sie, dass beim Aufruf von Unterroutinen per call Sie Probleme mit Filehandles bekommen können. Dies liegt darin begründet, dass ein Aufruf per call als Aufruf eines Unterprogramms interpretiert wird, während es sich bei goto stets um Unterroutines handelt.
Anmerkung: goto:eof ist eine Spezialmarke mit der Sie stets zum Ende Ihres Skriptes (bzw. Ihrer Unterroutine) springen
[Bearbeiten] Benutzereingaben mittels "set /P"
@echo off
set /P w= [i]nstallieren / [d]eInstallieren?
REM die option /I beim if bewirkt, dass nicht
REM zwischen Gross und Kleinschreibung
REM unterschieden wird.
if /I "%w%"=="i" goto Install
if /I "%w%"=="d" goto Deinstall
echo Fehler: [%w%]
goto ende
:Install
echo "installieren" ausgewählt
goto ende
:Deinstall
echo "deInstallieren" ausgewählt
goto ende
:ende
echo.
pause
[Bearbeiten] stdout in Umgebungsvariable speichern
Falls man den stdout in einer Umgebungsvariable speichern möchte, muss man das komplizierter umsetzen. Es gibt zwei verschiedene Möglichkeiten dies anzugehen. befehl | set /P variable= funktioniert nämlich nicht. Stattdessen braucht man:
BEFEHL > temp.txt set /p BefehlOutput= < temp.txt del temp.txt
Oder:
FOR /F %%i IN ('BEFEHL') DO set BefehlOutput=%%i
Oder mit "usebackq"-Option:
FOR /F "usebackq" %%i IN (`BEFEHL`) DO set BefehlOutput=%%i
Die Zeichenkette zwischen den einfachen Anführungszeichen wird dabei als Befehlszeile betrachtet und von einer untergeordneten CMD.EXE ausgeführt. %BefehlOutput% kann nun beliebig gebraucht werden.
[Bearbeiten] Beispiel:
Code:
@echo off
FOR /F %%i IN ('CD') DO set verzeichnis=%%i
echo %verzeichnis%
Ausgabe:
C:\Programme\Batch
Vorsicht ist geboten, bei Befehlen, welche mehrzeilige Ausgaben produzieren und bei solchen, welche in ihrer Ausgabe auch Leerzeichen enthalten können. Da das Standardtrennzeichen ein Blank ist muss man, wenn man nicht will, dass die Variable nur bis zum Blank gefüllt wird, das Standardtrennzeichen verändern. FOR /F "delims=" %%i IN ('CD') DO set verzeichnis=%%i entfernt jede Art von Trennzeichen. Bei Befehlen, welche mehrzeilige Ausgaben zur Folge haben, bleibt jeweils die letzte Zeile in der Variablen erhalten.
[Bearbeiten] Dateien und Verzeichnisse auflisten
Hier ist ein Beispiel, in dem alle Dateien, auf welche die Filterbedingung zutrifft, aufgelistet werden. Ausserdem werden die Dateianzahl und die Dateigrößen zusammenaddiert.
@echo off
set Filter=*.*
set /A DateiAnzahl=0
set bytes=0
for /R %pfad% %%f in (%Filter%) do (
set /A DateiAnzahl += 1
echo %%f - %%~zfBytes
set /A bytes=bytes+%%~zf
)
echo.
echo %~dp0%Filter%
echo Es sind %DateiAnzahl% Dateien vorhanden.
echo Alle Dateien zusammen: %bytes%Bytes
set /A kbytes=bytes/1024
echo umgerechnet sind das %kbytes% KBytes
echo.
pause
[Bearbeiten] Pause
Oft ist es hilfreich, dass ein nach dem Beenden des Batch-Programms das Eingabeaufforderungsfenster offen bleibt. So kann man Ausgaben nachlesen oder evtl. aufgetretene Fehler entdecken. Nun könnte man einfach am Ende eine pause einfügen. Dabei kann der User einfach das Fenster schließen oder ENTER drücken. Man kann aber auch einfach eine zeitliche Pause mit ping realisieren:
@echo off echo Ich schließe gleich. @ping localhost -n 2 >NUL
Dabei kann man die Zeit mit dem Parameter -n variieren.
Bei installiertem Resourcekit steht der Befehl "sleep" zur Verfügung welcher dieselbe Funktionalität (zeitliche Pause) bietet.
[Bearbeiten] Minimiert ausführen
Hin und wieder ist es sinnvoll, dass die Batchdatei minimiert ausgeführt wird (z. B. eine Login-Batch-Datei). Es ist möglich, dass man die Batchdatei normal startet und sie sich selber minimiert ausführt. Der Nachteil ist allerdings, dass sich kurzzeitig ein Eingabeaufforderungs-Fenster öffnet.
@echo off
if not "%1"=="" goto %1
start /MIN cmd.exe /C "%~nx0 begin"
goto:eof
:begin
echo Hallo, ich laufe minimiert!
pause
goto:eof
Noch eine Konstruktion ganz ohne Labels, nach diesem Newsgroup-Beitrag
@set !=||(set !=1&start "%~dpnx0" /min cmd /c %0 %*&set !=&goto :eof)
[Anmerkung zum Newsgroup-Beitrag] Sollte die Command-Processor-Option "DelayedExpansion" in der Registry aktiviert sein (siehe unter Hilfe "cmd /?"), lässt sich ein "!" als Variablenname nicht verwenden. In diesem Fall -bzw. sinnvollerweise immer- den Variablennamen ändern auf x oder y oder # oder @....
Beispiel: @set #=||(set #=1&start "%~dpnx0" /min cmd /c %0 %*&set #=&goto :eof)
[Bearbeiten] Mittels start /LOW die Priorität festlegen
Manchmal ist es hilfreich, wenn die Batchdatei mit einer niedrigen Priorität läuft. Das kann man mittels start /LOW erreichen. Weitere Optionen sind NORMAL, HIGH, REALTIME, ABOVENORMAL und BELOWNORMAL. Das Beispiel zeigt, wie eine Batchdatei quasi sich selber in die niedrige Priorität versetzten kann. In dem Fall klappt es allerdings nur, wenn beim ersten Start kein Parameter übergeben wurde.
@echo off
if "%1"=="" (
start /WAIT /LOW /B cmd.exe /V /C %~s0 weiter_machen
goto:eof
)
echo Jetzt laufe ich mit niedriger Priorität!
echo Überprüfe es im Taskmanager!
pause
Funktionsweise: Das Prinzip ist eigentlich ganz einfach. Wenn kein Parameter übergeben wird, wird angenommen, das die Batchdatei zum ersten mal gestartet wurde. Die if "%1"=="" Bedingung ist also erfüllt. Mittels start wird dann die selbe Batchdatei mit veränderter Priorität gestartet, allerdings mit einem angehängten Parameter weiter_machen (Könnte auch irgendwas anderes sein!) Somit ist beim nächsten Aufruf die if "%1"=="" Bedingung nicht mehr erfüllt und der normale Teil der Batchdatei wird abgearbeitet.
Wenn man der Batchdatei einen Parameter übergeben möchte (z.B. ein Dateiname o.ä.) muß man alle Parameter verschieben:
@echo off
if "%2"=="" (
start /WAIT /LOW /B cmd.exe /V /C %~s0 %1 weiter_machen
goto:eof
)
echo Jetzt laufe ich mit niedriger Priorität!
echo Nun kann [%1] 'bearbeitet' werden...
pause
Anmerkungen: Normalerweise könnte man statt %~s0 auch "%~0" bei der cmd.exe Zeile verwenden. Allerdings klappt das nicht richtig, wenn Leerzeichen in der Batch Datei vorhanden sind. Mit %~s0 wird der komplette Pfad zur Batchdatei als "Kurznamen" angegeben. In dem Pfad kommt dann keine Leerzeichen vor.
[Bearbeiten] Probleme mit Variablen
Wenn man sich die Hilfeseiten zu set (mittels set /?) durchliest, stößt man auf das Thema verzögerte Erweiterung von Variablen. Das will ich hier mal anhand von Beispielen erklären:
[Bearbeiten] Das Problem
set test=1
if "%test%"=="1" (
set test=2
echo Wert von 'test' im IF-Block: %test%
)
echo Wert von 'test' nach IF-Block: %test%
Man sollte meinen, dass der Wert von %test% in beiden Ausgaben 2 ist. Doch leider ist es nicht so. Denn innerhalb des IF-Blocks wird das Neusetzen der Variable test von 1 auf 2 noch nicht aktiv und somit ist das Ergebnis Wert von 'test' im IF-Block: 1 Erst nach dem IF-Block ist der Wert aktualisiert: Wert von 'test' nach IF-Block: 2
[Bearbeiten] Lösung: cmd.exe /V
In einer Batchdatei die mit cmd /V gestartet wurde, werden Variablen innerhalb von Befehlsblöcken aktualisiert. Jedoch kann man sie nicht gewohnt mit %test% ansprechen, sondern mit !test!
@echo off
if "%1"=="" (
start /WAIT /B cmd.exe /V /C "%~0" machen!
goto:eof
)
set test=1
if "%test%"=="1" (
set test=2
echo Wert von 'test'-Prozent in dem IF-Block: %test%
echo Wert von 'test'-Ausrufezeichen in dem IF-Block: !test!
)
echo Wert von 'test' nach dem IF-Block: %test%
pause
[Bearbeiten] Ausgaben/Fehler unterdrücken
Manchmal möchte man per Batch ein Programm starten aber es sollen dabei keine Ausgabe gemacht werden. Das ist recht einfach:
MeinProgramm.exe >NUL
Es könnte aber sein, dass evtl. Fehler dennoch ausgegeben werden. Das liegt daran, das die Programme in dem Fall auf stderr statt stdout schreiben. Um auch in dem Fall die Ausgabe zu unterdrücken, kann man mit einem zusätzlichen 2>&1 die Ausgaben von stderr auf stdout umleiten. Da stdout dann nach NUL verschoben wird, sieht man absolut nichts:
MeinProgramm.exe >NUL 2>&1
[Bearbeiten] Professionelle Message-Fenster erzeugen
Bisher konnte man in Batch keine Fenster erzeugen, bzw. nur in Windows XP mithilfe des Windows Nachrichtendienstes. Doch der ist für Anwendungen viel zu unpraktisch, da man nicht einmal den Fenstertitel bestimmen kann und außerdem ist dieser unter Vista oder Windows 2000 nicht verfügbar.
Ich habe jedoch ein kleines Schlupfloch gefunden, mit dem man dennoch Fenster erzeugen kann:
@echo off Echo msgbox"Text",0,"Fenstername" >Test.vbs ping localhost -n 3 -w 1000 >NUL start Test.vbs pause
Erklärung: Man erzeugt hier mithilfe des Operators > einen Temporären VBScript, der in der Lage ist, ein Messagefenster zu erzeugen. Dies sorgt in Anwendungen für mehr Übersicht und Professionalität.
[Bearbeiten] Falls das nicht funktioniert
Falls statt eures Textes die Meldung :
"Der Zugriff auf den Windows Scripthost ist auf diesem Computer deaktiviert"... erscheint, dann ist das Öffnen von VBscripts und JScripts aus Sicherheitsgründen verboten.
Um das zu ändern, öffnet ihr den Windows Registrierungseditor (regedit.exe) und löscht NUR folgenden Wert :
HKey_Local_Machine\Software\Microsoft\WindowsScriptHost\Enabled
dann dürfte es funktionieren. Erstellt vor der Änderung eine Sicherheitskopie eurer Werte !!!
[Bearbeiten] Beispiele
[Bearbeiten] Regedit.exe
Eine kleine Batchdatei, um mit regedit.exe direkt einen bestimmten REG-Zweig anzuspringen:
set LastKey="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix" set Key=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit reg add %Key% /f /v "LastKey" /d %LastKey% start regedit.exe
Erläuterung:
- LastKey ist der Reg-Schlüssel, der als Letztes angezeigt wurde und dieser wird beim Start von regedit direkt angesprungen, diesen Schlüssel kann man nach Belieben anpassen.
- Key ist der Reg-Schlüssel in dem sich der Wert "LastKey" befindet.
LastKey wird mittels reg add in die Registry eingespielt und danach wird regedit gestartet. Das Ganze funktioniert allerdings nur, wenn regedit.exe noch nicht läuft.
Und hier noch eine kleine Batchdatei, um mit regedit.exe Werte aus der Registry auszulesen:
set Key="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" regedit.exe /e c:\temp\inhalt.reg %Key%
Achtung! Die Datei inhalt.reg ist im Unicode-Format. Ein Tipp dazu: Der type-Befehl kann Unicode lesen.
[Bearbeiten] TaskList-Abfrage
Eine Routine um das Laufen eines Prozesses mittels tasklist.exe festzustellen. In diesem Beispiel wird geprüft, ob Prozess.exe läuft.
@echo off set ProgEXE=Prozess.exe set tempdatei=%temp%\TempDatei.txt tasklist /FI "IMAGENAME eq %ProgEXE%" /FO CSV>%tempdatei% for /F "skip=2 tokens=1 delims=," %%f in (%tempdatei%) do ( echo gefiltert: [%%f] if "%%f"==""%ProgEXE%"" echo Prozess %ProgEXE% läuft goto ende ) echo Prozess %ProgEXE% läuft nicht! goto ende :ende del %tempdatei%
Alternativ, ohne obige temporäre Datei 'tempdatei' zu benötigen, kann man beispielsweise unter Windows XP folgendes verwenden:
TaskList /FI "IMAGENAME eq %ProgEXE%" 2>NUL | Find "%ProgEXE%" >NUL IF ERRORLEVEL == 1 ( ECHO NOT Running. GOTO Ende ) ELSE ( ECHO Running. GOTO Ende )
[Bearbeiten] Dienste einrichten
@echo off prompt -$G echo. echo ### Manuelle Dienste ### echo. call:M helpsvc "Hilfe und Support" call:M ImapiService "IMAPI-CD-Brenn-COM-Dienste" echo. echo ### nicht benötigte Dienste Deaktivieren ### echo. call:D cisvc "Indexdienst" call:D ERSvc "Fehlerberichterstattungsdienst" echo. echo ### Automatische Dienste ### echo. call:A CryptSvc "Kryptografiedienste call:A MSIServer "Windows Installer" echo. echo. echo Fertig! echo. pause goto:eof :A echo %2 auf Automatisch set Parameter=auto net start %1 goto machen :M echo %2 auf Manuell set Parameter=demand net stop %1 goto machen :D echo %2 auf Deaktiviert set Parameter=disabled net stop %1 goto machen rem Systemstart Gerätetreiber, der vom Startladeprogramm geladen wird. rem system Gerätetreiber start während der Kernelinitialisierung. rem auto automatischer start, nach systemstart, vor Benutzeranmeldung. rem demand Dienst, der manuell gestartet werden muss. rem disabled Dienst deaktivieren :machen echo on sc config %1 start= %Parameter% @echo off echo. echo. goto:eof
[Bearbeiten] Windows XP SP2: installierte Patches/Updates auflisten
Zeigt unter Windows XP mit Service Pack 2 alle zusätzlich installierten Patches/Updates an.
@echo off set RegHotfixListe=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix set RegHotfixInfo=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3 for /F "delims=\ tokens=7" %%f in ('reg query "%RegHotfixListe%"') do ( set HotFixNr=%%f CALL :Anzeigen ) echo. echo. pause goto:eof :Anzeigen reg query "%RegHotfixListe%\%HotFixNr%" /v Installed | FIND "0x1">NUL if "%errorlevel%"=="0" ( set installiert=ja call:KB_Info ) ELSE ( set installiert=nein ) echo %HotFixNr% - Ist Installiert: %installiert% if not "%InstalledBy%"=="" echo %HotFixNr% installiert von %InstalledBy% if not "%InstalledDate%"=="" echo %HotFixNr% am %InstalledDate% echo. goto:eof :KB_Info set InstalledBy= for /F "tokens=3" %%c in ('reg query "%RegHotfixInfo%\%HotFixNr%" /v InstalledBy 2^>NUL ^| FIND "InstalledBy"') do ( set InstalledBy=%%c ) set InstalledDate= for /F "tokens=3" %%c in ('reg query "%RegHotfixInfo%\%HotFixNr%" /v InstalledDate 2^>NUL ^| FIND "InstalledDate"') do ( set InstalledDate=%%c ) goto:eof
[Bearbeiten] Printdateien direkt an den Drucker senden
Sendet einzelne Druckdateien an im Netzwerk freigegebene Drucker. Eignet sich besonders bei Standard Drucksprachen wie Postscript und HPGL/2.
@echo off rem "pl.bat" sendet einzelne Druckdateien an bel. Drucker direkt. rem eignet sich besonders bei Standard Drucksprachen wie Postscript und HPGL/2. rem Laesst sich in Windows bequem einbinden, z.B rechte Maustaste - Senden an Plotter :voreingestellt set server=192.168.0.5 rem server --- IP von Printserver/oder Name von Freigaberechner --- set druckerbeschreibung=192.168.0.5 Freigabename EPSON rem druckerbeschreibung --- damit der Drucker leichter identifiziert werden kann --- set drucker=EPSONNT rem drucker --- das muss der Freigabename im Netzwerk/auf dem Freigaberechner sein --- if '%1' == 'drucker01' goto drucker01 if '%1' == 'drucker02' goto drucker02 if '%1' == 'canon' goto canon goto datei :drucker01 shift goto datei :drucker02 set server=42.1.1.240 set druckerbeschreibung=HP DJ 755CM im Sekretariat set drucker=hpdj755-tcp shift goto datei :canon set server=192.168.0.1 set druckerbeschreibung=Canon s/w Laser im EG set drucker=CanonLBP shift goto datei :datei if '%~1' == '' goto aufruf goto plot :plot echo. echo Dateiname : %1 echo Druckserver : %server% echo Freigabename: %drucker% echo Beschreibung: %druckerbeschreibung% echo. print /d:\\%server%\%drucker% '%~1' goto:eof :aufruf echo. echo aufruf : pl [plotter] Datei echo plotter : drucker01, drucker02, canon, (voreingestellt ist drucker01) echo.
Anmerkung zur Nutzung dieses Scriptes:
- Der Printbefehl schickt die Datei OHNE Interpretation direkt an den Drucker. Eine Bilddatei im JPEG-Format würde statt der Grafik also lediglich einen haufen wirrer Zeichen ergeben.
- Der Drucker muß in der Lage sein, selbst ASCII-Zeichen zu verarbeiten und aus zu geben. Dies ist bei älteren Druckern (vor ca. 1996 sicher) immer der Fall. Heute beherrschen meist nur noch PostScript-fähige Drucker diese Fähigkeit. "Billigen" GDI-Druckern muß man etwas auf die Sprünge helfen mit dem verwendeten "Druckprozessor" im Windows-Druckertreiber.
- Zum Umschalten zunächst die Druckerübersicht öffnen - Zu finden unter Start|Drucker und Faxgeräte
- Dann die Eigenschaften des gewünschten Druckers ausrufen (Rechtsklick|Eigenschaften)
- Auf dem Reiter "Erweitert" den Button "Druckprozessor..." klicken
- In dem erscheinenden Dialogfeld gibt es 2 Felder mit Einträgen. Im rechten Feld (Standartdatentypen) findet sich neben verschiedenen anderen auch der Eintrag "Text". Diesen markieren und dann alles mit OK wieder schließen.
Der Druckprozessor von Windows ist nun in der Lage, Ausgaben entsprechend zu Interpretieren und dem GDI-Drucker als Grafik zu liefern. Es können aber nur stur 80 Zeichen (maximal) auf ca. 60 Zeilen verteil werden. Manchmal sind es bis zu 66 Zeilen.
[Bearbeiten] Copy
Kopieren von Dateien.
Der Befehl
copy test.txt c:\temp
kopiert die Datei test.txt aus dem aktuellen Ordner in den Ordner c:\temp.
Der Befehl
copy c:\test.txt c:\temp
kopiert die Datei test.txt aus dem Ordner c:\ in den Ordner c:\temp
Batch-Dateien kennen beim Kopieren nur Ordner mit max. 8+3 Buchstaben desshalb muss man statt z.B.:
copy test.txt c:\programme
die kurzen Ordner- bzw. Dateinamen
copy test.txt c:\progra~1
verwenden (ist nicht bei jedem Betriebssystem erforderlich. Im Zweifelsfall ausprobieren.).
copy test1.txt + test2.txt test.txt
Kombiniert in der gegebenen Reihenfolge zwei oder mehrere durch "+" verbundene Textdateien in einer neuen Gesamtdatei.
In diesem Zusammenhang muss auf die Bedeutung der Parameter "/A" (für ASCII-Format, der Standardwert) und "/B" (für Binär-Format ) eingegangen werden, die jedem Dateinamen in obigem Beispiel mit einem Leerzeichen Abstand vorangehen können. DOS-Textdateien enthalten ein Dateiendezeichen (Dezimal 26, Hexadezimal 1A). Beim Kopiervorgang darf in der Gesamtdatei nur als letztes Zeichen ein Dateiendezeichen erscheinen, sonst würde der Text nach der ersten Endmarkierung nicht mehr angezeigt. "copy" kopiert ohne das abschließende Zeichen und fügt als letztes wieder eines zur Gesamtdatei hinzu.
Möchte man Dateien mit binären Inhalten zusammenfügen (z.B. PostScript-Dateien, die auch binäre Abschnitte enthalten können), so würde ohne Parameter "/B" ebenfalls nur bis zu einem zufällig vorkommenden Dateiendezeichen kopiert und damit das Ergebnis unbrauchbar.
[Bearbeiten] Message-Ping
Mit Hilfe des folgenden Scripts kann man Windows um eine nützliche Funktionalität erweitern. Mit Hilfe von mping erhält man eine Nachricht, sobald der gepingte Computer wieder erreichbar ist.
Um das Script global zu verwenden, muss es z.B. als "mping.cmd" in "Windows-Installationsordner\System32" gespeichert werden und kann von nun an z.B. mit "mping google.com" aufgerufen werden.
Außerdem muß beim ausführenden und beim benachrichtigen Rechner der Nachrichtendienst aktiviert sein, was wegen der inzwischen üblichen Spam-belästigung aus dem Internet seit dem Servicepack 2 bei WinXP standardmäßig abgeschaltet wird.
@echo off :: wenn kein remote Host angegeben ist, dann gehe zu :Syntax IF [%1]==[] GOTO Syntax IF [%1]==[/?] GOTO Syntax IF [%1]==[/h] GOTO Syntax IF [%1]==[/help] GOTO Syntax :mainloop :: pinge den Host 1 mal und leite die Ausgabe nach 'nul' um (keine sichtbare Ausgabe) ping %1 -n 1 >nul :: speichere den Errorlevel in die Variable 'status' set status=%errorlevel% :: sende eine Nachricht an den lokalen Computer falls der remote Host online ist if %status%==0 (net send %computername% %1 online && exit 0) :: minimalistische Fortschrittsanzeige (Set /P i=.) < NUL :: sleep workaround (wer eine bessere, einfachere, genauere & universellere Möglichkeit kennt bitte korrigieren) :: pinge den lokalen Computer 10 mal ping localhost -n 10 >nul :: gehe zurück zum anfang goto mainloop :Syntax echo. echo Syntax: %~n0 [Hostname oder IP] echo. echo mping echo. echo Pingt einen offline Host und gibt eine Meldung echo aus, sobald er wieder online ist echo.
[Bearbeiten] Defrag mit Endlos-Schleife
Das eingebaute Defrag-Tool erlaubt ja immer nur die gleichzeitige Defragmentierung eines Laufwerks. Außerdem sind oftmals mehrere Durchgänge nötig, bis das Laufwerk wirklich vollständig defragmentiert ist. Mit dieser kleinen Batch Datei werden alle Partitionen immer wieder hintereinander defragmentiert. Ich starte dieses Skript hin und wieder, wenn ich gerade den Rechner nicht brauche. Wenn man wieder arbeiten will, kann man einfach das Eingabefenster schließen. Auch bei laufendem defrag passiert dabei nichts, weil defrag im Hintergrund die aktuelle Arbeit sauber beendet.
Damit aber nicht defekte Laufwerke einfach blind defragmentiert werden, habe ich eine etwas aufwendige Prozedur eingebaut, die die Laufwerke mit chkdsk erst überprüft. Wenn dabei ein Fehler auftritt, wird mit fsutil das dirty Bit gesetzt. Das bewirkt, dass beim nächsten Systemstart die Fehler behoben werden. Außerdem werden die Partitionen in dem loop ausgelassen, welche schon als dirty markiert sind.
Eine kleine Routine war auch nötig, damit Netzwerklaufwerke ausgelassen werden.
@echo off cd /d C:\ :loop for %%i in (c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do ( if exist %%i:\NUL call:defrag %%i ) echo. echo pause... ping localhost -n 10 >NUL goto loop :defrag call:check %1 if "%ok%"=="nein" ( echo Laufwerk %1: wird ausgelassen echo. goto:eof ) echo. echo. echo chkdsk %1: /v chkdsk %1: if %errorlevel% NEQ 0 ( if %errorlevel% NEQ 2 ( echo %1: chkdsk Fehler!!! echo Errorlevel: %errorlevel% echo. echo setzte dirty-Bit: fsutil dirty set %1: echo. echo Versuche Reparatur chkdsk %1: /v /x if %errorlevel% EQU 2 ( echo Fehler bereinigt! ) else ( echo Errorlevel: %errorlevel% echo. goto:eof ) ) ) echo defrag %1: -f defrag %1: -f if %errorlevel% NEQ 0 ( pause exit ) rem pause... ping localhost -n 1 >NUL goto:eof :check set ok=nein net use | find /i "%1:" >NUL if not errorlevel 1 ( echo %1: ist ein Netzlaufwerk goto:eof ) fsutil dirty query %1: for /F "tokens=5" %%f in ('fsutil dirty query %1:') do ( if not "%%f"=="NICHT" ( rem Laufwerk ist als fehlerhaft markiert goto:eof ) ) set ok=ja goto:eof
Als Alternative gibt es das Open Source Program JkDefrag, welches auch alle Laufwerke nacheinander defragmentiert.
[Bearbeiten] Dateiinformationen anzeigen
Dieses Batch-Skript zeigt Informationen über die Datei, die als Parameter übergeben wird, an. (so ist das Starten des Skript per Drag&Drop möglich)
@echo off echo Attribute...................: %~a1 echo Laufwerk....................: %~d1 echo kompletter Pfad.............: %~f1 echo Dateiname...................: %~n1 echo Ordnerpfad..................: %~p1 echo kompletter Pfad (kurze Form): %~s1 echo Aenderungsdatum.............: %~t1 echo Dateierweiterung............: %~x1 echo Dateigroesse................: %~z1 pause
Hinweis: Falls die Attribute des eigenen Batch-Skripts ausgelesen werden sollen, so muss der Parameter Null verwendet werden (Beispielsweise %~p0). Eine Kombination ist auch möglich, z.B: %~dp0 (Laufwerk + Pfad)
[Bearbeiten] Alle verfügbaren PCs im aktuellen Netzwerk suchen
Dieses Batch-Skript pingt alle IP-Adressen eines IP-Bereichs an und zeigt dann die PCs an, die verfügbar sind.
@echo off if exist ips.txt del ips.txt > nul echo Bitte geben Sie den ersten Teil der IP ein: set /p ip= for /L %%N IN (1, 1, 255) DO ( echo Die IP: %ip%%%N wird nun angepingt ping %ip%%%N -n 1 -w 1 | find "TTL" && echo %ip%%%N >> ips.txt ) cls type ips.txt pause >nul
Hinweis: Die Datei ips.txt wird nicht gelöscht, damit man sie für weitere Zwecke benutzen kann.
[Bearbeiten] Hosts Datei mit einem Aliasnamen und der aktuellen IP-Adresse aktualisieren
Häufig werden Webserver oder ähnliche Programme unter Angabe eines Aliasnamens installiert, damit sie leicht auf einen anderen Rechner verschoben werden können, falls der ursprüngliche Rechner defekt ist. Oder die Aplikationläuft unter VM-Ware auf einen Laptop bei dem sich die IP-Adressen häufig ändern. Dann kann mit dem Skript der Hostnamenalias mit der aktuellen IP-Adresse aktualisiert werden. Idealerweise wird das Script automatisch beim Start von Windows oder beim Anmelden des Anwenders ausgeführt.
@echo off set HOST_ALIAS=myserver myserver.mydomain.org set HOST_FILE=%SystemRoot%\System32\drivers\etc\hosts set TEMP_FILE=%TEMP%\hosts.tmp REM vorhandenen Eintrag entfernen und den Rest in TEMP-Datei schreiben type %HOST_FILE% | find /v "myserver" > %TEMP_FILE% REM Neuen Eintrag wieder hinzufügen for /F "tokens=15" %%i in ('ipconfig ^| find "IP Ad"') do set IP=%%i echo %IP% %HOST_ALIAS%>>%TEMP_FILE% echo ## Added %IP% %HOST_ALIAS% to the hostsfile REM Temp-File nach %SystemRoot%\System32\drivers\etc\hosts kopieren REM Die Datei Hosts darf nicht mit "move" verschoben werde, sondern muss kopiert werden, da sonst der Hostname nicht gefunden werden kann. copy /y %TEMP_FILE% %HOST_FILE% del /F /Q %TEMP_FILE%
[Bearbeiten] Windowsversion herausfinden
Mit dieser Batchdatei findet man heraus, welche Windowsversion verwendet wird. Das ist nützlich, wenn man mit bestimmten Pfaden arbeitet, die je nach Betriebsystem verschieden sind. Hier wird das Ergebnis mithilfe einer VBScript MsgBox ausgegeben.
@echo off VER |find /i "Windows 95" >NUL IF NOT ERRORLEVEL 1 GOTO 9598ME VER |find /i "Windows 98" >NUL IF NOT ERRORLEVEL 1 GOTO 9598ME VER |find /i "Windows Millennium" >NUL IF NOT ERRORLEVEL 1 GOTO 9598ME VER | find "XP" > nul IF %errorlevel% EQU 0 GOTO XP VER | find "2000" > nul IF %errorlevel% EQU 0 GOTO 2000 VER | find "NT" > nul IF %errorlevel% EQU 0 GOTO NT VER | find "Microsoft Windows [Version 6" > nul IF %errorlevel% EQU 0 GOTO Vista VER | find "Microsoft Windows [Version 5" > nul IF %errorlevel% EQU 0 GOTO 2003 goto unknown goto end :unknown echo MsgBox "Betriebsystem unbekannt", VbInformation + VbOKOnly, "Ihr Betriebsystem" >%TEMP%\os.vbs goto end :9598ME echo MsgBox "Sie haben 95, 98 oder ME", VbInformation + VbOKOnly, "Ihr Betriebsystem" >%TEMP%\os.vbs goto end :NT echo MsgBox "Sie haben Windows NT", VbInformation + VbOKOnly, "Ihr Betriebsystem" >%TEMP%\os.vbs goto end :2003 echo MsgBox "Sie haben Windows 2003", VbInformation + VbOKOnly, "Ihr Betriebsystem" >%TEMP%\os.vbs goto end :2000 echo MsgBox "Sie haben Windows 2000", VbInformation + VbOKOnly, "Ihr Betriebsystem" >%TEMP%\os.vbs goto end :XP echo MsgBox "Sie haben Windows XP", VbInformation + VbOKOnly, "Ihr Betriebsystem" >%TEMP%\os.vbs goto end :Vista echo MsgBox "Sie haben Windows Vista oder Windows 7 RC", VbInformation + VbOKOnly, "Ihr Betriebsystem" >%TEMP%\os.vbs goto end :end START %TEMP%\os.vbs
[Bearbeiten] Referenz
[Bearbeiten] Liste aller internen und externen Befehle (entspricht der Ausgabe des Befehls help unter Windows XP)
| ASSOC | Zeigt Dateierweiterungszuordnungen an bzw. ändert sie. |
| AT | Legt eine Zeit fest, zu der Befehle und Programme auf diesem Computer ausgeführt werden. |
| ATTRIB | Zeigt Dateiattribute an bzw. ändert sie. |
| BREAK | Schaltet die erweiterte Überprüfung für STRG+C ein bzw. aus. |
| CACLS | Zeigt Datei-ACLs (Access Control List) an bzw. ändert sie. |
| CALL | Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf. |
| CD | Zeigt den Namen des aktuellen Verzeichnisses an bzw. ändert diesen. |
| CHCP | Zeigt die aktive Codepagenummer an bzw. legt diese fest. |
| CHDIR | Zeigt den Namen des aktuellen Verzeichnisses an bzw. ändert diesen. |
| CHKDSK | Überprüft einen Datenträger und zeigt einen Statusbericht an. |
| CHKNTFS | Zeigt die Überprüfung des Datenträgers beim Start an bzw. verändert sie. |
| CLS | Löscht den Bildschirminhalt. |
| CMD | Startet eine neue Instanz des Windows-Befehlsinterpreters. |
| COLOR | Legt die Hintergrund- und Vordergrundfarben für die Konsole fest. |
| COMP | Vergleicht den Inhalt zweier Dateien oder Sätze von Dateien. |
| COMPACT | Zeigt die Komprimierung von Dateien auf NTFS-Partitionen an bzw. ändert diese. |
| CONVERT | Konvertiert FAT-Volumes in NTFS. Das aktuelle Laufwerk kann nicht konvertiert werden. |
| COPY | Kopiert eine oder mehrere Dateien an eine andere Stelle. |
| DATE | Zeigt das Datum an bzw. legt dieses fest. |
| DEL | Löscht eine oder mehrere Dateien. |
| DIR | Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf. |
| DISKCOMP | Vergleicht den Inhalt von zwei Disketten. |
| DISKCOPY | Kopiert den Inhalt von einer Diskette auf eine andere Diskette. |
| DOSKEY | Bearbeitet Befehlseingaben, ruft Windows-Befehle zurückt und erstellt Macros. |
| ECHO | Zeigt Meldungen an bzw. schaltet die Befehlsanzeige ein oder aus. |
| ENDLOCAL | Beendet den lokalen Gültigkeitsbereich von Umgebungsänderungen in einer Batchdatei. |
| ERASE | Löscht eine oder mehrere Dateien. |
| EXIT | Beendet das Programm CMD.EXE (Befehlsinterpreter). |
| FC | Vergleicht zwei oder mehr Sätze von Dateien und zeigt die Unterschiede an. |
| FIND | Sucht eine Zeichenkette in einer oder mehreren Datei(en). |
| FINDSTR | Sucht Zeichenketten in Dateien. |
| FOR | Führt einen angegebenen Befehl für jede Datei in einem Dateiensatz aus. |
| FORMAT | Formatiert einen Datenträger für die Verwendung mit Windows. |
| FTYPE | Zeigt die Dateitypen an, die bei den Zuordnungen für die entsprechenden Dateierweiterungen verwendet werden bzw. ändert sie. |
| GETMAC | Zeigt unter Windows XP SP2 die Mac-Adresse an. |
| GOTO | Setzt den Windows-Befehlsinterpreter auf eine markierte Zeile in einem Batchprogramm. |
| GRAFTABL | Ermöglicht Windows, Sonderzeichen im Grafikmodus anzuzeigen. |
| HELP | Zeigt Hilfeinformationen zu Windows-Befehlen an. |
| IF | Verarbeitet Ausdrücke in einer Batchdatei abhängig von Bedingungen. |
| LABEL | Erstellt, ändert oder löscht die Bezeichnung eines Volumes. |
| MD | Erstellt ein Verzeichnis |
| MKDIR | Erstellt ein Verzeichnis. |
| MODE | Konfiguriert ein Systemgerät. |
| MORE | Zeigt Ausgabe auf dem Bildschirm seitenweise an. |
| MOVE | Verschiebt ein oder mehrere Dateien von einem Verzeichnis in ein anderes. |
| PATH | Legt den Suchpfad für ausführbare Dateien fest oder zeigt diesen an. |
| PAUSE | Hält die Ausführung einer Batchdatei an und zeigt eine Meldung an. |
| POPD | Wechselt zu dem Verzeichnis, das durch PUSHD gespeichert wurde. |
| Druckt eine Textdatei. | |
| PROMPT | Ändert die Eingabeaufforderung. |
| PUSHD | Speichert das aktuelle Verzeichnis, und wechselt dann zu einem anderen Verzeichnis. |
| RD | Entfernt ein Verzeichnis. |
| RECOVER | Stellt lesbare Daten von einem beschädigten Datenträger wieder her. |
| REM | Leitet Kommentare in einer Batchdatei bzw. CONFIG.SYS ein. |
| REN | Benennt eine Datei bzw. Dateien um. |
| RENAME | Benennt eine Datei bzw. Dateien um. |
| REPLACE | Ersetzt Dateien. |
| RMDIR | Löscht ein Verzeichnis. |
| SET | Setzt oder löscht die Umgebungsvariablen bzw. zeigt sie an. |
| SETLOCAL | Beginnt den lokalen Gültigkeitsbereich von Umgebungsänderungen in einer Batchdatei. |
| SHIFT | Verändert die Position ersetzbarer Parameter in Batchdateien. |
| SORT | Sortiert die Eingabe. |
| START | Startet ein eigenes Fenster, um ein bestimmtes Programm oder einen Befehl auszuführen. |
| SUBST | Weist einem Pfad einen Laufwerksbuchstaben zu. |
| TIME | Zeigt die Systemzeit an bzw. legt sie fest. |
| TITLE | Legt den Fenstertitel für das Eingabeaufforderungsfenster fest. |
| TREE | Zeigt die Ordnerstruktur eines Laufwerks oder Pfads grafisch an. |
| TYPE | Zeigt den Inhalt einer Textdatei an. |
| VER | Zeigt die Windows-Version an. |
| VERIFY | Legt fest, ob überwacht werden soll, ob Dateien korrekt auf den Datenträger geschrieben werden. |
| VOL | Zeigt die Datenträgervolumebezeichnung und die Seriennummer an. |
| XCOPY | Kopiert Dateien und Verzeichnisbäume. |
[Bearbeiten] WebLinks
[Bearbeiten] Weblinks
- http://www.heise.de/ct/03/16/136/default.shtml c't 16/2003, S. 136: Windows-Befehlszeile
- http://www.ss64.com/nt/index.html NT/XP Batch Befehle (en)
- http://www.admini.de Umfangreiche Informationen über Batchprogrammierung unter NT/2000/XP
- http://www.fpschultze.de/ Batch Scripting Site mit vielen Beispielen
- http://www.sven-of-nine.de/?page=lchvsyzmwzmqrehb&cmd=0&subcmd=123 Umfangreiche Funktionssammlung für Batchprogrammierer
- http://www.knowware.de/?cat=6.1&book=batch
- http://download.knowware.de/batch.pdf Leicht verständliche Einführung
- http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/IEA2B510/CCONTENTS?SHELF=IEA2BK32&DN=SA22-7598-01&DT=20010626133938 englischsprachiges JCL Benutzerhandbuch
- http://www.plogmann.net/w/2/54/index.htm - Optionen des Befehls XCOPY
- http://www.antonis.de/dos/#download/ Diverse Beispielskripte
- http://www.easy-coding.de/shellscripting.html?s=5fb492fd4b515b0c880795a6a7d92ef5c4aed29c Forum über Shellscripting
- http://home.mnet-online.de/horst.muc/maind.htm Eine Sammlung von Zusatztools für Batch-Skripter
- http://www.axel-hahn.de/axel/page_compi/bat_index.htm Viele weitere Informationen und Tools zum Thema
- http://www.script-example.com/themen/Windows_Batch.php Batch Dateien erstellen für absolute Beginner
[Bearbeiten] Tutorials
- administrator.info/... - Tutorial Batch I
- administrator.info/... - Tutorial Batch II
- administrator.info/... - Tutorial Batch III
[Bearbeiten] Referenzen
- Microsoft Technet - Windows Server 2008 - Command Reference (en)
- Microsoft Technet - Windows Vista - Command-Line Tools Technical Reference (en)
- Microsoft Technet - Windows Server 2003 - Befehlszeilenreferenz (de)
- Microsoft Technet - Windows XP - Command-line reference A-Z (en)