Datum in Batch-Dateien verarbeiten und Wochentag ermitteln

    Hin und wieder stellt sich das Problem, dass in Batchdateien Teile des aktuellen Datums benötigt werden, um sie in Zeichenketten zu verwenden. Das gängigste Beispiel dafür ist das Erzeugen von Dateinamen, etwa für Backups, so dass sich ihr Erstellungsdatum aus dem Namen ablesen lässt. Während sich die numerischen Informationen relativ einfach auslesen lassen, stoßen die die reinen Batch-Mittel bei der Ermittlung des Wochentags an ihre Grenzen.

    Das Datumsformat gilt systemweit und ist daher unabhängig davon, aus welcher Quelle man das Datum in Batch-Dateien bezieht. Zur Auswahl stehen je nach Problem, das es zu lösen gilt, der Aufruf von date /t oder die vorgegebene Umgebungsvariable %date%.

    Will man daraus Tag, Monat oder Jahr extrahieren, dann muss man sich beim Parsen des Datums darauf verlassen, dass auf allen PCs, auf denen die Batch-Datei laufen soll, die gleichen Ländereinstellungen gelten.

    Denn während beim deutschen Format (tt.mm.jjjj) an 2. Position der Monat steht, findet sich bei den US-Einstellungen (mm/tt/jjjj) dort der Tag.

    Systemunabhängiges Datumsformat erzeugen

    Hat man es mit verschiedenen Datumsformaten zu tun, dann besteht ein Ausweg darin, die Daten für Tag, Monat und Jahr über wmic auszulesen und selbst zu einem einheitlichen Datumsformat zusammenzufügen. Dies könnte in einer Batch-Datei so aussehen:

    set MYDATE=

    for /f "tokens=2,3,4 delims=," %%g in ('wmic path win32_localtime get day^,month^,year ^/format:csv^|findstr /i %COMPUTERNAME%') do (
    if %%h LSS 10 (set MYDATE=%%g.0%%h.%%i) else (set MYDATE=%%g.%%h.%%i)
    )

    In diesem Fragment werden in der Ausgabe von wmic die Spaltenüberschriften mit findstr ausgefiltert und dann in der for-Schleife die Werte an den Positionen 2,3 und 4 in die Umgebungsvariable MYDATE geschrieben. Die Fallunterscheidung im if/else-Statement dient dazu, den numerischen Werten der Monate Januar bis September eine Null voranzustellen.

    Datum mit SET in Tag, Monat und Jahr zerlegen

    Wenn man mit dem Inhalt der Umgebungsvariable %date% zufrieden ist und kein eigenes Format produzieren will, dann ist das Parsen des Datums mit Hilfe von SET relativ einfach. Voraussetzung ist allerdings, dass wie beim deutschen Datumsformat sowohl Tag als auch Monat 2-stellig sind, sonst wird es kompliziert. Der Tag, der Monat und das Jahr lassen sich beim vorgegebenen Kurzformat mit

    set day=%date:~0,2%
    set month=%date:~3,2%
    set year=%date:~6%

    auslesen.

    Wochentag ermitteln

    In zahlreichen Forenbeiträgen wird immer wieder danach gefragt, wie man in einer Batch-Datei den aktuellen Wochentag herausfinden kann. Und immer wieder folgt die Empfehlung, einfach die beiden ersten Zeichen von %date% bzw. date /t zu nehmen.

    Allerdings funktioniert diese Lösung seit XP nicht mehr, weil Microsoft nach Windows 2000 den Wochentag aus der Datumsausgabe entfernt hat. Man könnte diesen Zustand ändern und auf die alte Darstellung zurückkehren, indem man in der Systemsteuerung unter Region und Sprache das Format für Datum (kurz) auf TTTT, TT.MM.JJ ändert.

    Datumsformat (kurz) in der Systemsteuerung ändern

    Allerdings stellt sich die Frage, ob man solche systemweiten Einstellungen wegen einer Batch-Datei permanent verändern möchte.

    Die meisten Lösungen greifen daher auf eine Kombination aus Batch-Datei und einem vbs- oder Powershell-Script zurück, um dem System den Wochentag zu entlocken. Dieser Ansatz erfordert in der Regel jedoch zwei separate Dateien, wodurch sich die Fehleranfälligkeit erhöht.

    Eine Alternative bietet auch hier das WMI-Tool wmic, das den aktuellen Wochentag in numerischer Form liefert, die man in eine Zeichenkette konvertieren kann. Sie wird dann in der Variablen DOW gespeichert. Wie im obigen Beispiel ist es erforderlich, unerwünschten Output zu entfernen, in diesem Fall eine abschließende Leerzeile:

    set DOW=

    for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (
    set DOW=%%g)

    if %DOW%==0 set DOW=So
    if %DOW%==1 set DOW=Mo
    if %DOW%==2 set DOW=Di
    if %DOW%==3 set DOW=Mi
    if %DOW%==4 set DOW=Do
    if %DOW%==5 set DOW=Fr
    if %DOW%==6 set DOW=Sa

    Auch hier ist darauf zu achten, dass das Pipe-Symbol mit einem ^ maskiert werden muss.

    2 Kommentare

    Bild von Kurosama
    Kurosama sagt:
    16. Januar 2015 - 22:09

    Vielen Dank, das ganze klappt super!!

    Bild von Gregor Rößeler
    11. Januar 2019 - 12:20

    Perfekte Lösung!