Ich benötige im Alltag ab und an das aktuelle Datum und die Uhrzeit „zerlegt“ in einzelne Variablen, um zum Beispiel Dateien nach Zeit oder Datum abzuspeichern oder Logeinträge korrekt formatiert auszugeben. Das ist seit Windows XP zum Glück recht einfach, aber weil ich faul bin lege ich hier meine zu diesem Zweck erzeugten Substring-Scriptschnipsel ab – dann muss ich die paar Zeilen nicht immer neu tippen (und korrigieren).
Es gibt da auch ein Problem mit den führenden Nullen: Windows setzt die Zeitvariable %time%
nicht mit führenden Nullen, sondern in „Menschlich lesbar“.
Beispiel:
C:\>echo %time%
Ergibt ab 10Uhr: 11:02:18,04
C:\>echo %time%
Ergibt ab 24Uhr: _9:02:18,04 Hier ist ein Leerzeichen eingefügt, denn das Padding des Strings ist immer gleich breit.
Lösung
set YYYY=%date:~-4% set MM=%date:~-7,2% set DD=%date:~-10,2% set hr=%time:~0,2% if "%hr:~0,1%" == " " SET hr=0%hr:~1,1% set min=%time:~3,2% set sek=%time:~6,2%
Mit diesen Variablen würde eine Ausgabezeile zum Beispiel so aussehen:
echo Es ist heute der %DD%.%MM%.%YYYY% und wir haben die wundervolle Uhrzeit %hr%:%min%:%sek%
Mit führenden Nullen sieht das Ergebnis dann, korrekterweise, so aus:
Es ist heute der 24.12.2016 und wir haben die wundervolle Uhrzeit 01:04:37
Nicht das diese Zeile viel Sinn hätte, in der Praxis benötige ich beispielsweise eher so etwas:
zip –m -9 idslogs-%YYYY%%MM%%DD%.zip %1*.log
… das mir Dateien mit einem sinnvollen Namen (z.B. idslogs-20121203.zip) erstellt.
Wichtig zu wissen: Diese Zeilen legen die wichtigen Werte direkt in eigenen Variablen ab; die Zuordnung ist im Moment der Zuordnung statisch, was bedeutet das ein Wert sobald zugewiesen immer so bleibt und sich nicht mit fortschreitender Zeit ändert. Wenn die Werte aktualisiert werden sollen (beispielsweise zu beginn/ende eines Script) muss dieser Block wieder aufgerufen werden, etwa mit einer call: Anweisung dorthin.