Alle Windows-Kommandos

Liste der Windows-Kommandozeilentools - Kommandos und -Befehle unter MS Windows

Liste der Windows-eigenen Kommandos

for

Übersicht

Befehl
Kurzbeschreibung
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


Befehlfor
KurzbeschreibungFü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 zerlegen

Um 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öschen

Man 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 senden

Mit 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 holen

Zunä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 "Arbeitsstationsdom„ne"') 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:
  • Der erste Befehl könnte mehrere DNS-Server zurückgeben (wg. alternativen DNS-Servern als auch bei mehreren Netzwerkkarten) - beachte, dass per Default in der For-Schleife nur der letzte Wert zurückgeliefert wird. Mehr zu dieser Eigenheit erfährst du nach Eingabe "for /?" in der Kommandozeile.
  • Das Auffinden der Workgroup oder Domäne sucht nach einem deutschen String. Bei einem anderssprachigen Betriebssystem funktioniert dieser Aufruf schon nicht mehr.
  • regedit exportiert immer alle untergeordneten Schlüssel. Unter XP sollte man reg einsetzen:
    reg QUERY HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion /v ProductId

    Dies ist wesentlich schneller und einfacher zuschreiben (aber eben nicht kompatibel zu älteren Win-Versionen). Dieser Aufruf ermittelt den Ordner der History des IE (alles ist in eine Zeile zu schreiben):
    set regfolder="HKEY_CURRENT_USER&Software\Microsoft\Windows\CurrentVersion [BR]
      \Explorer\Shell Folders"
    For /F "tokens=3* delims=[tab_druecken]" %%i in [BR]
      ('reg QUERY %regfolder% /v "History" ^| findstr /i "History"')
    Do set HistoryDir=%%i

s.a. » echo » find » findstr » ipconfig » net config » reg » regedit » set » type

eine Textdatei parsen

Oft 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:
  • Kommentare sind Zeilen, die mit # beginnen
  • Trennzeichen in meiner Konfiguration ist das Pipe-Symbol: |

... 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 kennzeichnen

Den Status der Arbeitsgänge kann man mit Hilfe von Bildschirmfarben kennzeichnen, z.B.
  • schwarzer Hintergrund und dunkelgraue Schrift, wenn ein Prozess arbeitet
  • blauer Hintergrund und weisse Schrift, wenn eine Benutzerinteraktion erwartet wird
  • zum Abschluss: grüner Hintergrund = OK oder roter Hintergrund= Fehler
Gerade, wenn ein Prozess länger dauert (Defragmentieren der Festplatte oder ein längeres Backup), braucht man nicht immer ein geöffnetes cmd-Fenster. Mit Hilfe des Title-Kommandos kann vor Start einer Aktion der Titelzeile ein (hilfreicher) Text eingeblendet werden. Dann sieht man selbst bei verkleinertem cmd-Fenster in der Taskleiste, was gerade im Skript passiert.

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 stoppen

Fü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:
  • Zeile 30 holt bei Aufruf des Skripts den aktuellen Status - in :getStatus (Zeile 45) werden die laufenden Dienste ausgewertet
    • Zeile 49: Die Ausgabe von net start wird in eine tempöräre Datei geschrieben und enthält alle laufenden Dienste
    • In der Textdatei werden in einem For-Loop (Zeile 50) alle zu prüfenden Dienste mit findstr /c:[Text] gesucht (Zeile 56). Treffer und Nicht-Treffer werden in je einer Statusvariable (OneStopped, OneRunning) festgehalten. Der Status jedes unserer Dienste wird angezeigt.
  • Zeile 32: Wenn alle Dienste gestartet sind, werden sie in :startServices (Zeile 61) gestartet.
  • Zeile 33: Wenn alle Dienste gestoppt sind, werden sie in :startServices (Zeile 73) gestoppt.
@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


Übersicht