Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Zeiten subtrahieren, um Dauer zu ermitteln

Frage Entwicklung Batch & Shell

Mitglied: Sodele

Sodele (Level 1) - Jetzt verbinden

06.02.2012, aktualisiert 19:13 Uhr, 6193 Aufrufe, 8 Kommentare

Wie kann man Dauer errechnen?

Hallo,

ich stehe gerade wieder auf dem Schlauch. Ich müsste zur Weiterverarbeitung durch zwei Zeitwerte deren Dauer ermitteln und weiß gerade nicht weiter. Mein bisheriger Ansatz:

set /p "1begin=Anfangszeit 1: "
set /p "1end=Endzeit 1: "
set /p "2begin=Anfangszeit 1: "
set /p "2end=Endzeit 1: "

set /a 1duration=%1end%-%1begin%
set /a 2duration=%2end%-%2begin%

ECHO Dauer 1: %1duration%
ECHO Dauer 2: %2duration%

funktioniert nicht, weil die Daten im Digitalformat [HH:MM:SS.sss] eingegeben werden und auch wieder so ausgegeben werden sollen, mit diesem Zeitformat aber ja nicht gerechnet werden kann. Wie kann ich das hinkriegen?
Mitglied: bastla
06.02.2012 um 19:25 Uhr
Hallo Sodele!
Wie kann ich das hinkriegen?
Stringzerlegung anhand der Trennzeichen ":" und "." und mit den einzelnen Zahlenwerten (inkl Überträgen) weiter rechnen oder ein wenig VBS einbauen ...

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
06.02.2012 um 19:33 Uhr
moin Sodele,
moin bastla,

bastla hat doch hier unten in Ähnliche Beiträge schon das passende Laufzeit bzw. Dauer einer Batch ermitteln!.
sonst Findest Du über die Suchfunktion http://www.administrator.de/index.php?query=differenz+zeit&what=all ... bestimmt mehr passende Ergebnisse.

Gruß Phil
Bitte warten ..
Mitglied: Sodele
06.02.2012 um 19:56 Uhr
Vielen Dank euch beiden. Ich habe jetzt versucht, Biebers Code von: http://www.administrator.de/forum/Mit-Zeit-rechnen-%3F-77291.html umzuschreiben, um wenigstens den Rechenteil hinzubekommen, bevor ich mich an das Rückkonvertieren in das Digitalformat mache, aber die Batch wird einfach ohne Fehlermeldung geschlossen, und zwar egal ob die Millisekunden mit eingegeben werden oder nicht (da mir delims/tokens schon immer zu hoch war, wollte ich mal auf das zweite Trennzeichen "." verzichten, aber selbst damit gibt es kein Ergebnis):

set /p "1begin=Anfangszeit 1: "
set /p "1end=Endzeit 1: "
set /p "2begin=Anfangszeit 2: "
set /p "2end=Endzeit 2: "

for /f "delims=:, tokens=1-3" %%i in ("%1begin%") do Set /a Start1=%%i*3600+%%j*60+%%k
for /f "delims=:, tokens=1-3" %%i in ("%1end%") do Set /a Ende1=%%i*3600+%%j*60+%%k
for /f "delims=:, tokens=1-3" %%i in ("%2begin%") do Set /a Start1=%%i*3600+%%j*60+%%k
for /f "delims=:, tokens=1-3" %%i in ("%2end%") do Set /a Ende1=%%i*3600+%%j*60+%%k

set /a T1=Ende1-Start1
set /a T2=Ende2-Start2

Echo Dauer 1: %T1% sec Dauer 2: %T2% sec

Mit VBS kenne ich mich leider überhaupt nicht aus und wollte deshalb gern darauf verzichten. Müsste ich mir dafür extra was installieren?
Bitte warten ..
Mitglied: bastla
06.02.2012 um 20:08 Uhr
Hallo Sodele!
Müsste ich mir dafür extra was installieren?
Nein - es darf nur VBS nicht deaktiviert sein.

Unter der Voraussetzung, dass alle Zeiten im angegebenen Format (also zumindest mit einem verpflichtenden Punkt als Trennzeichen und danach bis zu 3 Nachkommastellen) eingegeben werden, sollte das etwa so gehen:
01.
@echo off & setlocal 
02.
set T=%temp%\TimeDiff.vbs 
03.
 >%T% echo Set a=WScript.Arguments:TS1=Left(Split(a(0),".")(1)^&"000",3):TS2=Left(Split(a(1),".")(1)^&"000",3):TSDiff=TS2-TS1:If TSDiff^<0 Then TSDiff=TSDiff+1000:SDiff=1/86400 
04.
>>%T% echo T1=CDate(Split(a(0),".")(0)):T2=CDate(Split(a(1),".")(0)):Diff=FormatDateTime(T2-T1+1-SDiff,vbLongTime)^&"."^&Right("00"^&TSDiff,3):WScript.Echo Diff 
05.
 
06.
set /p "begin1=Anfangszeit 1: " 
07.
set /p "end1=Endzeit 1: " 
08.
set /p "begin2=Anfangszeit 2: " 
09.
set /p "end2=Endzeit 2: " 
10.
 
11.
for /f "delims=" %%i in ('cscript //nologo %T% "%begin1%" "%end1%"') do set "duration1=%%i" 
12.
for /f "delims=" %%i in ('cscript //nologo %T% "%begin2%" "%end2%"') do set "duration2=%%i" 
13.
 
14.
echo Dauer 1: %duration1% 
15.
echo Dauer 2: %duration2%
Die Zeilen 2 bis 4 erzeugen ein VBScript, das dann in weiterer Folge mit Parameterübergabe aufgerufen wird.

Grüße
bastla

[Edit: Komfortablere Angabe der Tausendstelsekunden ermöglicht [/Edit]
Bitte warten ..
Mitglied: Sodele
06.02.2012 um 20:23 Uhr
Cool. Vielen Dank, das hat super geklappt, nur leider verstehe ich davon nichts. Muss ich mir das VBS-Script wie eine eigene Batchssprache vorstellen? Gibt es zu VBS auch ein anfängerfreundliches Tutorial?
Bitte warten ..
Mitglied: bastla
06.02.2012 um 20:34 Uhr
Hallo Sodele!

VBS bedeutet "Visual Basic Script" und ist daher ein "Basic-Dialekt", wobei zwar "Scriptsprache" besser passen würde, aber "Batchsprache" als Beschreibung auch ok ist ...

Hinsichtlich Tutorial könntest Du mal ins Microsoft Windows 2000 - Scripting-Handbuch (Teil 1) reinschauen ...
nur leider verstehe ich davon nichts.
Das oben verwendete Script in etwas weniger kompakter Form (und etwas ausführlicher kommentiert ):
01.
Set a = WScript.Arguments 'Array für Aufrufparameter (stehen danach als a(0), a(1), etc zur Verfügung) erzeugen 
02.
 
03.
TS1 = Left(Split(a(0), ".")(1) & "000", 3) 'ersten Parameter anhand des Punktes zerlegen; an den zweiten Teil - da der Index null-basiert ist, wird (1) verwendet - "000" anfügen und davon die ersten 3 Stellen von links als Tausendstelsekundenwert verwenden 
04.
TS2 = Left(Split(a(1), ".")(1) & "000", 3) 'analog für den zweiten Parameter 
05.
TSDiff = TS2 - TS1 'Tausendstelsekunden-Differenz berechnen 
06.
If TSDiff < 0 Then TSDiff = TSDiff + 1000: SDiff = 1/86400 'bei negativem Ergebnis 1000 addieren und den Wert einer Sekunde (wird in Basic - und zB auch in Excel - als Bruchteil eines Tages angegeben) als Korrekturfaktor speichern 
07.
 
08.
T1 = CDate(Split(a(0), ".")(0)) 'ersten Parameter anhand des Punktes zerlegen und den ersten Teil in einen Zeitwert (für die Berechnung) konvertieren 
09.
T2 = CDate(Split(a(1), ".")(0)) 'analog für den zweiten Parameter 
10.
'Zeitdifferenz berechnen und dabei einfach einen Tag addieren (verhindert negative Ergebnisse) sowie den Korrekturfaktor aus der Tausendstelsekundenberechnung subtrahieren; 
11.
'das Ergebnis wird als Zeitwert formatiert und daran ein Punkt sowie die Tausendstelsekunden-Differenz angefügt, wobei diese Differenz auf 3 Stellen (bei Bedarf mit führenden Nullen) gebracht wird 
12.
Diff = FormatDateTime(T2 - T1 + 1 - SDiff, vbLongTime) & "." & Right("00" & TSDiff, 3) 
13.
WScript.Echo Diff 'Ausgabe des Ergebnisses (kann vom aufrufenden Batch übernommen werden)
Grüße
bastla
Bitte warten ..
Mitglied: Biber
06.02.2012 um 20:58 Uhr
Moin Sodele,

nur der Vollständigkeit halber...

ich habe in meiner Jugend hier im Forum ein mehrzeiliges Tutorial "Umgang mit Datums- und Zeitvariablen im Batch" zusammengeharkt.
Um zu belegen, dass Rechnen mit Datumswerten im Batch eigentlich nicht geht.

Von daher empfehle ich (wie auch in dem Tutorial): Frag lieber jemand, der weiss, wie es geht --> also z.B. VBScript/JScript --> siehe weiter oben bei bastla.

Die beiden Probleme in deiner Schnipselvariante (oben, von 19;54h) sind allerdings
a) eine Batch-Sofort-Strafe für schlechten Programmierstil
b) eine Wie-im-richtigen-Leben-Sofort-Strafe für Programmieren mit Copy&Paste

Der schlechte Programmierstil, der sich innerhalb von Zehntelsekunden gerächt hat:

Benenne NIE NIE NIE in keiner Programmiersprache dieser Galaxie leichtfertig Variablennamen beginnend mit Ziffern, Unterstrichen, Sonderzeichen oder Umlauten.
Ist eine Sollbruchstelle - das holt dich immer ein.

In diesem Fall wurden die Variablennamen gar nicht als "%1end%" im Sinne von "inhalt der Variablen 1end" interpretiert.
Sondern als "%1end%" == Parameter 1 der Batchdatei (war leer) + der String "end%". Da kann bei der Zerlegung nix rauskommen.


Der Copy &Paste-Fehler --> Du setzt in deinen vier FOR/F-Anweisungen nicht Start1/Ende1 und Start2/Ende2 ... sondern 2x Start1/Ende1

Den ersten Fehler solltest du beheben durch Umbenamsen der Variablen in irgendetwas mit einem Buchstaben am Anfang.
Also statt "1begin" vielleicht "grzlbrnft" oder etwas anderes Wiedererkennbares.

Theoretischer Workaround, falls du aus religiösen oder aus Gründen der Gendergleichstellung auf Variablen beginnend mit Ziffern bestehst:
01.
@echo off & setlocal enabledelayedexpansion 
02.
goto skip 
03.
set /p "1begin=Anfangszeit 1: " 
04.
set /p "1end=Endzeit 1: " 
05.
set /p "2begin=Anfangszeit 2: " 
06.
set /p "2end=Endzeit 2: " 
07.
:skip 
08.
set "1begin=15:19:13,04" 
09.
set "1end=20:19:33,94" 
10.
set "2begin=17:33:44,77" 
11.
set "2end=23:00:23,11" 
12.
 
13.
for /f "delims=:, tokens=1-3" %%i in ("!1begin!") do Set /a Start1=%%i*3600+%%j*60+%%k 
14.
for /f "delims=:, tokens=1-3" %%i in ("!1end!") do Set /a Ende1=%%i*3600+%%j*60+%%k 
15.
for /f "delims=:, tokens=1-3" %%i in ("!2begin!") do Set /a Start2=%%i*3600+%%j*60+%%k 
16.
for /f "delims=:, tokens=1-3" %%i in ("!2end!") do Set /a Ende2=%%i*3600+%%j*60+%%k 
17.
 
18.
set /a T1=Ende1-Start1 
19.
set /a T2=Ende2-Start2 
20.
 
21.
Echo Dauer 1: %T1% sec Dauer 2: %T2% sec
Ausgabe-->
d:\temp>e:\schnipsel\DauerBerechnen.cmd 
Dauer 1: 18020 sec Dauer 2: 19599 sec
Grüße
Biber
Bitte warten ..
Mitglied: Sodele
06.02.2012 um 21:43 Uhr
Vielen Dank für die Hinweise. Nein, dass die Zahlen am Anfang stehen hat keinen religiösen Sinn, sondern fand ich einfach übersichtlicher (denn es werden am Ende mehr als nur zwei Berechnungen gebraucht. Ich denke, dass 5-6 am Stück pro Batch so normal werden sollten). Ich gelobe Besserung.
Bitte warten ..
Ähnliche Inhalte
Entwicklung
Crystal Report - mit Zeit ermitteln
gelöst Frage von a.grotheEntwicklung9 Kommentare

Hallo zusammen, ich habe ein Problem mit Crystal Report. In meiner Datenbank steht eine Datum Uhrzeit Angabe. z.B. 2014-08-01T10:44:23.6366+02:00 ...

Batch & Shell
Batch: Zeit ermitteln und ausgeben lassen während ein Bat.File durchläuft
gelöst Frage von BatchAnfaenger91Batch & Shell2 Kommentare

Hallo Liebe Leute ;) meine nächste Frage die ich mir erstelle ist: Ist es möglich in CMD die Zeit ...

Windows Server
Lange Zeit geöffnete Dateien an Freigabe ermitteln
Frage von hf1965Windows Server2 Kommentare

Hallo, leider fliegen uns immer mal Programme um die Ohren, weil sie versuchen, geöffnete/gesperrte Dateien eines Fileservers zu bearbeiten. ...

Microsoft
Zwei Datumsangaben in Access subtrahieren in der Entwurfansicht?
gelöst Frage von bananajo05Microsoft2 Kommentare

Hallo, ich soll die tatsächliche Ausleidauer von Büchern berechnen und würde somit gerne aus einer Tabelle zwei Datumsangaben voneinander ...

Neue Wissensbeiträge
Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 7 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 8 StundenSicherheit1 Kommentar

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1011 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 2 TagenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell22 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen18 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows Server
Logging von "gesendeten Nachrichten" auf Terminalservern
gelöst Frage von Z3R0C0MM4N0THiN6Windows Server10 Kommentare

Hallo zusammen, kann mir jemand auf kurzem Wege sagen ob 1) die per Task-Manager (oder damals tsadmin) an Benutzer ...