narthan
Goto Top

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.

Content-Key: 236438

Url: https://administrator.de/contentid/236438

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: bastla
Lösung bastla 25.04.2014, aktualisiert am 29.04.2014 um 14:55:59 Uhr
Goto Top
Hallo narthan!
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%
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:
@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  
[/Edit]

Grüße
bastla
Mitglied: 115420
Lösung 115420 26.04.2014, aktualisiert am 29.04.2014 um 14:56:01 Uhr
Goto Top
Hallo!

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%
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
WScript.Echo Replace(s^&d2," ","T")  
durch
WScript.Echo Replace(Replace(s^&d2," ","T"),".","-")  
ersetzt werden


Grüße
spatzenhirn
Mitglied: bastla
bastla 26.04.2014 um 13:07:52 Uhr
Goto Top
Hallo spatzenhirn!

Danke für's Ergänzen / den Ausbau zur Luxusvariante ... face-smile

Grüße
bastla
Mitglied: 115420
115420 26.04.2014 um 13:47:05 Uhr
Goto Top
Hallo bastla!

Habe ich doch gern getanface-smile

Grüße
spatzenhirn
Mitglied: narthan
narthan 29.04.2014 um 14:59:34 Uhr
Goto Top
Hallo bastla (dachte mir schon im Vorhinein, dass DU mir hier ganz sicher weiterhelfen kannst ;) ) und spatzenhirn!

Danke euch beiden!
Tut mir leid dass ich erst heute antworte, war aber über das Wochenende auf einer Dienstreise. Hab es nun allerdings auch schon anders gelöst mit Batch und es funktioniert (hatte viel Zeit auf der Dienstreise... face-smile ).
Habe eure Varianten allerdings auch getestet und lief auch astrein damit, daher, herzlichen Dank! face-smile

Grüße, narthan
Mitglied: bastla
bastla 29.04.2014 aktualisiert um 21:59:08 Uhr
Goto Top
Hallo narthan!

Danke für den Vertrauensvorschuss. face-smile

Magst Du zur Abrundung des Threads noch Deine Lösung reinstellen?

Grüße
bastla
Mitglied: narthan
narthan 29.04.2014 um 22:00:58 Uhr
Goto Top
Nabend bastla!

Na klar, mach ich sofort morgen wenn ich wieder am PC bin face-smile
Aber habs wohl sehr umständlich gemacht, als kleine Warnung voraus.

Grüße, narthan
Mitglied: narthan
narthan 30.04.2014 um 18:15:18 Uhr
Goto Top
So jetzt hab ich Zeit:
Ist ziemlich lang und unübersichtlich, sry schonmal dafür.
Mein input Datei sieht in etwa wie folgt aus:

123123#Name#234234#typ1#2013-10-27T19:30:00#200#2013-10-27T20:45:00#550

Zur Erklärung:
1.Zahl und 3.Zahl sind einfach nur Identifikationsnummern bzw. Kennziffer bzgl. des Namens
typ1 ist ein Status
darauf folgt -Datum "T" Uhrzeit- (wobei das T außer Acht gelassen werden kann, keine Bedeutung)
die 200 ist der Startwert, 550 am Zeilenende der Endwert

ein Teil des Codes folgt hier:

::die %outputXYZ% Variablen sind temporäre Textdateien zur Zwischenspeicherung

::Uhrzeit 1 Selektion (START)
FOR /f "tokens=5 delims=#" %%a IN ('findstr /n $ %input%') DO @(  
FOR /l %%z IN (1,1,1) DO ECHO %%a > %output2%
)
::Startwert Selektion
FOR /f "tokens=6 delims=#" %%a IN ('findstr /n $ %input%') DO @(  
FOR /l %%z IN (1,1,1) DO ECHO %%a > %output3%
)
::Uhrzeit 2 Selektion (ENDE)
FOR /f "tokens=7 delims=#" %%a IN ('findstr /n $ %input%') DO @(  
FOR /l %%z IN (1,1,1) DO ECHO %%a >> %output4%
)
::Endwert Selektion
FOR /f "tokens=8 delims=#" %%a IN ('findstr /n $ %input%') DO @(  
FOR /l %%z IN (1,1,1) DO ECHO %%la> %output5%
)

::Aufteilung Uhrzeit in Minuten und Stunden
FOR /f "tokens=2 delims=T" %%a IN (%output2%) DO ECHO %%a > %output2%  
FOR /f "tokens=1 delims=:" %%a IN (%output2%) DO SET "WertHour1=%%a"  
FOR /f "tokens=2 delims=:" %%a IN (%output2%) DO SET "WertMin1=%%a"  

::Batch rechnet mit Oktalwerten, 08 muss zB. in 8 umgewandelt werden, sonst kommt es zu Problemen bei Rechnungen

IF [08]==[%WertHour1%] SET /a WertHour1=8
IF [09]==[%WertHour1%] SET /a WertHour1=9
IF [18]==[%WertHour1%] SET /a WertHour1=18
IF [19]==[%WertHour1%] SET /a WertHour1=19

SET /a SummeMin1= %WertHour1% * 60 + %WertMin1%

FOR /f "tokens=2 delims=T" %%a IN (%output4%) DO ECHO %%a > %output4%  
FOR /f "tokens=1 delims=:" %%a IN (%output4%) DO SET "WertHour2=%%a"  
FOR /f "tokens=2 delims=:" %%a IN (%output4%) DO SET "WertMin2=%%a"  
IF [08]==[%WertHour2%] SET /a  WertHour2=8
IF [09]==[%WertHour2%] SET /a WertHour2=9
SET /a SummeMin2= %WertHour2% * 60 + %WertMin2%

::DIFFERENZ der beiden ZEITWERTE in MINUTEN berechnen und ANZAHL der 15min-Werte ausrechnen
SET /a Differenz= %SummeMin2% - %SummeMin1%
SET /a Anzahl= %Differenz% / 15

::DIFFERENZ zwischen Start- und Endwert ermitteln und durch die ANZAHL teilen (das Ergebnis ist also der Durchschnitt)
FOR /f %%a IN (%output5%) DO SET "ZW2=%%a"  
FOR /f %%a IN (%output3%) DO SET "ZW1=%%a"  
IF [08]==[%ZW2%] SET /a ZW2=8
IF [09]==[%ZW2%] SET /a ZW2=9
IF [08]==[%ZW1%] SET /a ZW1=8
IF [09]==[%ZW1%] SET /a ZW1=9
SET /a DifferenzZW= %ZW2% - %ZW1%
SET /a Durchschnitt=%DifferenzZW% / %Anzahl%
ECHO %DifferenzZW% >> %ergebnis%
ECHO %Durchschnitt% >> %ergebnis%

::Datum aus Input Datei lesen
FOR /f "tokens=5 delims=#" %%a IN ('findstr /n $ %input%') DO @(  
FOR /l %%z IN (1,1,1) DO ECHO %%a > %output2%
)
FOR /f "tokens=1 delims=T" %%a IN (%output2%) DO SET Datum=%%a  


::Durchschnittswert auf Startwert addieren, Durchschnittswert auf das Ergebnis davon addieren, usw., um die Werte zwischen Start und Endwert zu erhalten
SET /a Ticker=1
SET /a Cntr=0

:ADDITION
IF /i "%Ticker%" EQU "1" (  
	GOTO RECHNUNGA
) ELSE (
	GOTO PRUEFEN
)
:PRUEFEN
IF /i "%Ticker%" LSS "%Anzahl%" (  
	GOTO RECHNUNGB
) ELSE (
	GOTO WEITER
)

:RECHNUNGA
SET /a Cntr=%Cntr%+1
SET /a ZWneu%Cntr%=%ZW1% + %Durchschnitt%
ECHO !ZWneu%Cntr%! >> Ergebnis%Cntr%.txt
SET /a Ticker=%Ticker%+1
GOTO ADDITION

:RECHNUNGB
SET /a Cntr2=%Cntr%+1
SET /a ZWneu%Cntr2%=!ZWneu%Cntr%! + %Durchschnitt%
ECHO !ZWneu%Cntr2%! >> Ergebnis%Cntr2%.txt
SET /a Cntr=%Cntr%+1
SET /a Ticker=%Ticker%+1
GOTO ADDITION

::Uhrzeiten der Zwischenwerte ermitteln                
:WEITER
SET /a Tickone=0
SET /a Ticktwo=0
SET /a Tickthree=0
SET /a ErgCntr=1

GOTO PRUEFENA

:PRUEFENA
IF /i "%Tickone%" EQU "0" (  
	GOTO MINUTENA
) ELSE (
	GOTO PRUEFENB
)

:PRUEFENB
SET /a Anzahl2=%Anzahl%-1
IF /i "%Tickone%" LSS "%Anzahl2%" (  
	GOTO MINUTENB
) ELSE (
	GOTO :EOF
)

:MINUTENA
SET /a Ticktwo=%Ticktwo%+1

:DNULL
IF /i "%WertMin1%" EQU "0" (  
	SET /a WertMin1=15 
	GOTO PLUS1
) ELSE (
	GOTO FZEHN
)
:FZEHN
IF /i "%WertMin1%" EQU "15" (  
	SET /a WertMin1=30
	GOTO PLUS1
) ELSE (
	GOTO DZIG
)
:DZIG
IF /i "%WertMin1%" EQU "30" (  
	SET /a WertMin1=45 
	GOTO PLUS1
) ELSE (
	GOTO FVZIG
)
:FVZIG
IF /i "%WertMin1%" EQU "45" (  
	SET /a WertMin1=00
	SET /a WertHour1=%WertHour1%+1
	GOTO PLUS1
)

:PLUS1
SET /a WertMin%Ticktwo%=%WertMin1%
SET /a WertHour%Ticktwo%=%WertHour1%
ECHO !WertMin%Ticktwo%! > Minuten%Tickone%.txt
ECHO !WertHour%Ticktwo%! > Stunden%Tickone%.txt
::Minutenwert 0 soll als 00, und Stunden sollen mit 2 Ziffern (Bsp. 04 statt 4) angezeigt werden
IF /i ==[!WertMin%Ticktwo%!] ECHO 00 > Minuten%Tickone%.txt
IF /i ==[!WertHour%Ticktwo%!] ECHO 00 > Stunden%Tickone%.txt
IF /i [1]==[!WertHour%Ticktwo%!] ECHO 01 > Stunden%Tickone%.txt
IF /i [2]==[!WertHour%Ticktwo%!] ECHO 02 > Stunden%Tickone%.txt
IF /i [3]==[!WertHour%Ticktwo%!] ECHO 03 > Stunden%Tickone%.txt
IF /i [4]==[!WertHour%Ticktwo%!] ECHO 04 > Stunden%Tickone%.txt
IF /i [5]==[!WertHour%Ticktwo%!] ECHO 05 > Stunden%Tickone%.txt
IF /i [6]==[!WertHour%Ticktwo%!] ECHO 06 > Stunden%Tickone%.txt
IF /i [7]==[!WertHour%Ticktwo%!] ECHO 07 > Stunden%Tickone%.txt
IF /i [8]==[!WertHour%Ticktwo%!] ECHO 08 > Stunden%Tickone%.txt
IF /i [9]==[!WertHour%Ticktwo%!] ECHO 09 > Stunden%Tickone%.txt

FOR /f %%a IN (Minuten%Tickone%.txt) DO SET TestMin=%%a
FOR /f %%a IN (Stunden%Tickone%.txt) DO SET TestHour=%%a
FOR /f %%a IN (Ergebnis%ErgCntr%.txt) DO SET TestErg=%%a

::Den Block von <MD> bis </MD> mit dem jeweiligen Datum, Uhrzeit-Wert und Messwert in die OUTPUT.txt schreiben
REM

FOR /f "tokens=4 delims=#" %%a IN ('findstr /n $ %input%') DO @(  
FOR /l %%z IN (1,1,1) DO ECHO %%a > %output2%
)
FOR /f %%a IN (%output2%) DO ECHO %%a >>%output%

ECHO %Datum% um %TestHour%:%TestMin%:00 >> %output%

ECHO %TestErg% >> %output%

SET /a Tickone=%Tickone%+1

GOTO PRUEFENA

:MINUTENB
SET /a Tickthree=%Ticktwo%+1

:DDNULL
IF /i "!WertMin%Ticktwo%!" EQU "0" (  
	SET /a WertMin%Ticktwo%=15 
	GOTO PLUS2
) ELSE (
	GOTO FFZEHN
)
:FFZEHN
IF /i "!WertMin%Ticktwo%!" EQU "15" (  
	SET /a WertMin%Ticktwo%=30
	GOTO PLUS2
) ELSE (
	GOTO DDZIG
)
:DDZIG
IF /i "!WertMin%Ticktwo%!" EQU "30" (  
	SET /a WertMin%Ticktwo%=45 
	GOTO PLUS2
) ELSE (
	GOTO FFVVZIG
)
:FFVVZIG
IF /i "!WertMin%Ticktwo%!" EQU "45" (  
	SET /a WertMin%Ticktwo%=00
	SET /a WertHour%Ticktwo%=!WertHour%Ticktwo%!+1
	GOTO PLUS2
)

:PLUS2
SET /a ErgCntr=%ErgCntr%+1
SET /a WertMin%Tickthree%=!WertMin%Ticktwo%!
SET /a WertHour%Tickthree%=!WertHour%Ticktwo%!
ECHO !WertMin%Tickthree%! > Minuten%Tickone%.txt
ECHO !WertHour%Tickthree%! > Stunden%Tickone%.txt
IF /i ==[!WertMin%Tickthree%!] ECHO 00 > Minuten%Tickone%.txt
IF /i ==[!WertHour%Tickthree%!] ECHO 00 > Stunden%Tickone%.txt
IF /i [1]==[!WertHour%Tickthree%!] ECHO 01 > Stunden%Tickone%.txt
IF /i [2]==[!WertHour%Tickthree%!] ECHO 02 > Stunden%Tickone%.txt
IF /i [3]==[!WertHour%Tickthree%!] ECHO 03 > Stunden%Tickone%.txt
IF /i [4]==[!WertHour%Tickthree%!] ECHO 04 > Stunden%Tickone%.txt
IF /i [5]==[!WertHour%Tickthree%!] ECHO 05 > Stunden%Tickone%.txt
IF /i [6]==[!WertHour%Tickthree%!] ECHO 06 > Stunden%Tickone%.txt
IF /i [7]==[!WertHour%Tickthree%!] ECHO 07 > Stunden%Tickone%.txt
IF /i [8]==[!WertHour%Tickthree%!] ECHO 08 > Stunden%Tickone%.txt
IF /i [9]==[!WertHour%Tickthree%!] ECHO 09 > Stunden%Tickone%.txt


FOR /f %%a IN (Minuten%Tickone%.txt) DO SET TestMin=%%a
FOR /f %%a IN (Stunden%Tickone%.txt) DO SET TestHour=%%a
FOR /f %%a IN (Ergebnis%ErgCntr%.txt) DO SET TestErg=%%a

FOR /f "tokens=4 delims=#" %%a IN ('findstr /n $ %input%') DO @(  
FOR /l %%z IN (1,1,1) DO ECHO %%a > %output2%
)
FOR /f %%a IN (%output2%) DO ECHO %%a >>%output%

ECHO %Datum% um %TestHour%:%TestMin%:00 >> %output%

ECHO %TestErg%  >> %output%

SET /a Tickone=%Tickone%+1
SET /a Ticktwo=%Ticktwo%+1

GOTO PRUEFENA



Damit kann ich mit der Uhrzeit "rechnen" und für die 15min-Abschnitte die zugehörigen Werte ermitteln.

Mein jetziges Problem ist nur noch, dass das mit der Zeit-"Berechnung" irgendwie nur bis maximal 2,5h Zeitdifferenz funktionieren will (Bsp. 21:15 bis 23:45 geht, bei 21:00 bis 23:45 gibt mir keine Werte mehr)....

Und eigtl sollte es in der Lage sein, sogar eine Differenz von 00:00 Uhr bis 23:45 Uhr berechnen zu können (sprich Zwischenwerte UND die Zwischen-Uhrzeiten), aber das geht irgendwie noch nicht face-sad

Gruß,
narthan
Mitglied: 115420
115420 30.04.2014 aktualisiert um 19:05:20 Uhr
Goto Top
Hallo narthan!

Sehr schöner, wenn auch langer Codeface-wink 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
Mitglied: narthan
narthan 30.04.2014 um 19:15:17 Uhr
Goto Top
Hallo spatzenhirn!


Zitat von @115420:
>
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.


Das hatte ich mir zuerst auch so überlegt, aber da sah ich ein Problem mit dem Sprung bei 60 Min auf 0 Min und die Erhöhung der Stunde um den Wert 1...Frag mich nicht wieso, weil das ja Quatsch ist, natürlich sollte das gehen!
Muss ich definitiv mal ausprobieren, weil das denke ich auf jeden Fall sinnvoller wär und evtl. sogar mein Problem lösen könnte! Danke für diesen Tipp! face-smile

Gruß, narthan
Mitglied: narthan
narthan 01.05.2014 aktualisiert um 15:18:51 Uhr
Goto Top
Moin moin,

ich hab deinen Vorschlag jetzt getestet, dabei ergibt sich jedoch das Problem, dass beim Umrechnen der Minutenwerte ins Uhrzeit-Format die Komma-Stellen ja nicht berücksichtigt werden...

Beispiel:
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.
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).

Ich habe mir jetzt überlegt, dies mit 96 IF-Abfragen zu lösen (96 daher, weil der Tag 96 15min-Werte enthält), statt der Umrechnung der Minuten in Stunden, da Batch ja scheinbar mit Kommastellen nicht rechnen kann...

(Das Problem mit der begrenzten Anzahl von Werten ensteht durch deine Vorschlags-Variante übrigens nicht, was schonmal top ist! face-smile )

Grüße, narthan
Mitglied: bastla
bastla 01.05.2014 um 15:24:24 Uhr
Goto Top
Hallo narthan!

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.
Ok
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
Mitglied: narthan
narthan 01.05.2014 um 15:43:33 Uhr
Goto Top
Hey bastla!

Zitat von @bastla:

Du könntest natürlich auch einfach 285 - 60 * Stunde rechnen ...


Wie dumm von mir, das zu übersehen. Danke dir! face-smile

Gruß, narthan
Mitglied: bastla
bastla 01.05.2014 um 15:49:28 Uhr
Goto Top
Hallo narthan!

Um doch noch mal nachzufragen: Hast Du den Ansatz oben überhaupt getestet, und wenn ja, wo hakt's?

Grüße
bastla
Mitglied: narthan
narthan 01.05.2014 aktualisiert um 17:59:47 Uhr
Goto Top
Hey bastla,

Sorry, deine Batch Lösung habe ich jetzt erst gesehen. Die VBS Varianten hatte ich getestet, aber Batch ist mir persönlich lieber....ich werde jetzt sofort deinen Batch Code testen und dann direkt Feedback geben! face-smile

Grüße, narthan
Mitglied: narthan
narthan 01.05.2014 um 18:00:36 Uhr
Goto Top
Hatte den oberen Post editiert, aber ich glaub dann bekommt man keine neue Notifikation..

Habs getestet. Ich verstehe 2 Stellen im Code nicht:
--> einmal in Zeile 5, warum muss hier vor %%b und %%c eine "1" stehen?
--> was bewirkt in Zeile 16 die ":~-2" in den beiden Variablen?

--> müsste ich für die 160 (Minuten) immer manuell den Wert eintragen? Oder in dem Fall über meinen Weg die Uhrzeiten in Minuten rechnen und die Differenz in eine Variable speichern und an dieser Stelle in deinem Code einsetzen?

Ansonsten sehr übersichtlich und führt zum Ziel, definitiv besser als meine zu komplizierten Überlegungen.. Für Von und Bis kann ich die Werte ja einfach aus einer temporären Datei einlesen, oder ggf. aus der Input Datei.
Auf diesen Code wär ich selber definitiv niemals gekommen. :-P

Gruß, narthan
Mitglied: bastla
Lösung bastla 01.05.2014 aktualisiert um 20:41:43 Uhr
Goto Top
Hallo narthan!
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
Mitglied: narthan
narthan 01.05.2014 um 20:44:29 Uhr
Goto Top
Hey,

Klasse bastla, danke! Super Erklärung und hat mir sehr weitergeholfen face-smile
Dann werde ich mein Skript wohl nochmal mit deiner Lösung neu aufbauen, dadurch wird es mit Sicherheit übersichtlicher und weniger kompliziert.
Tageswechsel wird es definitiv nicht geben, daher passt das so perfekt face-smile

Schönen Abend noch,
narthan