• Offizieller Beitrag

    Batchdateien sind Dateien mit der Endung CMD oder BAT. Sie dienen dazu Befehle die über die Befehlszeile eingegeben werden können nacheinander ausführen zu lassen ohne sie händisch eingeben zu müssen.

    Beispiel

    Erstelle eine Datei Test.cmd
    Schreibe nachfolgenden Inhalt hinein.
    Führe die Datei durch doppelklick aus.

    Code
    c:
    cd\
    dir
    pause

    => Wechselt das Laufwerk nach C:
    => Wechselt in das Root-Verzeichnis
    => Listet alle Ordner und Dateien auf
    => Wartet auf druck einer beliebigen Taste

    Ergebnis

    • Offizieller Beitrag

    Befehle in Batch/DOS-Script-Dateien

    @ keine Anzeige der Zeile bei Batchausführung
    :: Bemerkungen
    :{Marke} Sprungmarke - {Marke} durch einen Namen ersetzen (z.B.: :Ende)
    call {Batch-Datei} andere Batchdatei aufrufen (z.B.: call x.cmd)
    call {Marke} Unterprogramm aufrufen - {Marke} durch einen Namen ersetzen (z.B.: call TuDas)
    call :marke Sprungmarke aufrufen (call :marke parameter)
    goto {Marke} Batch an Sprungmake fortführen lassen - {Marke} durch einen Namen ersetzen (z.B.: goto Ende)
    goto :EOF Unterprogramm beenden
    exit /B Beendet die Batchdatei (z.B.: exit /B)
    rem Bemerkungen
    | (pipe) Befehle verbinden (z.B.: type seitenweise.txt | more)
    & Befehlskette (z.B.: echo Hallo... & echo ...Welt)
    && Befehlskette wenn 1.erfolgreich (z.B.: copy t.txt t2.txt && echo ok)
    ^ nachfolgendes Zeichen als Zeichen ausgeben (z.B.: echo.^>)
    date /t Datum anzeigen [11.07.2015]
    %date:~6,4% Jahreszahl ausgeben (ab der 6.Position 4 Zeichen) [2015]
    %var:~2% Nicht die ersten 2 Zeichen der Variable %var% [12345] [345]
    %var:~0,2% Ersten 2 Zeichen der Variable %var% [12345] [12]
    %var:~-2% Die rechten 2 Zeichen der Variable %var% [12345] [5]
    color 1f Farbe setzen
    0=Sw 1=<Bl 2=<Gn 3=BlGn 4=<Rt 5=Lila 6=Ocker 7=>Grau 8=<Grau 9=Bl A=Gn B=Zyan C=Rt D=Magenta E=Ge F=Ws
    %1, %2, ...
    %~1, %~2, ...
    Übergabeparameter beim Scriptaufruf
    %1 = erster Parameter %2 = zweiter Parameter ...
    %~1=erster Parameter ohne " %~2=zweiter Parameter ohne " ...
    (z.B.: Batch.cmd "P1" "P2")
    [%1="P1" %2="P2"]
    [%1=P1 %2=P2]


    Erweiterte Parameter
    (fuer 0 setze man den jeweiligen Parameter 0=aktu.Datei, 1=1.Uebergabeparm., 2=2.Uebergabeparam., ... ein):

    %~dp0% LW-Buchstaben + Pfad aktuelle Batchdatei [C:\Pfad\]
    %~0% Anfuehrungszeichen (") werden entfernt [\Pfad\]
    %~f0% vollstaendige Pfadbezeichnung [C:\Pfad\DateiName.abc]
    %~d0% Laufwerkbuchstabe [C:]
    %~p0% Pfad (ohne Laufwerksbuchstabe) [\Pfad\]
    %~n0% Dateiname [DateiName.abc]
    %~x0% Dateinamenserweiterung [.abc]
    %~s0% Pfad mit kurzen Verz./DatNamen (8.3-Konv.) [C:\Pfad\DateiN~1.abc]
    %~a0% Dateiattribute [--a------]
    %~t0% Aenderungsdatum der Datei (Datum + Zeit) [29.06.2015 20:28]
    %~z0% Groesse der Datei [512]


    • Offizieller Beitrag

    Robocopy

    Robocopy ist ein mächtiges Kopierprogramm des Windows Betriebssystems

    Wichtige Parameter

    /L = Dateien auflisten => Testbetrieb Vorgang nur simulieren => kein Kopieren, Verschieben

    /NP = Kein Fortschritt - zeigen Sie nicht kopierte % an.
    /XC = Schliesst geaenderte Dateien aus
    /XO = Schliesst aeltere Dateien aus
    /XN = Schliesst neuere Dateien aus
    /XX = Schliesst zusaetzliche Dateien und Verzeichnisse (Extra Dateien) aus
    /XL = Schliesst einsame Dateien und Verzeichnisse (nicht vorhandene) aus
    /XF xx = spezielle Dateien ausschliessen
    /XD xx = spezielle Ordner ausschliessen
    /IS = Schliesst identische Dateien ein
    /IT = Schliesst optimierte Dateien ein
    /S = Unterverzeichnisse einschliessen
    /E = Leere Unterverzeichnisse einschliessen
    /XJ = Schliesst Abzweigungspunkte aus (normalerweise eingeschlossen) Endlosschleife
    /MAXAGE:YYYYMMDD = Dateien ausschliessen die aelter sind als
    /R:n = Zahl von Wiederholungen auf verlassenen Kopien: Standard ist 1 Million
    /W:n = Wartezeitzeit zwischen Wiederholungen: Standard 30 Sekunden
    /TEE = Gibt Daten in das Konsolenfenster und die Protokolldatei aus
    /MOV = Verschiebt Dateien (löscht Dateien nach dem Kopieren an der Quelle)
    /MOVE = Verschiebt Dateien UND Verzeichnisse (löscht sie nach dem Kopieren an der Quelle)
    /PURGE = Loescht Zieldateien/-verzeichnisse, die in der Quelle nicht mehr vorhanden sind
    /MIR = Spiegelt eine Verzeichnisstruktur (entspricht "/E" mit "/PURGE")


    Beispiele

    • Quelle inkl. Unterordner wird nach Ziel 1:1 (gespiegelt) übertragen
      robocopy "C:\Quelle" "C:\Ziel" "*.*" /S /MIR /TEE /NP /R:2 /W:2 /LOG+:C:\LOG\Log.log
    • Quelle inkl. Unterordner werden nach Ziel kopiert.
      - Neuere Dateien im Ziel werden ignorriert
      - Ordner C:\Quelle\Bilder wird ignoriert
      robocopy "C:\Quelle" "C:\Ziel" "*.*" /S /XO /TEE /NP /R:2 /W:2 /XD "C:\Quelle\Bilder" /LOG+:C:\LOG\Log.log
    • Quelle inkl. Unterordner werden nach Ziel kopiert.
      - Neuere Dateien im Ziel werden ignorriert
      - Alle Ordner "Bilder" werden ignoriert
      robocopy "C:\Quelle" "C:\Ziel" "*.*" /S /XO /TEE /NP /R:2 /W:2 /XD "Bilder" /LOG+:C:\LOG\Log.log

    Errorlevel

    0 Keine Dateien kopiert.
    Keine Fehler.
    Keine Dateien stimmen überein.
    Dateien sind bereits vorhanden.
    1 Alle Dateien erfolgreich kopiert.
    2 Keine Dateien kopiert.
    Das Zielverzeichnis enthält einige zusätzlichen Dateien, die nicht im Quellverzeichnis vorhanden sind.
    3 Einige Dateien wurden kopiert.
    Keine Fehler.
    5 Einige Dateien kopiert.
    Einige Dateien stimmen nicht überein.
    Keine Fehler.
    6 Zusätzliche Dateien und nicht übereinstimmenden Dateien vorhanden sind.
    Keine Dateien kopiert und keine Fehler aufgetreten, dies bedeutet, dass die Dateien im Zielverzeichnis vorhanden.
    7 Dateien kopiert, ein Dateikonflikt vorhanden.
    8 Einige Dateien wurden nicht kopiert.
    Ordner ausschliessen

    Mit /XD [Ordnername] können verschiedene Ordner ausgeschlossen werden

    robocopy "C:\Quelle" "C:\Ziel" "*.*" /S /E /XD "nichtKopieren"

    Alle Dateien bis auf die im Unterordner "nichtKopieren" werden kopiert. Sollte der Ordner mehrfach vorkommen, werden alle ignoriert

    robocopy "C:\Quelle" "C:\Ziel" "*.*" /S /E /XD "C:\Quelle\nichtKopieren"

    Alle Dateien bis auf den Unterordner "C:\Quelle\nichtKopieren" werden kopiert.

    • Offizieller Beitrag

    DIR

    Dateiliste anzeigen.

    Beispiele

    • Nur die Dateien eines Ordners mit Datum und Größe anzeigen

      Code
      dir | findstr /V "DIR" | findstr /V "Datei(en)" | findstr /V "Verzeichnis(se)"
      
      
      
      
       Datenträger in Laufwerk C: ist WIN
       Volumeseriennummer: 1234-5678
       Verzeichnis von C:\Temp
      01.23.2015  12:34             1.234 Datei.txt
      01.23.2015  12:34               123 Datei.inf
    • Alternative

      Code
      for /r %i in (*) do @echo %~ti %~zi %i
      
      
      
      
      01.23.2015 12:34 1234 C:\Temp\Datei.txt
      01.23.2015 12:34 123 C:\Temp\Datei.inf
    • Offizieller Beitrag

    Pushd, Popd

    PUSHD speichert ein Verzeichnis in einer Verzeichnisliste. Mit POPD können die gespeicherten Verzeichnisse nacheinander abgerufen werden.

    • Offizieller Beitrag

    if

    Variable nach einem Wert prüfen

    if <NOT> Variable1 <Operator> <Variable2>
    if ERRORLEVEL <Nr> if NOT ERRORLEVEL <Nr+1> <Kommando>

    Beim Vergleich Groß-/Kleinschreibung ignorrieren

    if /i "VERGLEICHSWERT" EQU "vergleichswert" @echo.Identisch

    Einfache Abfrage

    if 2 GTR 3 (@echo.Bedingung erfuellt) else (@echo."2 nicht >= 3")

    Achtung

    :: darf sich nicht zwischen () befinden

    Operatoren

    EQU == gleich
    NEQ nicht gleich
    LSS kleiner als
    LEQ kleiner als oder gleich
    GTR größer als
    GEQ größer als oder gleich

    Übergabeparameter prüfen

    Code
    :: ---------
    :: Wenn der erste Parameter beim Scriptauftruf NOPAUSE lautet erfolgt keine Pause im Script
    :: Aufruf: Console [Batchname] pause
    if /i .%1 NEQ .NoPause pause

    Errorlevel auswerten

    Wert einer Variable prüfen

    Länge eines Parameter ermitteln

    Code
    :: ----------
    :: Laenge des ersten Parameter ermitteln
    for /f delims^= %%i in (' cmd /u /von /c "echo %1"^|find /v ""^|findstr .^|find /c /v "" ') do set /a intLen = %%i
    
    :: ----------
    :: ermittelte Laenge auswerten
    if %intLen% GEQ 10 @echo Laenge groesser/gleich 10 Zeichen

    Auf Konsole ausprobieren: for /f delims^= %i in (' cmd /u /von /c "echo %sParam%"^|find /v ""^|findstr .^|find /c /v "" ') do set /a iStringlen = %i && echo. - Laenge des Textes %intLen% Zeichen

    • Offizieller Beitrag

    set

    Definiert oder löscht Variablen

    set [Variablenname] zeigt alle Variablen an die dem Variablenname entsprechen
    set [Variablenname]=[Wert] definiert eine Variable
    nach dem = sollte kein zusätzliches Leerzeichen definiert werden
    set Textvariable=Text
    set Zahlenvariable=1
    set [Variablenname]= löscht eine Variable
    set /P [Variablenname]= stellt eine Eingabe bereit und schreibe den Inhalt auf einer Variable
    set /P [Variablenname]=%Quelle% keinen Zeilenumbruch
    set /A [Variablenname]=[Wert]
    set /A [Variablenname]+=[Wert]
    set /A [Variablenname]-=[Wert]
    set /A [Variablenname]*=[Wert]
    set /A [Variablenname]/=[Wert]
    definiert eine Variable vom Typ Zahl
    addiert den Wert zur Variable
    subtrahiert den Wert zur Variable
    multipliziert den Wert zur Variable
    dividiert den Wert zur Variable

    Dynamische Variablen

    %CD% aktueller Verzeichnisname
    %DATE% aktuelles Datum, Format wie der DATE-Befehl
    %TIME% aktuelle Zeit, Format wie der TIME-Befehl
    %RANDOM% Zufallszahl zwischen 0 und 32767
    %ERRORLEVEL% ERRORLEVEL-Wert, wird gesetzt

    Teile einer Variable zurückgeben

    Mit %[Variablenname]:~[Anz.Zeichen]% können Teile einer Variable zurückgegeben werden

    %[Variablenname]:~[Anz.Zeichen]%

    %[Variablenname]:~[linke Grenze],[Anz.Zeichen]%

    %[Variablenname]:~[linke Grenze],-[rechte Grenze]%


    • Offizieller Beitrag

    COPY

    Mit COPY können Dateien kopiert werden

    Syntax

    COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B] Quelle [/A | /B]

    [+ Quelle [/A | /B] [+ ...]]

    [Ziel [/A | /B]]

    Quelle Bezeichnet die zu kopierende(n) Datei(en).

    /A Weist auf eine ASCII-Textdatei hin.

    /B Weist auf eine Binärdatei hin.

    /D Zieldatei kann entschlüsselt erstellt werden.

    Ziel Bezeichnet das Verzeichnis und/oder Dateinamen der neuen

    Datei(en).

    /V Überprüft, ob die Dateien richtig geschrieben wurden.

    /N Verwendet den Kurznamen (falls vorhanden), beim Kopieren

    einer Datei mit einem Nicht-8Punkt3-Namen.

    /Y Unterdrückt die Bestätigungsaufforderung beim Überschreiben

    vorhandener Zieldateien.

    /-Y Fordert beim Überschreiben vorhandener Zieldateien zum

    Bestätigen auf.

    /Z Kopiert Netzwerkdateien in einem Modus, der einen Neustart

    ermöglicht.

    /L Wenn die Quelle eine symbolische Verknüpfung ist, wird die

    Verknüpfung anstelle der eigentlichen Datei, auf die die

    Verknüpfung zeigt, zum Ziel kopiert.

    Die Option /Y ist möglicherweise in der Umgebungsvariablen COPYCMD

    voreingestellt. Dies wird durch /-Y auf der Befehlszeile überschrieben.

    Standardmäßig wird beim Überschreiben zum Bestätigen aufgefordert, außer

    wenn der COPY-Befehl innerhalb einer Batchdatei ausgeführt wird.

    Um Dateien aneinander zu hängen, geben Sie eine einzelne Datei als Ziel an,

    aber mehrere Dateien als Quelle (unter Verwendung von Platzhaltern oder

    in der Form: Datei1 + Datei2 + Datei3).

    Mehrere Dateien in eine zusammenfügen

    Mit dem Operator + oder * können mehrere Dateien selektiert werden und in eine Datei integriert werden.

    Code
    :: 2 Dateien in eine Datei zusammenfügen
    COPY Datei1.txt + Datei2.txt Zieldatei.txt
    
    :: Mehrere Dateien in eine Datei zusammenfügen
    COPY Datei*.txt Zieldatei.txt
    • Offizieller Beitrag

    TIMEOUT

    Wer eine kleine Pause in sein Script einbauen muss kann den BefehlTIMEOUT verwenden. Ähnlich wie SLEEP bei UNIX kann hier das Script eine für eine Zeit angehalten werden.

    Syntax

    Parameterliste:

    /T Zeitlimit Bestimmt die Wartezeit in Sekunden.

    Gültiger Bereich: -1 bis 99999 Sekunden.

    /NOBREAK Ignoriert gedrückte Tasten und wartet laut

    dem angegebenen Zeitraum.

    /? Zeigt diese Hilfe an.

    HINWEIS: Ein Zeitüberschreitungswert von -1 bedeutet, dass unendlich

    lang auf einen Hauptprozess gewartet wird.

    Beispiele:

    TIMEOUT /?

    TIMEOUT /T 10

    TIMEOUT /T 300 /NOBREAK

    TIMEOUT /T -1

    • Offizieller Beitrag

    RUNAS

    Mit RUNAS kann ein Programm unter einem anderen User, z.B. Administrator gestartet werden.

    Syntax

    Syntax von RUNAS:

    RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]

    /user:<Benutzername> Programm

    RUNAS [ [/noprofile | /profile] [/env] [/savecred] ]

    /smartcard [/user:<Benutzername>] Programm

    RUNAS /trustlevel:<Vertrauensstufe> Programm

    /noprofile Legt fest, dass das Benutzerprofil nicht geladen werden

    soll. Führt dazu, dass die Anwendung schneller geladen

    wird. Dies kann bei einigen Anwendungen zu Fehlern führen.

    /profile Legt fest, dass das Benutzerprofil geladen werden soll.

    Dies ist die Standardeinstellung.

    /env Verwendet die aktuelle Umgebung anstatt der des Benutzers.

    /netonly Falls Anmeldeinformationen nur für den Remotezugriff

    gültig sind.

    /savecred Verwendet Anmeldeinformationen, die von einem anderen

    /smartcard Falls Anmeldeinformationen von einer Smartcard zur

    Verfügung gestellt werden.

    /user <Benutzername> muss in der Form Benutzer@Domäne oder

    Domäne\Benutzer angegeben werden.

    /showtrustlevels Zeigt die Vertrauensstufen an, die als Argumente zu

    /trustlevel verwendet werden können.

    /trustlevel <Stufe> sollte eine der in /showtrustlevels aufgelisteten

    Stufen sein.

    Programm Befehlszeile einer ausführbaren Datei. Siehe unten

    aufgeführte Beispiele.

    Beispiele:

    > runas /noprofile /user:mymachine\administrator cmd

    > runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"

    > runas /env /user:Benutzer@Domäne.Microsoft.com "notepad \"Meine Datei.txt\""

    HINWEIS: Geben Sie das Benutzerkennwort nur ein, wenn Sie dazu aufgefordert

    werden.

    Hinweis: /profile ist nicht mit /netonly kompatibel.

    NOTE: /savecred ist mit /smartcard nicht kompatibel.

    Dies wird zum, Beispiel dazu benötigt, wenn man die Computerverwaltung öffnen möchte aber der angemeldete Benutzer keine Admin-Rechte besitzt. Natürlich kann ein Programm mit Rechtsklick auf das Icon als Administrator gestartet werden, aber mit einer Batch geht das eleganter.

    Durch cmd /c start wird die Fehlermeldung "RUNAS-FEHLER: ... kann nicht ausgeführt werden 740: Der angeforderte Vorgang erfordert erhöhte Rechte." umgangen. Um FireFox zu starten darf /noprofile nicht verwendet werden

    RUNAS ist eine EXE-Anwendung und befindet sich unter %windir%\system32\runas.exe

    • Offizieller Beitrag

    LEN

    LEN gibt es leider nicht als Befehl. Aber eine kleine Routine kann hier für Abhilfe sorgen

    • Offizieller Beitrag

    DATE, TIME

    date und time gibt das Datum und die Uhrzeit zurück.

    Per Script können verschiedene Formate auf Variablen geschrieben werden

    • Offizieller Beitrag

    STRING Manipulation

    Datums Manipulationen

    • Offizieller Beitrag

    FOR Schleife

    Mit FOR kann eine Schleife ausgeführt werden. Welche Art von Schleife bestimmt der 1. Parameter.

    Der Befehl besteht aus FOR {Art der Schleife} [Parameter] Variable IN (Satz) DO Befehl [Parameter]

    FOR = Befehl

    {Art der Schleife} = /D (Ordner) /R (Dateien) /L (Schleife) /F (Verschiedenes)

    [Parameter] = Parameter für die Schleife

    Bei der %Variable in einer CMD-/BAT-Datei muß ein weiteres % => %%Variable verwendet werden.

    /D

    Ordner verarbeiten:

    FOR /D %Variable IN (Satz) DO Befehl [Parameter]Listet alle Ordner auf die sich im aktuellen Ordner befinden. Wenn der Satz Platzhalter enthält, dann bezieht sich der FOR-Befehl auf Ordner und nicht auf Dateien.

    Beispiel - Liste aller Ordner im aktuellen Ordner auf

    Shell session
    for /D %%i in (*) do @echo.%%i
    • %%i wird in CMD-/BAT-Dateien verwendet, %i auf der Console

    Beispiel für die Console

    for /D %i in (*) do @echo.%i

    /R

    Dateien verarbeiten:

    FOR /R [[Laufwerk:]Pfad] %Variable IN (Satz) DO Befehl [Parameter]

    Der FOR-Befehl wird ausgehend vom Ordner [Laufwerk:]Pfad (als Stammordner) für jeden darunterliegenden Ordner ausgeführt. Wenn kein Ordner nach der /R-Option angegeben ist, wird der aktuelle Ordner verwendet. Wenn der Satz nur einen einzelnen Punkt als Zeichen (.) enthält, wird nur die Ordnerstruktur aufgelistet.

    Beispiel Anzahl Dateien in einem Verzeichnis ermittlen (Unterverzeichnisse werden NICHT berücksichtigt)

    Shell session
    set strPfad=C:\Test
    set strDateien=*.*
    set /A intAnz=0
    for /R "%strPfad%" %%i in ("%strDateien%") do @if /i "%%~dpi" == "%strPfad%\" @set /A intAnz+=1
    @if %intAnz% ==  0 @echo.Keine Dateien gefunden
    @if %intAnz% GTR 0 @echo.%intAnz% Dateien in %strPfad% gefunden
    • Zeile 1 definiert den Pfad in welchem Dateien gesucht werden
    • Zeile 2 definiert da gesuchte Dateimuster
    • Zeile 3 setzt die Zählvariable intAnz auf 0
    • Zeile 4 vor "do" geht die einzelnen Dateien in einem Ordner durch
      • for in () do sind feste Begriffe welche die einzelnen Bereiche trennt
      • "%strPfad%" = definiert den zu durchsuchenden Pfad. "" wird verwendet damit es auch mit Leerzeichen im Pfad funktioniert
      • %%i definiert die Variable auf welche die Dateinamen geschrieben werden (%i auf der cmd-Console verwenden)
      • ("%strDateien%") definiert das Dateisuchmuster. "" wird verwendet damit es auch mit Leerzeichen in den Dateinamen funktioniert
    • Zeile 4 nach "do" prüft ob die Datei sich im angegebenen Ordner befindet und zählt dann Zählvariable um 1 hoch
      • @if /i vergleicht 2 Inhalte und ignorriert Groß-/Kleinschreibung
      • %%~dpi gibt den Pfad der gefundenen Datei wieder
      • %strPfad%\ das nachfoldende \ ist zwingend notwendig
      • @set /A intAnz+=1 zählt die Zählvariable intAnz um 1 nach oben
    • Zeile 5 gibt einen Text aus wenn keine Dateien gefunden wurden
    • Zeile 6 gibt die Anzahl der gefundenen Dateien aus

    Beispiel für die Console

    for /R "C:\Temp\Test" %i in ("*.*") do @if /i "%~dpi" == "C:\Temp\Test\" @echo.%i

    /L

    Einfache Schleife:

    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 erstellt (1,1,5) die Folge 1 2 3 4 5 und (5,-1,1) erstellt die Folge (5 4 3 2 1).