chipy
Goto Top

Zeitdifferenz ermitteln und ausgeben per Batch

Hi zusammen,

beschäftige mich seit kurzem intensiver mit Batch.

Nun stehe ich vor eine naja nicht gerade problem, aber mich Quält eine frage und zwar
geht dieser Snippsel auch einfacher auszuwerten ?

Ich habe ein Backupscript geschrieben läuft auch einwandfrei.
Nun erstelle ich mir dementsprechend auch ein Logfile. Aber wenn die Datensicherung durch ist möchte ich im Logfile
die Gesamtzeit stehen haben die das Backup gebraucht hat.

Habe mir dazu folgendes nun zusammengestrickt :


@Echo Off & SetLocal

:: Vitruellen Wert Setzen
Set Virt=1000000

:: Aktuelle Zeit in eine Datei speichern
Echo %time% >zeit.tmp

:: Gespeicherte Datei mit Zeit formatieren
FOR /F "tokens=1,2,3 delims=:," %%a in (zeit.tmp) do set timeA=%%a%%b%%c  

:: Zum testen 5 sekunden warten / Hier würde mein Backup (rar) nun starten
wait 5

:: Wieder aktuelle Zeit in eine Datei speichern
Echo %time% >zeit.tmp
:: Und hier wieder die Zeit formatieren
FOR /F "tokens=1,2,3 delims=:," %%a in (zeit.tmp) do set timeB=%%a%%b%%c  

:: die 2 gespeicherten Zeiten ausrechnen und die differenz speichern
:: Virtuellen Wert mit differnz zusammenrechnen
set /a VirtA=%timeB%-%timeA% && set /a VirtB=%Virt%+%VirtA%

:: Das Entergebniss in einem leserlichen Format mit : speichern.
set ErG=%VirtB:~1,2%:%VirtB:~3,2%:%VirtB:~-2%

:: Ergebniss ausgeben
Echo Dauer %ErG%

[Edit Biber] Nach Rücksprache per PN mit Chipy Beitrag auf gelöst und geschlossen gesetzt am 21.02.2007 [/Edit]

Content-Key: 51963

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

Printed on: April 23, 2024 at 10:04 o'clock

Member: Dani
Dani Feb 17, 2007 at 21:03:26 (UTC)
Goto Top
G' Abend,
also ich habe mal ein bisschen "gekürtzt".
Das ist übrig geblieben:
@echo Off & SetLocal

:: Vitruellen Wert Setzen
set Virt=1000000

for /f "delims=:, tokens=1,2,3" %%a in ('echo %time%') do set timeA=%%a%%b%%c  
ping 127.0.0.1 -n 5 >nul
for /f "tokens=1,2,3 delims=:," %%a in ('echo %time%') do set timeB=%%a%%b%%c  

set /a VirtB=%Virt%+(%timeB%-%timeA%)
echo Dauer: %VirtB:~1,2%:%VirtB:~3,2%:%VirtB:~-2%
Jedoch der Set Befehl erzeugt einen Fehler (Fehlende Klammer). Warum?? Weiß ich gerade auch nicht. Ansonsten würde es so gehen!! Hoffe, dass ich dich ein Stück weitergebracht habe.


Grüße
Dani
Member: bastla
bastla Feb 18, 2007 at 04:48:14 (UTC)
Goto Top
@Dani

Warum??

Das "echo %time%" sollte ein Komma vor den Hundertstelsekunden (die hier übrigens total vernachlässigt werden - da muss man die Genauigkeit dieser Messung dann aber schon anzweifeln face-wink) liefern, ersetzt es aber durch eine Leerstelle - also:
for /f "tokens=1,2,3 delims=:, " ...  
Wenn das Komma schon nichts nützt, sollte es zumindest auch nicht schaden - daher zur Sicherheit dabei lassen ...

Grüße
bastla
Member: Chipy
Chipy Feb 18, 2007 at 10:07:24 (UTC)
Goto Top
Moin Bastla,

naja die Hundertstel benötige ich nicht unbedingt *gg
Weil so genau muss ich es nicht wissen ob er 1-2-3 hunderstel schneller oder langsamer war.
Daher dann auch das entfernen ;)


@Dani

Ich schau mir dein Snippsel mal an ;)

THX


@Dani

> Warum??

Das "echo %time%" sollte ein Komma
vor den Hundertstelsekunden (die hier
übrigens total vernachlässigt
werden - da muss man die Genauigkeit dieser
Messung dann aber schon anzweifeln face-wink)
liefern, ersetzt es aber durch eine
Leerstelle - also:
for /f "tokens=1,2,3  
> delims=:, " ...  
> 
Wenn das Komma schon nichts
nützt, sollte es zumindest auch nicht
schaden - daher zur Sicherheit dabei lassen
...

Grüße
bastla
Member: Chipy
Chipy Feb 18, 2007 at 10:50:34 (UTC)
Goto Top
Hi,

@ Dani

habe auch noch was gefunden *gg
die tokens kann man noch zusammenfassen.
Sieht nun kürzer aus aber ............ ;)

Sollte so entgültig sein :

@echo Off & SetLocal

for /f "tokens=1-3 delims=: " %%a in ('echo %time%') do set timeA=%%a%%b%%c

wait 5

for /f "tokens=1-3 delims=: " %%a in ('echo %time%') do set timeB=%%a%%b%%c

set Virt=1000000
set /a VirtB=%Virt%+(%timeB%-%timeA%)

echo Dauer: %VirtB:~1,2%:%VirtB:~3,2%:%VirtB:~-2%


@bastla

wie du schon erwähntest, das Komma kann man knicken hat keinen einfluss darauf mehr
war nur von nöten wo die Zeit noch in einem textfile gespeichert war.
Seit dani´s lösung den Zeitwert direkt als Set zu setzen ist das komma egal und das leerzeichen ist von nöten.
Ich frage mich allerdings warum er den Zeitwert mit einem leerzeichen anlegt, mhhhhhh


G' Abend,
also ich habe mal ein bisschen
"gekürtzt".
Das ist übrig geblieben:
@echo Off & SetLocal
> 
> :: Vitruellen Wert Setzen
> set Virt=1000000
> 
> for /f "delims=:, tokens=1,2,3"  
> %%a in ('echo %time%') do set  
> timeA=%%a%%b%%c
> ping 127.0.0.1 -n 5 >nul
> for /f "tokens=1,2,3 delims=:,"  
> %%a in ('echo %time%') do set  
> timeB=%%a%%b%%c
> 
> set /a VirtB=%Virt%+(%timeB%-%timeA%)
> echo Dauer:
> %VirtB:~1,2%:%VirtB:~3,2%:%VirtB:~-2%
> 
Jedoch der Set Befehl erzeugt einen Fehler
(Fehlende Klammer). Warum?? Weiß ich
gerade auch nicht. Ansonsten würde es so
gehen!! Hoffe, dass ich dich ein Stück
weitergebracht habe.


Grüße
Dani



EDIT:
konnte Virt Zeile doch nicht mit && zusammensetzen face-sad
Member: bastla
bastla Feb 18, 2007 at 13:32:29 (UTC)
Goto Top
@Chipy

Wenn Du denn gesteigerten Wert auf Kürzerfassungen (noch nicht "Kürzest" - Biber war noch nicht da) legst (geht's Dir also doch um Sekundenbruchteile bei der Laufzeit face-wink):
@echo Off & SetLocal
for /f "tokens=1-3 delims=: " %%a in ('echo %time%') do set timeA=%%a%%b%%c  
sleep 5
for /f "tokens=1-3 delims=: " %%a in ('echo %time%') do set timeB=%%a%%b%%c  
set /a VirtB=1000000+%timeB%-%timeA%
echo Dauer: %VirtB:~1,2%:%VirtB:~3,2%:%VirtB:~-2%
Die Variablennamen verkürze ich aber nimmer ...

Grüße
bastla
Member: Biber
Biber Feb 18, 2007 at 13:56:48 (UTC)
Goto Top
Moin Chipy,

ich würde einen anderen Ansatz wählen.

Meine Skizze:
@echo off & setlocal
for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a start=%%i*3600+60*%%j+%%k  
REM Variable %Start% hat jetzt einen in Sekunden umgerechneten %time%-Wert.

Pause
REM Wo jetzt pause steht, ist natürlich der MachMirDenBackup-Teil

for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a stop=%%i*3600+60*%%j+%%k  
REM Auch Variable %Stop% hat jetzt einen in Sekunden umgerechneten %time%-Wert.
Set /a DauerInMin=(stop-start) %% 60
Set /a UndRestInSecs= (stop-start) - DauerInMin*60 
Echo Gedauert hat es %dauerInMin%:%UndRestInSecs%
REM Oder formatiert:
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=DauerInMin+100
Echo Gedauert hat es %FmMins:~-2%:%FmtSecs:~-2%
[...ungetestete Skizze]

Gruss
Biber
Member: Chipy
Chipy Feb 18, 2007 at 19:32:41 (UTC)
Goto Top
Moin Biber,

Schöner Source aber die ausrechnung hat kein Hand und kein Fuss ;)
Ich weiss , schreibtest ja nicht getestet.
Es kommt nur Quak raus, habe mal extra was in Stunden errechnen lassen und dann wiederum in Sekunden.
Das Ergebniss ist erschreckend ;)

Erläutere mir doch mal bitte 3 Sachen :

start=%%i*3600+60*%%j+%%k

und

DauerInMin=(stop-start) %% 60 <- Wozu %%60 ?

und zu guter letzt :

FmtSecs=UndRestInSecs+100


Irgendwie komme ich wenn ich das auch manuell nachrechne zu unlogischen ergebnissen ;)
Sorry für meine Unverfrohrenheit .

@bastla habe noch was gefunden *gg

dank Biber fiel mir das auf : ("%time%") kann man sich das Echo sparen face-smile

Gruss Chipy


Moin Chipy,

ich würde einen anderen Ansatz
wählen.

Meine Skizze:
@echo off & setlocal
> for /f "tokens=1-3 delims=:," %%i  
> in ("%time%") do set /a  
> start=%%i*3600+60*%%j+%%k
> REM Variable %Start% hat jetzt einen in
> Sekunden umgerechneten %time%-Wert.
> 
> Pause
> REM Wo jetzt pause steht, ist natürlich
> der MachMirDenBackup-Teil
> 
> for /f "tokens=1-3 delims=:," %%i  
> in ("%time%") do set /a  
> stop=%%i*3600+60*%%j+%%k
> REM Auch Variable %Stop% hat jetzt einen in
> Sekunden umgerechneten %time%-Wert.
> Set /a DauerInMin=(stop-start) %% 60
> Set /a UndRestInSecs= (stop-start) -
> DauerInMin*60 
> Echo Gedauert hat es
> %dauerInMin%:%UndRestInSecs%
> REM Oder formatiert:
> Set /a FmtSecs=UndRestInSecs+100
> Set /a FmtMins=DauerInMin+100
> Echo Gedauert hat es
> %FmMins:~-2%:%FmtSecs:~-2%
> 
[...ungetestete Skizze]

Gruss
Biber

Member: Biber
Biber Feb 18, 2007 at 21:01:54 (UTC)
Goto Top
Moin Chipy,

start=%%i*3600+60*%%j+%%k
Na ja, das stimmte noch um 21:52:34,24..
set /a start=21*3600+60*52+34
78754

...aber das war in der Tat Bullshit:

DauerInMin=(stop-start) %% 60 <- Wozu %%60 ?
Natürlich nicht Modulo 60 sondern geteilt durch 60.
DauerInMin=(stop-start)/ 60

Der Rest mit den Fmtxxx-Variablen ist nur Spielerei zur Formatierung im hh:mm-Format.

Gruss
Biber
Member: Biber
Biber Feb 20, 2007 at 08:18:07 (UTC)
Goto Top
Moin Chipy,

nach Deinen mahnenden Worten hier noch mal die oberflächlich getestete Version meiner damaligen Skizze.

::---ShowTime.bat Biber 2007 Sinnfreier Batch zur Demo Zeitdaueranzeige im Batch
@echo off & setlocal

for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a start=%%i*3600+60*(1%%j %% 100)+1%%k-100  
REM Variable %Start% hat jetzt einen in Sekunden umgerechneten %time%-Wert.
Pause
REM Wo jetzt pause steht, ist natürlich der MachMirDenBackup-Teil
for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a stop=%%i*3600+60*(1%%j %% 100)+1%%k-100  
REM Auch Variable %Stop% hat jetzt einen in Sekunden umgerechneten %time%-Wert.
Set /a DauerInMin=(stop-start) / 60
Set /a UndRestInSecs= (stop-start) - DauerInMin*60 
@Echo [Unformatiert] Gedauert hat es %dauerInMin%:%UndRestInSecs%
REM Oder formatiert:
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=DauerInMin+100
@Echo [Formatiert] Gedauert hat es %FmtMins:~-2%:%FmtSecs:~-2%
Demo:
>f:\temp\ShowTime.bat
Drücken Sie eine beliebige Taste . .
[Unformatiert] Gedauert hat es 1:2
[Formatiert] Gedauert hat es 01:02

Gruss
Biber