Liste der Windows-eigenen Kommandos
for
BefehlKurzbeschreibung
Syntax
Beispiele
Dateinamen zerlegen
leere Verzeichnisse löschen
net send: an mehrere Benutzer dieselbe Nachricht senden
Ausgabe eines Befehls in eine Variable holen
eine Textdatei parsen
Status des cmd-Fensters mit Farbe und Titel kennzeichnen
VMWare-Services starten und stoppen
Befehl | for |
Kurzbeschreibung | Führt einen Befehl für jede einzelne Datei für einen Satz von Dateien aus. |
Syntax | Hinweis: Dies ist ein internes Kommando. Kommando zum Anzeigen der Hilfe: for /? Führt einen Befehl für jede einzelne Datei für einen Satz von Dateien aus. FOR %Variable IN (Satz) DO Befehl [Parameter] %Variable Ein ersetzbarer Parameter bestehend aus einem einzelnen Buchstaben. (Satz) Ein Satz von mindestens einer Datei. Platzhalter sind zulässig. Befehl Befehl, der für jede Datei ausgeführt werden soll. Parameter Parameter und Optionen für den angegebenen Befehl. Um den FOR-Befehl in einem Batchprogramm zu verwenden, geben Sie %%Variable statt %Variable an. Beachten Sie die Groß-/Kleinschreibung bei Variablen- namen, %i und %I sind nicht identisch. Wenn die Befehlserweiterungen aktiviert sind, werden folgende Ergänzungen für den FOR-Befehl unterstützt: FOR /D %Variable IN (Satz) DO Befehl [Parameter] Wenn der Satz Platzhalter enthält, dann bezieht sich der FOR-Befehl auf Verzeichnisse und nicht auf Dateien. FOR /R [[Laufwerk:]Pfad] %Variable IN (Satz) DO Befehl [Parameter] Der FOR-Befehl wird ausgehend vom Verzeichnis [Laufwerk:]Pfad (als Stammverzeichnis) für jedes darunterliegende Verzeichnis ausgeführt. Wenn kein Verzeichnis nach der /R-Option angegeben ist, wird das aktuelle Verzeichnis verwendet. Wenn der Satz nur einen einzelnen Punkt als Zeichen (.) enthält, wird nur die Verzeichnisstruktur aufgelistet. FOR /L %Variable IN (Start,Schritt,Ende) DO Befehl [Parameter] Der Satz ist eine Folge von Zahlen von Start bis Ende und der angegebenen Schrittweite. So erzeugt (1,1,5) die Folge 1 2 3 4 5 und (5,-1,1) erzeugt die Folge (5 4 3 2 1). FOR /F ["Optionen"] %Variable IN (Dateiensatz) DO Befehl [Parameter] FOR /F ["Optionen"] %Variable IN ("Zeichenkette") DO Befehl [Parameter] FOR /F ["Optionen"] %Variable IN (Befehl) DO Befehl [Parameter] oder, unter Verwendung der Option "usebackq": FOR /F ["Optionen"] %variable IN (Dateiensatz) DO Befehl [Parameter] FOR /F ["Optionen"] %variable IN ('Zeichenkette') DO Befehl [Parameter] FOR /F ["Optionen"] %variable IN (`Befehl`) DO Befehl [Parameter] Der Dateiensatz besteht aus einem oder mehreren Dateinamen. Jede Datei wird geöffnet, gelesen und bearbeitet, dann wird mit der nächsten Datei des Satzes fortgefahren. Die Bearbeitung einer Datei erfolgt zeilenweise, jede einzelne Textzeile wird ausgewertet und in die entsprechenden Token (keinen oder mehrere) zerlegt. Die Befehle in der FOR-Schleife werden dann mit den Variablenwerten (d.h. den gefunden Zeichenketten bzw. Token) aufgerufen. Standardmäßig liefert /F den ersten, durch ein Leerzeichen getrennten Token von jeder Zeile in jeder Datei. Leerzeilen werden übersprungen. Das standardmäßige Verhalten bei der Analyse kann wahlweise durch den Parameter "Optionen" überschrieben werden. Das ist eine Zeichenkette in Anführungszeichen, welche eines oder mehrere Schlüssel- wörter enthält, um verschiedene Parameter für die Analyse anzugeben. Diese Schlüsselwörter sind: eol=c - Gibt das Zeichen für Zeilenendekommentare an (nur eins). skip=n - Gibt die Anzahl der Zeilen an, die am Anfang einer Datei übersprungen werden. delims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen die Standardtrennzeichen TAB und Leerzeichen. tokens=x,y,m-n - Gibt an, welche Token von jeder Zeile an die FOR-Schleife weitergegeben werden. Das führt dazu, dass zusätzliche Variablen erzeugt werden. Mit der Form m-n wird dabei ein Bereich vom m-ten bis zum n-ten Token angegeben. Wenn das letzte Zeichen ein Sternchen ist, wird eine zusätzliche Variable deklariert, die den verbleibenden Text dieser Zeile enthält. usebackq - Gibt an, dass die neue Semantik in Kraft ist, wobei eine Zeichenkette in umgekehrten Anführungs- zeichen als Befehl ausgeführt wird und eine Zeichenkette in Anführungszeichen ein literaler Befehl ist, der die Verwendung von doppelten Anführungszeichen um Dateinamen in Dateinamens- sätzen erlaubt. Einige Beispiele: FOR /F "eol=; tokens=2,3* delims=, " %i in (Datei.txt) do @echo %i %j %k Dadurch wird jede Zeile in der Datei Datei.txt ausgewertet, Zeilen die mit einem Semikolon beginnen werden ignoriert, für den 2. und 3. Token jeder Zeile werden die Befehle in der FOR-Schleife ausgeführt. Trenn- zeichen sind Kommas und/oder Leerzeichen. In der FOR-Schleife wird der Ausdruck %i verwendet, um den 2. Token zu erhalten, %j für den 3. Token und %k, um alle übrigen Token zu erhalten. Dateinamen, die Leerzeichen enthalten, müssen Sie innerhalb doppelter Anführungszeichen angeben. Dazu müssen Sie die Option "usebackq" verwenden. Andernfalls werden doppelte Anführungszeichen zur Definition eines auszuwertenden Literals verwendet. Dabei ist %i explizit deklariert, während %j und %k implizit durch die Option "tokens=" deklariert werden. Sie können bis zu 26 Token durch diese Option angeben, vorausgesetzt, es wird dadurch nicht versucht, eine Variable mit einem Buchstaben größer als 'z' zu deklarieren. Bedachten Sie, dass FOR-Variablen aus nur einem Buchstaben bestehen, Groß-/Klein- schreibung beachtet werden muss, dass sie global sind und nicht mehr als insgesamt 52 gleichzeitig aktiv sein dürfen. Sie können den Befehl FOR /F auch direkt mit einer Zeichenkette verwenden, indem Sie die Zeichenkette in doppelten Anführungszeichen als Dateiensatz zwischen den Klammern angeben. Diese Zeichenkette wird dabei als einzelne Zeile einer Datei betrachtet und ausgewertet. Schließlich können Sie den Befehl FOR /F auch verwenden, um die Ausgabe eines Befehls auszuwerten. Dazu geben Sie eine Zeichenkette in einfachen Anführungszeichen als Dateiensatz zwischen den Klammern an. Diese Zeichenkette wird dabei als Befehlszeile betrachtet und von einer unter- geordneten CMD.EXE ausgeführt. Die Ausgabe dieses Befehls wird dann wie eine normale Datei ausgewertet. Das folgende Beispiel listet die Um- gebungsvariablen im aktuellen Verzeichnis auf: FOR /F " usebackq delims==" %i IN ((`set`) DO @echo %i Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert. Sie können jetzt folgende Syntax verwenden: %~I - Expandiert %I und entfernt alle umschließenden Anführungszeichen ("). %~fI - Expandiert %I zu einem vollständigen Dateinamen. %~dI - Erzeugt nur den Laufwerkbuchstaben von %I. %~pI - Erzeugt nur den Pfad von %I. %~nI - Erzeugt nur den Dateinamen von %I. %~xI - Erzeugt nur die Dateierweiterung von %I. %~sI - Erzeugter Pfad enthält nur kurze Dateinamen. %~aI - Erzeugt die Dateiattribute von %I. %~tI - Erzeugt Datum und Zeit von %I. %~zI - Erzeugt die Dateigröße von %I. %~$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen angegebenen Verzeichnisse und expandiert die erste gefundene Datei %I zu dem vollständigen Dateinamen. Wenn der Name der Umgebungsvariablen nicht definiert ist oder diese Datei bei der Suche nicht gefunden wurde, wird dieser Parameter zu einer leeren Zeichenkette expandiert. Diese Parameter können auch miteinander kombiniert werden: %~dpI - Erzeugt den Laufwerkbuchstaben und Pfad von %I. %~nxI - Erzeugt den Dateinamen und die Dateierweiterung von %I. %~fsI - Expandiert %I zu einem vollständigen Namen, der nur kurze Dateinamen enthält. %~dp$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen angegebenen Verzeichnisse nach %I und erzeugt den Laufwerkbuchstaben und Pfad der ersten gefundenen Datei. %~ftzaI - Expandiert %I zu einer Zeile, die der Ausgabe des DIR- Befehls entspricht. In den angegebenen Beispielen können %I und PATH durch andere gültige Werte ersetzt werden. Der Ausdruck %~ wird durch einen gültigen Variablen- namen für FOR abgeschlossen. Die Verwendung von Großbuchstaben für die Namen von Variablen, wie z.B. %I, macht diese Ausdrücke leichter lesbar und vermeidet Verwechslungen mit den eigentlichen Parametern. |
Beispiele | Dateinamen zerlegenUm einen kompletten Dateinamen - bestehend aus Laufwerk, Pfad und Dateinamen - in seine Bestandteile zu zerlegen, gibt es mit dem FOR einige Ersetzungsmöglichkeiten. Mit Hilfe der Ersetzungen kann man z.B. den Pfad, den Dateinamen und die Extension erhalten.Bei sonstigen Zeichenketten kann man mit den Optionen delims=[Trennzeichen] und tokens=[Nr.] arbeiten, um eine Zeichenkette zerlegen. In nachfolgendem Beispiel wird der Pfad der win.com im Windows-Verzeichnis zerlegt: set sFullname=%windir%\win.com for %%i in ("%sFullname%") do set sPATH=%%~di%%~pi for %%i in ("%sFullname%") do set sFILE=%%~ni%%~xi for /F "delims=. tokens=1" %%i in ("%sFILE%") do set sPart1=%%i for /F "delims=. tokens=2" %%i in ("%sFILE%") do set sPart2=%%i echo sFullname=%sFullname% echo sPATH=%sPATH% echo sFILE=%sFILE% echo sPart1=%sPart1% echo sPart2=%sPart2% s.a. » %0 » set leere Verzeichnisse löschenMan kann das RD-Kommando ansetzen und per Default nicht(!) rekursiv löschen. Der Fehlerkanal wird ins Nul-Device geleitet. Verzeichnisse, die gelöscht werden konnten, werden ausgegeben.Dann braucht man natürlich noch eine Liste der Verzeichnisse das geht mit rekursiv mit dir /s und Berücksichtigung der Dateiattribute. Damit tieferliegende Verzeichnisebenen zuerst durchsucht werden, drehen wir einfach die Sortierreihenfolge um. set startdir="d:\irgendwo\" FOR /F "tokens=* delims=" %%a in ('dir /AD /B /S "%startdir%" ^| sort /R' ) do ( RD "%%a" 2>nul && echo ^> %%a ) s.a. » dir » sort net send: an mehrere Benutzer dieselbe Nachricht sendenMit dem Kommando net send kann man an einen Benutzer (bzw. Rechnernamen) eine Nachricht senden. Auch eine bestimmte Nachricht an die ganze Domain abzsetzen, ist mit einem einzelnen Aufruf möglich. Möchte man an ausgewählte Benutzer/ Rechner eine Botschaft senden, sind mehrere Aufrufe von net send erforderlich.@echo off :: Liste der Empfaenger: set userlist=jana susi mary anna :: Hier die Nachricht eintragen: set sMsgText=Es gibt nun Kaffee und Kuchen fuer alle ... Euer Axel echo on for %%a in (%userlist%) do net send %%a %sMsgText% @echo off echo %0 beendet. pause s.a. » echo » net send » pause » set Ausgabe eines Befehls in eine Variable holenZunächst muss man wissen, in welchem Format die Ausgabe eines Kommandos daherkommt und wie man die gesamte Ausgabe nach der gewünschten Zeile filtern kann.Oft steht die gewünschte Information dann auch nicht allein in der Zeile - dann muss man noch die anderen Informationen ausblenden. Am einfachsten ist dies mit der FOR-Schleife zu bewerkstelligen. Mit den Parametern TOKENS und DELIMS lässt sich die Ausgabe effektiv beschneiden. Das Setzen der Variable erfolgt mit dem normalen SET Befehl. rem -- Beispiel 1 -- For /F "tokens=2 Delims=:" %%i in ('ipconfig /all^|Find /i "DNS"') Do [BR] @Set DNSSERVER=%%i echo DNSSERVER=%DNSSERVER% rem -- Beispiel 2 -- For /F "tokens=3" %%i in ('Net Config Workstation^|Find /i "Arbeitsstationsdomne"') Do [BR] @Set WORKGROUP=%%i echo WORKGROUP=%WORKGROUP% rem -- Beispiel 3 -- set sTMPFILE=%temp%\~test.tmp regedit /e %sTMPFILE% "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion" For /F "tokens=2 Delims==" %%a in ('type %sTMPFILE%^| find "ProductId"') do [BR] @set winSerial=%%a 2>nul del %sTMPFILE% echo Windows-Serial Number=%winSerial% so holt man den Wert aus der Registry in eine Variable - das funktioniert mit Hilfe der reg.exe, die XP beiliegt: Hinweise:
s.a. » echo » find » findstr » ipconfig » net config » reg » regedit » set » type eine Textdatei parsenOft ist es gut, wenn man Informationen aus einer Textdatei liest, statt in einer Batchdatei diese als Variablen abzulegen oder zigfach dieselbe Kommandofolge zu wiederholen. Anpassungen erfolgen dann in einer Konfigurationsdatei und derjenige, der die Anpassung macht, braucht nicht im Skript herumfuhrwerken.Um eine Textdatei zu parsen, brauchen wir eine Textdatei, aus der wir die Informationen auslesen wollen. Neben den auslesbaren Nutzdaten sollte man Kommentare verwenden können. Zu Demo verwende ich einmal die folgenden Konventionen:
... und so kann es aussehen: # ================================================== # DEMO-Konfiguration # Syntax: # Kuerzel | Anzeigename | zu startendes Programm # ================================================== E|Explorer|explorer.exe W|MS Write|write.exe P|MS Paint|paint.exe # -- ENDE Wenn man ein Menü darsellen möchte, braucht man jeweils das erste und zweite Feld aus fer Konfigurationsdatei. Das Parsen erfolgt mit Hilfe des findstr-Befehls. Die Kommentare kann man mit dem Parameter /v rauswerfen. Dies zeigt alle Zeilen exklusive die mit # am Zeilenanfang: type menu.txt | findstr /v "^#" Desweiteren müssen wir wissen, wie wir die überbleibenden Informationen anhand unseres Trenner-Symbols auseinandernehmen können. Dies geht mit Hilfe des For-Kommandos. Mit dem Parameter /F geben wir an, dass eine Kommandoausgabe geparst werden soll. Mit der Angabe delim wird das Trennzeichen angegeben. Innerhalb der Schleife kann man mit der angegebenen Variable auf den ersten Wert zugreifen; mit dem nächstfolgenden Buchstaben auf den zweiten Wert usw.: echo Programmauswahl: for /F "tokens=1,2 delims=|" %%a in ('type menu.txt ^| findstr /v "^#"') do ( echo Taste %%a ... %%b ) s.a. » echo » findstr Status des cmd-Fensters mit Farbe und Titel kennzeichnenDen Status der Arbeitsgänge kann man mit Hilfe von Bildschirmfarben kennzeichnen, z.B.
Das nachfolgende Beispiel-Skript durchsucht rekursiv die Laufwerke (entspr. Variable sDrive) nach Dateien und/ oder Ordnern nach einem regulären Ausdruck im Ordner- und Dateinamen. @echo off rem ------------------------------------------------------------ :: CONFIG rem ------------------------------------------------------------ set scriptname=Dateisuche :: zu durcsuchende Laufwerke set sDrives=C D E :: Farben set colWork=color 08 set colWait=color 17 rem ------------------------------------------------------------ :: MAIN rem ------------------------------------------------------------ %colWork% title %scriptname% echo xxxxx ORDNER/ DATEI-SUCHE xxxxx echo Dieses Skript sucht auf den Laufwerken %sDrives% echo Ordner und Dateinamen nach einem angegebenen Muster (Regex moeglich). %colWait% set /p dmuster=Dateimuster eingeben: if "%dmuster%"=="" exit %colWork% for %%d in (%sDrives%) do ( title %scriptname% - durchsuche %%d nach %dmuster% ... dir /s /b %%d:\ | findstr "%dmuster%" ) echo fertig. title %scriptname% - fertig. %colWait% pause && exit rem ------------------------------------------------------------ s.a. » color » dir » exit » if » pause » set » title VMWare-Services starten und stoppenFür VMWare Workstation oder den VMWare Player gibt es eine Reihe von Diensten, die man nicht permanent braucht. Eben nur dann, wenn man mit dem entspr. Tool arbeiten möchte.Nachfolgend eine Batchdatei, die eine handvoll Dienst für VMware prüft. Wenn die Services alle nicht laufen, werden sie nach Tastendruck gestartet. Und auch umgekehrt: wenn sie alle laufen, werden sie nach Tastendruck angehalten. Das Starten und Stoppen von Diensten erfordert Administrator-Rechte. Funktionsweise:
@echo off rem ====================================================================== :: :: VMWARE Service Switcher :: rem ---------------------------------------------------------------------- :: 2007-05-18 v1.0 axel hahn rem ====================================================================== rem ---------------------------------------------------------------------- :: CONFIG rem ---------------------------------------------------------------------- set lServices= set lServices=%lServices% "VMware Authorization Service" set lServices=%lServices% "VMware DHCP Service" set lServices=%lServices% "VMware NAT Service" set lServices=%lServices% "VMware Virtual Mount Manager Extended" set tmpfile=%temp%\services_.tmp rem ---------------------------------------------------------------------- :: MAIN rem ---------------------------------------------------------------------- color 08 echo. echo ===== VMWARE SERVICE SWITCHER ===== echo. call :getStatus rem echo OneStopped - %OneStopped% .. OneRunning - %OneRunning% if "%OneStopped%"=="N" goto stopServices if "%OneRunning%"=="N" goto startServices echo. color cf echo. echo --- CONFUSION: echo some services are running - some dont. echo. goto end rem ---------------------------------------------------------------------- :: SUBS rem ---------------------------------------------------------------------- :getStatus set OneStopped=N set OneRunning=N echo reading service state ... net start >"%tmpfile%" for %%a in (%lServices%) do call :checkService %%a del "%tmpfile%" echo. goto end2 :checkService findstr /c:%1 "%tmpfile%" >nul && ( echo YES: %1 is running && set OneRunning=Y && goto end2) echo NO: %1 is stopped && set OneStopped=Y goto end2 :startServices color 27 echo --- need to START services pause for %%a in (%lServices%) do ( echo ... starting %%a ... net start %%a ) call :getStatus goto end :stopServices color 17 echo --- need to STOP services pause for %%a in (%lServices%) do ( echo ... stopping %%a ... net stop %%a ) call :getStatus goto end rem ---------------------------------------------------------------------- :: END rem ---------------------------------------------------------------------- :end echo --- done pause :end2 rem ---------------------------------------------------------------------- :: EOF rem ---------------------------------------------------------------------- s.a. » call » net start » net stop |