Tags: Kommandozeile, Scripts, Datum
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.
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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
Weitere Links
5 Kommentare
Vielen Dank, das ganze klappt super!!
Perfekte Lösung!
Auch bei mir hat das Script hervorragend funktioniert! Vielen Dank dafür!
Funktioniert einwandfrei ! Vielen Danke !
Das "Systemunabhängige Datum" ist aber arg kompliziert. Wie wäre es mit:
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
echo %datetime:~0,4%%datetime:~4,2%%datetime:~6,2%