Kleine Frage zu Batch - Uhrzeit-Variable
Hallo Administratoren,
ich bastel gerade an einem relativ aufwendigen Skript (für meine Batch-Kenntnisse sehr umfangreich) und habe ein kleines Problem mit Daten und Uhrzeiten.
Bsp.
ich habe 2 Werte:
2014-04-25T07:15:00
2014-04-25T09:45:00
Nun möchte ich die Werte zwischen den beiden Werten abbilden, im 15 Minuten-Takt:
also
2014-04-25T07:30:00
2014-04-25T07:45:00
2014-04-25T08:00:00
usw. bis 09:45:00
Mein Problem ist nun folgendes:
Da es sich hierbei nicht um Dezimalzahlen handelt, weiß ich nicht wie ich Batch sagen soll, bei 60min die Stunde um 1 zu erhöhen, z.B. beim Sprung von 7:45 Uhr auf 8:00 Uhr.
Ist es möglich, die Zahlen in einer Variablen mit "Uhrzeit"-Format oder ähnliches zu speichern und so weiterzurechnen?
Oder bleibt mir nur übrig, mit Dutzenden von Bedingungen diese Idee umzusetzen?
Grüße,
narthan
PS: die Zeiten lese ich aus einer INPUT.txt Datei.
ich bastel gerade an einem relativ aufwendigen Skript (für meine Batch-Kenntnisse sehr umfangreich) und habe ein kleines Problem mit Daten und Uhrzeiten.
Bsp.
ich habe 2 Werte:
2014-04-25T07:15:00
2014-04-25T09:45:00
Nun möchte ich die Werte zwischen den beiden Werten abbilden, im 15 Minuten-Takt:
also
2014-04-25T07:30:00
2014-04-25T07:45:00
2014-04-25T08:00:00
usw. bis 09:45:00
Mein Problem ist nun folgendes:
Da es sich hierbei nicht um Dezimalzahlen handelt, weiß ich nicht wie ich Batch sagen soll, bei 60min die Stunde um 1 zu erhöhen, z.B. beim Sprung von 7:45 Uhr auf 8:00 Uhr.
Ist es möglich, die Zahlen in einer Variablen mit "Uhrzeit"-Format oder ähnliches zu speichern und so weiterzurechnen?
Oder bleibt mir nur übrig, mit Dutzenden von Bedingungen diese Idee umzusetzen?
Grüße,
narthan
PS: die Zeiten lese ich aus einer INPUT.txt Datei.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 236438
Url: https://administrator.de/contentid/236438
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo narthan!
Lässt sich zur Not auch in Batch umsetzen, falls aber auch noch ein Übertrag auf den nächsten Tag zu berücksichtigen wäre, wird das eher ein Krampf ...
... daher würde ich in diesem Fall zu ein wenig (integriertem) VBS greifen - Beispiel:
Der Batch erstellt ein kleines VBScript, übergibt diesem Anfangs- und Endzeit und erhält zeilenweise als Ergebnis die gewünschte Liste. Falls die Endzeit nicht genau auf eine Viertelstunde fallen sollte (im Beispiel etwa Bis=25.04.2014T09:40:00), wird die letzte volle Viertelstunde (wäre 25.04.2014T09:30:00) vor der Endzeit und die Endzeit ausgegeben.
Je nachdem, ob Du nur die Gesamtliste benötigst oder jede Zeile einzeln noch weiter verarbeitet werden soll, kannst Du die Zeilen 9 oder 10 verwenden.
[Edit] Jetzt die richtige Version oben und als Nachtrag: Wenn sicher ist, dass Beginn- und Endedatum am gleichen Tag liegen, als Batch only etwa so:
[/Edit]
Grüße
bastla
Ist es möglich, die Zahlen in einer Variablen mit "Uhrzeit"-Format oder ähnliches zu speichern und so weiterzurechnen?
Neine - in CMD gibt es noch nicht mal Dezimalzahlen ...Lässt sich zur Not auch in Batch umsetzen, falls aber auch noch ein Übertrag auf den nächsten Tag zu berücksichtigen wäre, wird das eher ein Krampf ...
... daher würde ich in diesem Fall zu ein wenig (integriertem) VBS greifen - Beispiel:
@echo off & setlocal
set "Von=2014-04-25T07:15:00"
set "Bis=2014-04-25T09:45:00"
set "VBS=%temp%\ML.vbs"
>%VBS% echo Set a=WScript.Arguments:V=CDate(Replace(a(0),"T"," ")):B=CDate(Replace(a(1),"T"," "))
>>%VBS% echo For i=V To B-0.0001 Step (1/24*0.25):O=O^&FormatDateTime(i)^&vbCrLf:Next:O=O^&B:WScript.Echo Replace(O," ","T")
cscript //nologo %VBS% %Von% %Bis%
::for /f %%t in ('cscript //nologo %VBS% %Von% %Bis%') do echo #%%t#
del %VBS%
Je nachdem, ob Du nur die Gesamtliste benötigst oder jede Zeile einzeln noch weiter verarbeitet werden soll, kannst Du die Zeilen 9 oder 10 verwenden.
[Edit] Jetzt die richtige Version oben und als Nachtrag: Wenn sicher ist, dass Beginn- und Endedatum am gleichen Tag liegen, als Batch only etwa so:
@echo off & setlocal
set "Von=2014-04-25T07:15:00"
set "Bis=2014-04-25T09:45:00"
for /f "tokens=1-4 delims=T:" %%a in ("%Von%") do set "VonDatum=%%a" & set "VonStunde=1%%b" & set "VonMinute=1%%c" & set "VonSekunde=%%d"
echo %Von%
set "Timestamp="
:Loop
if #%Timestamp%# geq #%Bis%# goto :Next
set /a VonMinute+=15
if %VonMinute% geq 160 (
set /a VonStunde+=1
set /a VonMinute-=60
)
set "Timestamp=%VonDatum%T%VonStunde:~-2%:%VonMinute:~-2%:%VonSekunde%"
echo %Timestamp%
goto :Loop
:Next
echo hier geht's weiter
Grüße
bastla
Hallo!
Und wenn's etwas flexibler sein soll:
Wobei zwecks Rechengenauigkeit von der Endzeit 1 Sekunde abgezogen wird. Ansonsten erfasst die For-Schleife zwar alle Werte für den 15-Minutentakt, aber beispielsweise nicht beim 1-Minutentakt. D.h. Die Schleife läuft immer nur bis zur vorletzten Endzeit und die tatsächliche Endzeit wird anschließend angefügt...
Bleibt die Frage offen, ob das Datum auch mit Bindestriche ausgegeben werden soll, insofern müsste
durch
ersetzt werden
Grüße
spatzenhirn
Und wenn's etwas flexibler sein soll:
@echo off & setlocal
set "Von=25-04-2014T07:15:00"
set "Bis=25-04-2014T09:45:00"
set "Type=n" ::Interval: Jahr(y),Monat(m),Tag(d),Stunde(h),Minute(n),Sekunde(s)
set "Step=15" ::Schrittzahl
set "VBS=%temp%\ML.vbs"
>%VBS% echo Set a=WScript.Arguments:d1=CDate(Replace(a(0),"T"," ")):d2=CDate(Replace(a(1),"T"," "))
>>%VBS% echo For d=d1 To d2-DateAdd("s", 1, 0) Step DateAdd(a(2),a(3),0):s=s^&d^&vbCrLf:Next:WScript.Echo Replace(s^&d2," ","T")
cscript //nologo %VBS% %Von% %Bis% %Type% %Step%
::for /f %%t in ('cscript //nologo %VBS% %Von% %Bis% %Type% %Step%') do echo #%%t#
del %VBS%
Bleibt die Frage offen, ob das Datum auch mit Bindestriche ausgegeben werden soll, insofern müsste
WScript.Echo Replace(s^&d2," ","T")
WScript.Echo Replace(Replace(s^&d2," ","T"),".","-")
Grüße
spatzenhirn
Hallo bastla!
Habe ich doch gern getan
Grüße
spatzenhirn
Habe ich doch gern getan
Grüße
spatzenhirn
Hallo narthan!
Sehr schöner, wenn auch langer Code Was hälst Du von der Idee, die Anfangs- und Endzeiten in Minuten/Sekunden umzurechnen und dann immer die Minuten dazu zu addieren, bis die Endzeit erreicht ist. Die Zeit im hh:mm-Format erhälts Du ja dann wieder durch eine einfache Division...?
Grüße
spatzenhirn
Sehr schöner, wenn auch langer Code Was hälst Du von der Idee, die Anfangs- und Endzeiten in Minuten/Sekunden umzurechnen und dann immer die Minuten dazu zu addieren, bis die Endzeit erreicht ist. Die Zeit im hh:mm-Format erhälts Du ja dann wieder durch eine einfache Division...?
Grüße
spatzenhirn
Hallo narthan!
Abgesehen davon, dass ganz oben auch schon lange ein Batch-Ansatz zum Testen bereit steht:
Grüße
bastla
Abgesehen davon, dass ganz oben auch schon lange ein Batch-Ansatz zum Testen bereit steht:
Minuten-Wert: 285 (entspräche 4:45 Uhr - also x:y Uhr)
Nun teile ich diesen Wert durch 60 und erhalte 4,75 (im Kopf, da Batch lediglich 4 erhält...) - sprich die x Stunden.
OkNun teile ich diesen Wert durch 60 und erhalte 4,75 (im Kopf, da Batch lediglich 4 erhält...) - sprich die x Stunden.
Als nächstes müsste ich die 75 mit 0,6 multiplizieren, bzw die 0,75 mit 60 multiplizieren, um die Minuten zu erhalten (sprich die y).
Du könntest natürlich auch einfach 285 - 60 * Stunde rechnen ...Grüße
bastla
Hallo narthan!
Komplizierter würde es übrigens auch bei meinem Ansatz, wenn ein Übertrag auf den nächsten Tag nötig wäre, da dann ja auch der Monats- und Jahreswechsel (inkl Berücksichtigung von Schaltjahren) zum Tragen kämen (hatten wir zB hier schon mal).
Grüße
bastla
einmal in Zeile 5, warum muss hier vor %%b und %%c eine "1" stehen?
Damit wird dann aus zB 05 der Wert 105 - damit bleibt die führende Null erhalten bzw gehst Du dem Problem mit 08 oder 09 (werden wegen der Null als - ungültige - Oktalzahlen interpretiert) aus dem Weg.was bewirkt in Zeile 16 die ":~-2" in den beiden Variablen?
Dass nur die letzten beiden Stellen (und damit fällt die vorher hinzugefügte 1 wieder weg) verwendet werden - wiederum wegen der führenden Null; siehe dazu set /?
...müsste ich für die 160 (Minuten) immer manuell den Wert eintragen?
Da die 1 ja nur aus dem vorher beschriebenen Grund dabei ist, wird hier de facto nur mit 60 verglichen, um festzustellen, ob die nächste Stunde erreicht ist; der Wert 160 ist daher konstant und alles, was aus Deinem Code kommen muss sind %Von% und %Bis%, die ich zum Testen in den Zeilen 2 und 3 manuell gesetzt habe.Für Von und Bis kann ich die Werte ja einfach aus einer temporären Datei einlesen
Temporäre Dateien sind sehr oft in CMD nicht mehr nötig (unter MS-DOS sah es da anders aus) - Du kannst Werte direkt aus einer for /f
-Schleife (siehe zB meine Zeile 5) erhalten.Komplizierter würde es übrigens auch bei meinem Ansatz, wenn ein Übertrag auf den nächsten Tag nötig wäre, da dann ja auch der Monats- und Jahreswechsel (inkl Berücksichtigung von Schaltjahren) zum Tragen kämen (hatten wir zB hier schon mal).
Grüße
bastla