Alle Windows-Kommandos

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

Liste der Windows-eigenen Kommandos

set

Übersicht

Befehl
Kurzbeschreibung
Syntax
Beispiele
     Dateinamen zerlegen
     Sonderzeichen ersetzen
     net send: an mehrere Benutzer dieselbe Nachricht senden
     Ausgabe eines Befehls in eine Variable holen
     HTML-Ausgabe
     Status des cmd-Fensters mit Farbe und Titel kennzeichnen


Befehlset
KurzbeschreibungSetzt oder löscht Umgebungsvariablen für CMD.EXE, oder zeigt sie an.
Syntax
Hinweis: Dies ist ein internes Kommando. 
Kommando zum Anzeigen der Hilfe: set /? 

Setzt oder löscht Umgebungsvariablen für CMD.EXE, oder zeigt sie an.

SET [Variable=[Zeichenfolge]]

  Variable      Bezeichnet den Namen der Umgebungsvariablen.
  Zeichenfolge  Eine Zeichenfolge, die der Variable zugewiesen werden soll.

Der Befehl SET ohne Parameter zeigt die aktuellen Umgebungsvariablen an.

Wenn die Befehlserweiterungen aktiviert sind, wird SET folgendermaßen
verändert:

Wenn der SET-Befehl mit nur einem Variablennamen aufgerufen wird, d.h.
ohne Gleichheitszeichen oder einem anderen Wert, wird der Inhalt aller 
Variablen angezeigt, deren Namen mit eben diesem Buchstaben beginnen. So
werden durch

    SET P

alle Variablen angezeigt, die mit dem Buchstaben 'P' beginnen.

Der SET-Befehl legt den ERRORLEVEL mit 1 fest, wenn der Variablenname nicht
in der aktuellen Umgebung gefunden wird.

Der SET-Befehl erlaubt kein Gleichheitszeichen als Bestandteil eines
Variablennamens.

Dem SET-Befehl wurden zwei neue Optionen hinzugefügt:

    SET /A Ausdruck
    SET /P Variable=[EingabeaufforderungZeichenfolge]

Die /A-Option gibt an, dass die Zeichenfolge rechts vom Gleichheitszeichen
ein nummerischer Ausdruck ist, der ausgewertet wird. Das Auswertungsprogramm
des Ausdrucks unterstützt dabei die folgenden Vorgänge, entsprechend ihrer
Anordnung mit abnehmendem Vorrang:

    ()                  - Gruppierung
    ! ~ -               - monäre Operatoren
    * / %              - arithmetische Operatoren
    + -                 - arithmetische Operatoren
    << >>               - logische Verschiebung
    &                   - bitweise UND
    ^                   - bitweise exklusives ODER
    |                   - bitweise ODER
    = *= /= %= += -=    - Zuordnung
    &= ^= |= <<= >>=
    ,                   - Trennzeichen für Ausdrücke

Wenn Sie einen der arithmetischen oder Moduloperatoren verwenden, müssen
Sie die Zeichenfolge für den Ausdruck in Anführungszeichen setzen. Alle
nicht-nummerischen Zeichenfolgen im Ausdruck werden als Zeichenfolgen von
Umgebungsvariablen behandelt, deren Werte vor der Verwendung in Zahlen
konvertiert werden. Wenn eine Umgebungsvariable angegeben wird, die nicht
definiert ist, wird für diese der Wert Null verwendet. Somit können Sie
mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben,
um deren Werte zu erhalten. Wenn der Befehl SET /A von der Befehlszeile,
d.h. außerhalb eines Befehlsskripts ausgeführt wird, dann zeigt er
den endgültigen Wert des Ausdrucks an. Der Zuordnungsoperator erfordert
eine Umgebungsvariable auf der linken Seite des Operators. Nummerische Werte
stellen immer Dezimalzahlen dar, es sei denn, sie haben ein Präfix 0x für
hexadezimale Zahlen, 0b für binäre Zahlen oder 0 für oktale Zahlen. Damit
stellt 0x12 dieselbe Zahl wie 18 oder 022 dar. Beachten Sie, dass die oktale
Schreibweise verwirrend sein kann: So sind 08 und 09 keine gültigen Zahlen,
da 8 und 9 keine erlaubten oktalen Ziffern sind.

Die Option /P ermöglicht es, einer Variablen eine Eingabezeile des Benutzers
zuzuweisen und zeigt die angegebene Eingabeaufforderung an, bevor die
Eingabezeile gelesen wird. Die Eingabeaufforderung kann leer sein.

Das Ersetzen von Umgebungsvariablen wurde folgendermaßen erweitert:

    %PATH:str1=str2%

Dies erweitert die PATH-Umgebungsvariable, wobei jede Instanz von "str1" im
erweiterten Ergebnis mit "str2" ersetzt wird. "str2" kann die leere
Zeichenfolge sein, um alle Instanzen von "str1" aus der erweiterten Ausgabe zu
löschen. Wenn "str1" mit einem Sternchen beginnt, steht "str1" für alles
zwischen dem Anfang der erweiterten Ausgabe bis zum ersten Auftreten des
übrigen Abschnitts von "str1".

    %PATH:~10,5%

Dies erweitert die PATH-Umgebungsvariable und verwendet dann nur fünf
Zeichen ab dem elften Zeichen (Offset=10) des erweiterten Ergebnisses. Wenn die
Länge nicht angegeben ist, wird der Rest des Variablenwerts verwendet.
Wenn eine der Zahlen (Offset oder Länge) negativ ist, dann wird der angegebene
Wert der Länge des Umgebungsvariablenwerts hinzugefügt.

    %PATH:~-10%

extrahiert die letzten 10 Zeichen der Variable PATH.

    %PATH:~0,-2%

extrahiert alle, außer den letzten 2, Zeichen der Variable PATH.

Die Unterstützung der verzögerten Erweiterung von Umgebungsvariablen wurde
hinzugefügt. Standardmäßig ist sie deaktiviert. Sie kann mit der
Befehlszeilenoption /V von CMD.EXE aktiviert/deaktiviert werden.
Siehe CMD /?

Die verzögerte Erweiterung von Variablen verbessert die Möglichkeiten der
Variablenerweiterung. Bisher wurden die Variablen beim Lesen des Texts, und
nicht bei dessen Ausführung, erweitert. Das folgende Beispiel zeigt ein
Problem, das dabei auftritt:

    set VAR=vorher
    if "%VAR%" == "vorher" (
        set VAR=nachher;
        if "%VAR%" == "nachher" @echo Es funktioniert!
    )

Die Meldung würde nie angezeigt, weil %VAR% in beiden IF-Befehlen
beim Lesen des ersten IF-Befehls erweitert wird, weil es logisch zu diesem
gehört. Daher vergleicht der zweite IF-Befehl "vorher" mit "nachher" was nie
gleich sein kann. Auch das folgende Beispiel funktioniert nicht wie erwartet:

    set LISTE=
    for %i in (*) do set LISTE=%LISTE% %i
    echo %LISTE%

Es wird KEINE Liste der Dateien im aktuellen Verzeichnis erstellt, stattdessen
erhält LISTE den Namen der letzten Datei als Wert. Dies ist der Fall, weil
%LISTE% nur einmal beim Lesen des IF-Befehls erweitert wird. Zu diesem
Zeitpunkt ist LISTE leer.
Die FOR-Schleife, die tatsächlich ausgeführt wird, lautet:

    for %i in (*) do set LISTE= %i

Hiermit wird der Variablen LISTE immer wieder der letzte Dateiname
zugewiesen.
 
Die verzögerte Erweiterung von Umgebungsvariablen erlaubt es, eine
Umgebungsvariable, unter Verwendung eines weiteren Zeichens (dem
Ausrufezeichen), zur Laufzeit zu erweitern. Mit aktivierter verzögerter
Erweiterung von Umgebungsvariablen können obige Beispiele wie folgt geschrieben
werden:

    set VAR=vorher
    if "%VAR%" == "vorher" (
        set VAR=nachher
        if "!VAR!" == "nachher" @echo Es funktioniert!
    )

    set LISTE=
    for %i in (*) do set LISTE=!LISTE! %i
    echo %LISTE%

Wenn die Befehlserweiterungen aktiviert sind, gibt es mehrere dynamische
Umgebungsvariablen, die zwar erweiterungsfähig sind, aber nicht in der Liste
von Variablen auftauchen, die mit SET angezeigt werden. Diese Variablenwerte
werden bei jeder Werterweiterung der Variable dynamisch berechnet. Falls eine
Variable mit einem dieser Namen definiert wird, dann überschreibt diese
Definition die unten stehende dynamische Definition:

%CD% - expandiert zum aktuellen Verzeichnisnamen.

%DATE% - expandiert zum aktuellen Datum unter Verwendung desselben Formats
    wie der DATE-Befehl.

%TIME% - expandiert zur aktuellen Zeit unter Verwendung desselben Formats
    wie der TIME-Befehl.

%RANDOM% - expandiert zu einer zufällig gewählten Dezimalzahl
    zwischen 0 und 32767.

%ERRORLEVEL% - expandiert zum aktuellen ERRORLEVEL-Wert.

%CMDEXTVERSION% - expandiert zur Versionsnummer der aktuellen Erweiterungen
    für den Befehlsinterpreter.

%CMDCMDLINE% - expandiert zur ursprünglichen Befehlszeile, die den
    Befehlsinterpreter aufgerufen hat.
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 » for

Sonderzeichen ersetzen

Für eine Batchdatei, die Screenshots von Webseiten erstellt, habe ich den Ausgabedateinamen anhand der URL erzeugt. Dabei muss man für Dateinamen ungültige Zeichen aus der URL bereinigen - ich habe sie wie folgt durch einen Unterstrich erstetzt: Eine Variable search nimmt alle Sonderzeichen auf, die ersetzt werden sollen. Über diese Liste von Zeichen wird mit einer For-Schleife geloopt und die Variable mit dem Dateinamen der Ausgabedatei myfile zeichzenweise ersetzt.

(...)

:: Ausgabeverzeichnis
set outdir=...
(...)

:capture
set "myurl=%~1"
set "myfile=%~1"

SETLOCAL EnableDelayedExpansion
SET "search=: / . ? & = % "

for %%s in (!search!) do (
	SET "myfile=!myfile:%%~s=_!"
)
set myfile=%myfile%.png

:: Bildschirmfoto erstellen
IECapt --url="%myurl%" --out="%outdir%\%myfile%" --min-width=1200 --max-wait=5000

s.a. » setlocal

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 » for » net send » pause

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 » for » ipconfig » net config » reg » regedit » type

HTML-Ausgabe

Die Zeichen < und > haben in einer Batchdatei Ein- und Ausgabefunktionen. Der ganze "Trick" für eine HTML-Ausgabe besteht darin, diese Zeichen zu maskieren, damit man sie in die Ausgabe schreiben kann:

rem -- Ausgabedatei
set htmlout=%temp%\logfile.html

rem -- HTML generieren
echo ^<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"^> >%htmlout%
echo ^<HTML^>^<HEAD^>						>>%htmlout%
echo ^<TITLE^>HTML-Ausgabe-Test^</TITLE^>			>>%htmlout%
echo ^</HEAD^>^<BODY^>						>>%htmlout%
echo ^<H1^>HTML-Test^</H1^>					>>%htmlout%
date /t								>>%htmlout%
time /t								>>%htmlout%
echo ^<HR /^>							>>%htmlout%
echo Hello world.^<HR /^> 					>>%htmlout%
echo ^</BODY^>^</HTML^> 					>>%htmlout%

rem -- Browser starten
start %htmlout%

s.a. » echo » start

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 » for » if » pause » title


Übersicht