Windows Batch: Uhrzeit und Datum verwenden (UPDATE: mit führender „0“ bei einstelligen Stunden)

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.

2 Replies to “Windows Batch: Uhrzeit und Datum verwenden (UPDATE: mit führender „0“ bei einstelligen Stunden)”

  1. In meinem Betrieb läuft 1x im Monat ein Backupprogramm
    und führt ein 1:1 Image von C: durch.
    Normalerweise wird der PC Nachts vom BIOS geweckt
    , das Backup gemacht und danach per Shutdownbefehl ausgeschaltet.
    Sollte das Wecken NICHT funktionieren, wird das Backup beim nächsten Einschalten nachgeholt.
    Da dies dann während der Arbeitszeit ist, darf der Rechner danach aber NICHT heruntergefahren werden.

    Ich benutze daher zumindest für die Uhrzeit folgende Abfrage:

    if %time:~0,2% geq 6 if %time:~3,2% geq 30 goto NICHTAUS
    if %time:~0,2% leq 16 if %time:~3,2% geq 30 goto NICHTAUS

    So wird erreicht, dass zwischen 06:30h und 16:30h
    der PC nach dem Backup an bleibt.

  2. Hallo David, „genau das brauche ich“…..
    Bin durch Zufall auf deinen Post gestoßen. Vielen Dank.

    Bei mir ist es so……..

    Mein Rechner fährt „täglich“ um 03:00 Uhr hoch und macht ein differentielles Backup.

    Gleichzeitig wird aber auch eine batch mit einer „fast-Echtzeit Synchronisierung“ ausgeführt, die mehrere Verzeichnisse alle 5 Minuten Synchronisiert, wenn ich am PC arbeite. Meiste zwischen 06:00 und 15:00 Uhr.
    Nun ist es so, dass diese „fast-Echtzeit Synchronisierung“ leider auch dann läuft, wenn der Rechner um 03:00 Uhr startet. In der Aufgabenplanung habe ich zwar vorgegeben, dass diese Batch nur laufen soll, wenn ein Benutzer angemeldet ist, aber die Logs sprechen eine andere Sprache……auch ab 03:00 wird fleißig alle 5 Minuten synchronisiert…….

    Soweit nicht weiter schlimm, könnte man meinen, aber genau diese „fast-Echtzeitsynchronisierung“ bremst mein Laufwerk (HDD) alle 5 Minuten so dermaßen aus, dass die „eigentliche Sicherung“ unnötig in die Länge gezogen wird.
    Ganz klar, Acronis will Daten schreiben und FreeFileSync will knapp 900.000 Dateien miteinander vergleichen………

    Deswegen wäre es super, wenn ich z.B. zwischen 03:00 und 04:00 diese „fast-Echtzeitsynchronisierung“ überspringen könnte.

    Ich bin kein Programmierer und muss mir deswegen alles was ich bzgl. Automatisierung haben will, mühsam zusammensuchen.
    Deswegen freut mich dein Post so dermaßen……….

    Nochmals Danke.

    Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.