Bestimmter Abschnitt einer Zeile auslesen
Hi. Ich habe mich schon etwas mit Batch beschäftigt. Dank diesem Forums konnte ich eine Menge lernen
Nun zu meinem Problem.
Ich habe mir eine "Logbat" geschrieben. Diese wird per Autostart aktiviert und schreibt folgendes in eine Logdatei:
Ebenso hab ich eine "beendenbat" geschrieben:
die Logdatei sieht in etwa so aus:
Ich wollte das so machen, dass am Ende berechnet wird, wie lange der PC an war.
Dies sollte dann So zum schluss aussehen:
Nun zu meinem Problem.
Ich habe mir eine "Logbat" geschrieben. Diese wird per Autostart aktiviert und schreibt folgendes in eine Logdatei:
echo Zugegriffen von %username% am %date% um %time% Uhr >> C:\log\logfile_%username%.ini
echo Windows beendet am %date% um %time% Uhr >> C:\log\logfile_%username%.ini
die Logdatei sieht in etwa so aus:
Zugegriffen von User am 25.06.2010 um 2:14:39,86 Uhr
Windows beendet am 25.06.2010 um 4:31:46,81 Uhr
Windows beendet am 25.06.2010 um 4:31:46,81 Uhr
Ich wollte das so machen, dass am Ende berechnet wird, wie lange der PC an war.
Dies sollte dann So zum schluss aussehen:
bisher ist Dies mein Quellcode:
@echo off
rem Zählervariable setzten
Set /A "Counter=0"
FOR /F "delims=" %%A IN (c:\log\logfile_%username%.ini) DO SET /A "Counter+=1"
rem Zählervariable um 1 verringern
set /a "Counter1=%Counter%-1"
rem gib die letzte Zeile in der Textdatei aus
FOR /F "tokens=1 delims=," %%i IN (c:\log\logfile_%username%.ini) DO set var1=%%i
echo %var1%
rem gib eine bestimmte Zeile (n=Counter1(Vorletzte Zeile der Textdatei)) aus
Set /a cnt=1
Set /a n=%Counter1%
for /F "tokens=1 delims=," %%i in (c:\log\logfile_%username%.ini) do call :setvarFixLine %n% "%%i"
Echo %Var%
pause
rem zum Berechnen der vorletzten Zeile
:setvarFixLine
If %cnt%==%1 Set Var=%~2
Set /a cnt+=1
goto :eof
exit
Das Problem ist, dass ich NICHT die Uhrzeit aus dem ganzen String rausfiltern kann.
Gibt es denn eine Möglichkeit, wie ich von dem String
Zugegriffen von Deadman am 25.06.2010 um 2:14:39,86 Uhr
nur die Zeit bekommen kann?Hoffe es kann mir da jemand weiterhelfen.
Ki-Einheit
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 145681
Url: https://administrator.de/contentid/145681
Ausgedruckt am: 16.11.2024 um 01:11 Uhr
27 Kommentare
Neuester Kommentar
Zitat von @ki-einheit:
Das Problem ist, dass ich NICHT die Uhrzeit aus dem ganzen String rausfiltern kann.
Gibt es denn eine Möglichkeit, wie ich von dem String
> Zugegriffen von Deadman am 25.06.2010 um 2:14:39,86 Uhr
nur die Zeit bekommen kann?
Hoffe es kann mir da jemand weiterhelfen.
Ki-Einheit
Das Problem ist, dass ich NICHT die Uhrzeit aus dem ganzen String rausfiltern kann.
Gibt es denn eine Möglichkeit, wie ich von dem String
> Zugegriffen von Deadman am 25.06.2010 um 2:14:39,86 Uhr
nur die Zeit bekommen kann?
Hoffe es kann mir da jemand weiterhelfen.
Ki-Einheit
Hallo Ki-Einheit,
das kannst du mit dieser FOR-Schleife erledigen, vorausgesetzt, die Uhrzeit steht immer an 7. Stelle:
for /f "tokens=7 delims= " %i in (x.txt) do @echo %i
Moin ki-einheit,
willkommen im Forum.
Versuch es so (Demo am CMD-Prompt):
Du musst %var1% nochmals in Anführungszeichen setzen, das ist alles.
Die letzte Zeile zeigt, wie du gleich die mit Komma getrennten 100stel Sunkunden wegschneiden kannst...die transportieren keine relevante Information.
Grüße
Biber
willkommen im Forum.
Versuch es so (Demo am CMD-Prompt):
>set "var1=Zugegriffen von Deadman am 25.06.2010 um 2:14:39,86 Uhr"
>for /f "tokens=7 delims= " %i in ("%var1%") do @echo %i
2:14:39,86
(=15:03:09 D:\Temp=)
>for /f "tokens=7 delims=, " %i in ("%var1%") do @echo %i
2:14:39
Du musst %var1% nochmals in Anführungszeichen setzen, das ist alles.
Die letzte Zeile zeigt, wie du gleich die mit Komma getrennten 100stel Sunkunden wegschneiden kannst...die transportieren keine relevante Information.
Grüße
Biber
Kurze Verständnisfrage:
- Was steht in den beiden Variable
- Was möchtest du mit dieser FOR-Schleife erreichen
Ah OK jetzt habe ich es verstanden.
aber doch noch eine Frage was heißt
Tipp: Zähle an welcher Position sich die Uhrzeit befindet - nicht an 7.
aber doch noch eine Frage was heißt
Leider geht es bei der 2. Variable (var) nicht.
wird bei dir dann zufällig Uhr ausgegeben? Wenn das der Fehler ist, dann musst du den Token ändern.Tipp: Zähle an welcher Position sich die Uhrzeit befindet - nicht an 7.
Genauer gesagt, bastla,
Lass das "/a" beim ersten "
Grüße
Biber
Lass das "/a" beim ersten "
set
" weg ... bei den Mitternachtsspitzen.Grüße
Biber
Moin ki-einheit,
nochmal langsam.... du musst ja erst mal abstrakt für dich einen Rhythmus bzw. Algorithmus herleiten.
Tritt doch mal zwei Schritt zurück:
Wenn es am 28.06 begonnen hätte um 0 Uhr 0 Minuten und geendet hätte am 29.06 auch um 0 Uhr 0 Minuten
--> dann wäre die Rechnung ja einfachst:
Nun hat es aber nicht um 0 Uhr 0 Minuten begonnen, sondern erst 9 Stunden 44 Minuten später.
Die musst du abziehen.
Und endete nicht um 0 Uhr 0 Minuten, sondern 7 Minuten später.
Die musst du draufschlagen
Und voila:
--> ergibt 14 Stunden
---> und 23 Minuten
Du kannst nur einen Algorithmus abbilden, den du auch nachvollziehen kannst, von daher werde ich nicht oben in den Schnipselzeilen nachbessern.
Finde deinen Algorithmus.
Grüße
Biber
nochmal langsam.... du musst ja erst mal abstrakt für dich einen Rhythmus bzw. Algorithmus herleiten.
Tritt doch mal zwei Schritt zurück:
Zugegriffen von User am 28.06.2010 um 9:44:12,26 Uhr
Windows beendet am 29.06.2010 um 0:07:49,98 Uhr
Windows beendet am 29.06.2010 um 0:07:49,98 Uhr
Wenn es am 28.06 begonnen hätte um 0 Uhr 0 Minuten und geendet hätte am 29.06 auch um 0 Uhr 0 Minuten
--> dann wäre die Rechnung ja einfachst:
>set /a ((29-28)*24*60)
1440
--> 1 voller Tag mal 24 Stunden zu je 60 Minuten = 1440 Minuten.1440
Nun hat es aber nicht um 0 Uhr 0 Minuten begonnen, sondern erst 9 Stunden 44 Minuten später.
Die musst du abziehen.
set /a ((29-28)*24*60) -(9*60) -44
856Und endete nicht um 0 Uhr 0 Minuten, sondern 7 Minuten später.
Die musst du draufschlagen
set /a ((29-28)*24*60) -(9*60) -44 +7
863Und voila:
set /a 863/60
14--> ergibt 14 Stunden
set /a 863%60
23---> und 23 Minuten
Du kannst nur einen Algorithmus abbilden, den du auch nachvollziehen kannst, von daher werde ich nicht oben in den Schnipselzeilen nachbessern.
Finde deinen Algorithmus.
Grüße
Biber
Moin ki-einheit,
Und freut mich auch, das du meinen Kommentar nicht als unwilliges Abbügeln aufgefasst hast - ich hatte es auch wirklich konstruktiv gemeint.
Und der Vollständigkeit halber: wenn du nicht mehr weiterkommst, sind wir hier.
Grüße
Biber
Zitat von @ki-einheit:
Danke Biber. Ich werd mal versuchen, etwas hinzuzimmern. Werd das ergebnis dann später mal Posten, ok?
Jepp, das würde mich freuen.Danke Biber. Ich werd mal versuchen, etwas hinzuzimmern. Werd das ergebnis dann später mal Posten, ok?
Und freut mich auch, das du meinen Kommentar nicht als unwilliges Abbügeln aufgefasst hast - ich hatte es auch wirklich konstruktiv gemeint.
Und der Vollständigkeit halber: wenn du nicht mehr weiterkommst, sind wir hier.
Grüße
Biber
Hallo ki-einheit!
Abgesehen davon, dass die Zerlegung so
etwas sicherer erfolgt (hast Du Deinen Code schon mit "09" Minuten oder "08" Sekunden getestet?), würde ich das noch ein wenig anders angehen: Wenn zunächst jede der beiden Zeitangaben auf Minuten umgerechnet ist, kannst Du vorweg vergleichen, ob eine Subtraktion dieser Werte mit positivem Ergebnis möglich ist, oder ob noch der Gegenwert von "24:00:00" addiert werden muss ...
Grüße
bastla
Abgesehen davon, dass die Zerlegung so
rem Zerlege die Zeit in Stunde Minute und Sekunde
for /f "tokens=1-3 delims=:," %%i in ("%zeit1%") do (
set /a stundea=%%i
set /a minutea=1%%j %% 100
set /a sekundea=1%%k %% 100
)
Grüße
bastla
Moin ki-einheit,
dann will ich auch noch zwei (hoffentlich zielführende) Hinweise/Anregungen geben.
1) Die liebevoll überlegten "IF dies IF not das"-Abfragen in Zeile 12-14 mögen ja tun was sie wollen.
Aber in allen drei Fällen kannst du auch ohne Prüfung diese Zuweisung nehmen
2) bastla hat schon angeregt, auf jeden Fall alles in Minuten umzurechnen und dann zu prüfen, ob Gegenwert von 24 Stunden addiert werden muss usw.
Teil A ja - auf jeden Fall in Minute umrechnen.
Teil B nein.... nix prüfen
Immer 1440 Minuten addieren und den Wert von %codea% als Modulo 1440 nachbearbeiten.
Beispiel
Bei dem Vergleich "{gestern} 9:44h" bis "{heute morgen} 0:07h" kommen wie mehrfach nachgerechnet 863 Minuten raus ... wenn ein Tag = 1440 als Fixwert in der Gleichung ist.
Bei einem Vergleich " 9:44h" bis "10:07h" kommen - wenn ebenfalls 1440 fix dazugeklatscht werden mit derselben Gleichung heraus:
Zeit2 [ 10:07:49,98] stundeb [10] minuteb [7] sekundeb [49]
Stundeb [10] codea [1463]
... und bei %codea% modulo 1440 wären wir wieder bei 23 Minuten (was dann gilt, wenn %dateAlt% == %dateNeu% ist)
Grüße
Biber
[Edit 18:55h Danke@bastla fürs Übernehmen! /Edit]
dann will ich auch noch zwei (hoffentlich zielführende) Hinweise/Anregungen geben.
1) Die liebevoll überlegten "IF dies IF not das"-Abfragen in Zeile 12-14 mögen ja tun was sie wollen.
Aber in allen drei Fällen kannst du auch ohne Prüfung diese Zuweisung nehmen
set /a codea=(24*60)-(stundea*60)+(stundeb*60)-minutea+minuteb
2) bastla hat schon angeregt, auf jeden Fall alles in Minuten umzurechnen und dann zu prüfen, ob Gegenwert von 24 Stunden addiert werden muss usw.
Teil A ja - auf jeden Fall in Minute umrechnen.
Teil B nein.... nix prüfen
Immer 1440 Minuten addieren und den Wert von %codea% als Modulo 1440 nachbearbeiten.
Beispiel
Bei dem Vergleich "{gestern} 9:44h" bis "{heute morgen} 0:07h" kommen wie mehrfach nachgerechnet 863 Minuten raus ... wenn ein Tag = 1440 als Fixwert in der Gleichung ist.
Bei einem Vergleich " 9:44h" bis "10:07h" kommen - wenn ebenfalls 1440 fix dazugeklatscht werden mit derselben Gleichung heraus:
f:\schnipsel\kidelta.cmd
Zeit1 [ 9:44:12,26] stundea [9] minutea [44] sekundea [12]Zeit2 [ 10:07:49,98] stundeb [10] minuteb [7] sekundeb [49]
Stundeb [10] codea [1463]
... und bei %codea% modulo 1440 wären wir wieder bei 23 Minuten (was dann gilt, wenn %dateAlt% == %dateNeu% ist)
Grüße
Biber
[Edit 18:55h Danke@bastla fürs Übernehmen! /Edit]
Hallo ki-einheit!
Bibers (Modulo-)Vorschläge ließen sich etwa so umsetzen:
Grüße
bastla
Bibers (Modulo-)Vorschläge ließen sich etwa so umsetzen:
rem Zerlege die Zeit in Stunde Minute und Sekunde und wandle in Sekunden um
for /f "tokens=1-3 delims=:," %%i in ("%zeit1%") do set /a Von=%%i*3600+(1%%j %% 100)*60+(1%%k %% 100)
for /f "tokens=1-3 delims=:," %%i in ("%zeit2%") do set /a Bis=%%i*3600+(1%%j %% 100)*60+(1%%k %% 100)
set /a Differenz=(86400+Bis-Von) %% 86400
set /a Stunden=Differenz/3600
set /a Minuten=100+(Differenz %% 3600)/60
set /a Sekunden=100+(Differenz %% 60)
echo %Differenz% Sekunden = %Stunden%:%Minuten:~-2%:%Sekunden:~-2%
bastla