Mit Batch Datensätze auslesen und weiterverarbeiten
Hallo an alle Batch Spezialisten!
Ich fange am besten erstmal damit an was ich gerne machen würde!
Diese Batch Datei soll von einer bestimmten Datei in der Zeile z.b. 3 von Zeichen 20-29 und in der selben Zeile von Zeichen 40-49 jeweils eine Variable erstellen. Die Zeichen dieser Zeile sind ein Datum im Format TT.MM.JJJJ und Uhrzeit im Format HH:MM:SS!Diese beiden Variablen sollen dann mit dem aktuellen Datum/Uhrzeit verglichen werden. Wenn es +/- 5min als Beispiel passt soll eine Aktion ausgeführt werden, wenn nicht halt Aktion 2!
Ich habe mir jetzt eine Batch erstellt die aus der Datei die Zeile 3 ausließt und ausgibt. Nur kann ich nicht in einer Zeile eine bestimmte Passage herausfiltern und geschweige denn mit dem aktuellen Datum/Uhrzeit abzugleichen!
Vielen Dank schonmal für eure Hilfe
MFG
Rasti
Ich fange am besten erstmal damit an was ich gerne machen würde!
Diese Batch Datei soll von einer bestimmten Datei in der Zeile z.b. 3 von Zeichen 20-29 und in der selben Zeile von Zeichen 40-49 jeweils eine Variable erstellen. Die Zeichen dieser Zeile sind ein Datum im Format TT.MM.JJJJ und Uhrzeit im Format HH:MM:SS!Diese beiden Variablen sollen dann mit dem aktuellen Datum/Uhrzeit verglichen werden. Wenn es +/- 5min als Beispiel passt soll eine Aktion ausgeführt werden, wenn nicht halt Aktion 2!
Ich habe mir jetzt eine Batch erstellt die aus der Datei die Zeile 3 ausließt und ausgibt. Nur kann ich nicht in einer Zeile eine bestimmte Passage herausfiltern und geschweige denn mit dem aktuellen Datum/Uhrzeit abzugleichen!
Vielen Dank schonmal für eure Hilfe
MFG
Rasti
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 115644
Url: https://administrator.de/contentid/115644
Ausgedruckt am: 15.11.2024 um 13:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo rastikf,
bin zwar kein Spezialist, aber ich denke ich kann dir weiterhelfen.
Wie du schreibst, hast du ja bereits die 3. Zeile aus der Datei vorliegen. Nehmen wir an, du hast den Inhalt einer Variablen %Text% zugewiesen.
Dann schau mal, was dir
ausgibt. Nach Zeichen 19 die folgende 10 Zeichen. Wenn ich dich richtig verstanden habe ist das das Datum.
Ob dir das in dieser Form schon hilft, wage ich aber zu bezweifeln. Ich würde noch weiter zerlegen: in Tag, Monat, Jahr, Stunde, Minute und Sekunde und die selbe Zerlegung dann mit den Umgebungsvariablen %date% und %time% vornehmen. Jetzt kannst du Stück für Stück vergleichen.
bin zwar kein Spezialist, aber ich denke ich kann dir weiterhelfen.
Wie du schreibst, hast du ja bereits die 3. Zeile aus der Datei vorliegen. Nehmen wir an, du hast den Inhalt einer Variablen %Text% zugewiesen.
Dann schau mal, was dir
echo %Text:~19,10%
Ob dir das in dieser Form schon hilft, wage ich aber zu bezweifeln. Ich würde noch weiter zerlegen: in Tag, Monat, Jahr, Stunde, Minute und Sekunde und die selbe Zerlegung dann mit den Umgebungsvariablen %date% und %time% vornehmen. Jetzt kannst du Stück für Stück vergleichen.
Hallo rastikf und willkommen im Forum!
Wenn es um Datums- oder Zeitberechnungen geht, tendiere ich eher zum Einsatz eines kleinen (vom Batch erzeugten) VBScripts - in diesem Fall (in Anknüpfung an rubbermans Vorschlag) etwa so:
Das Script erwartet als Übergabeparameter den Timestamp in der Form "TT.MM.JJJJ hh:mm:ss" und die erlaubte Differenz in Minuten.
Grüße
bastla
[Edit] Script auf die Zeitberechnung reduziert. [/Edit]
Wenn es um Datums- oder Zeitberechnungen geht, tendiere ich eher zum Einsatz eines kleinen (vom Batch erzeugten) VBScripts - in diesem Fall (in Anknüpfung an rubbermans Vorschlag) etwa so:
@echo off & setlocal
::
:: Auslesen der Zeile 3 in die Variable %Text%
::
set "Timestamp=%Text:~19,10% %Text:~39,8%"
set "Diff=5"
set C=%Temp%\CheckTimestamp.vbs
>%C% echo T=CDate(WScript.Arguments(0)):D=WScript.Arguments(1):WScript.Echo (DateAdd("n",-D,Now)^<T)*(DateAdd("n",D,Now)^>T)
for /f %%i in ('cscript //nologo %C% "%Timestamp%" %Diff%') do set "OK=%%i"
if "%OK%"=="1" (
echo Aktuell
) else (
echo Nicht aktuell
)
Grüße
bastla
[Edit] Script auf die Zeitberechnung reduziert. [/Edit]
Hallo Rasti,
um dir die Arbeit zu erleichtern,
schlage ich vor das du eine fertige Funktion von Ritchie Lawrence aus seiner Batch Function Library benutzt. Die Funktion DateToSecs rechnet eine Datums-Zeitangabe um in vergangene Sekunden seit dem 1.1.1970 00:00:00.
Die Differenz der Sekunden der beiden Datum-Zeit Angaben kannst Du ja leicht vergleichen.
Gruß
LotPings
um dir die Arbeit zu erleichtern,
schlage ich vor das du eine fertige Funktion von Ritchie Lawrence aus seiner Batch Function Library benutzt. Die Funktion DateToSecs rechnet eine Datums-Zeitangabe um in vergangene Sekunden seit dem 1.1.1970 00:00:00.
Die Differenz der Sekunden der beiden Datum-Zeit Angaben kannst Du ja leicht vergleichen.
Gruß
LotPings
Hallo bastla,
Deine Batch ist etwas zu kompliziert für mich.
Aber Du könntest mit diesem Beispiel eventuell noch ein bisschen abkürzen
Gruß Dieter
Deine Batch ist etwas zu kompliziert für mich.
Aber Du könntest mit diesem Beispiel eventuell noch ein bisschen abkürzen
Abs(DateDiff("n", CDate(Timestamp), Now)) <= Diff
Gruß Dieter
@76109
Grüße
bastla
Du könntest mit diesem Beispiel eventuell noch ein bisschen abkürzen
Stimmt (immerhin 19 Zeichen weniger - noch 2 wären bei einem Rückgabewert von "-1" anstatt "1" drin ); dann sähe die Zeile 9 so aus:>%C% echo WScript.Echo -(Abs(DateDiff("n",CDate(WScript.Arguments(0)),Now))^<=CInt(WScript.Arguments(1)))
bastla
@bastla
Super
Übrigens, der Trick im alten Code mit der Klammer am Split-Ende (2) war mir auch Neu. Wieder was dazugelernt.
Und wenn Du mir jetzt noch sagst, was das Zeichen '^' in "(DateAdd("n",D,Now)^>T)" zu bedeuten hat, dann bin ich gänzlich zufrieden.
Gruß Dieter
Super
Übrigens, der Trick im alten Code mit der Klammer am Split-Ende (2) war mir auch Neu. Wieder was dazugelernt.
Und wenn Du mir jetzt noch sagst, was das Zeichen '^' in "(DateAdd("n",D,Now)^>T)" zu bedeuten hat, dann bin ich gänzlich zufrieden.
Gruß Dieter
Hallo didi1954!
Grüße
bastla
Und wenn Du mir jetzt noch sagst, was das Zeichen '^' in "(DateAdd("n",D,Now)^>T)" zu bedeuten hat, dann bin ich gänzlich zufrieden.
Da das Script per Batch erzeugt wird, müssen einige Zeichen (<|>&
) mit dem "^" maskiert werden, damit der CMD-Interpreter sie eben nicht interpretiert (">" etwa führt in Batch zu einer Umleitung der Ausgabe), sondern als "gewöhnliche" Zeichen betrachtet und unverändert in die Scriptdatei schreibt.Grüße
bastla
Hallo rastikf!
Lass zur Kontrolle mit der (irgendwo zwischen den Zeilen 5 und 12 eingefügten) zusätzlichen Zeile
den Übergabeparameter anzeigen - der sollte, wie oben beschrieben, das Format
aufweisen (das VBScript "verlässt sich darauf", dass der Parameter so ankommt).
Grüße
bastla
Lass zur Kontrolle mit der (irgendwo zwischen den Zeilen 5 und 12 eingefügten) zusätzlichen Zeile
echo %Timestamp%
TT.MM.JJJJ hh:mm:ss
Grüße
bastla
Hallo Rasti,
dein ganzer Aufbau scheint mir unnötig kompliziert, wenn du Datum-Zeit Angaben in deiner Timer.xml finden willst benutze doch einfach findstr mit einer Regular Expression dafür.
Hier ist ein Testbatch, ohne Parameter aufgerufen durchsucht er sich zur Demonstration selber nach Datum/Zeit ansonsten die übergebene Datei (kann auch ein Wildcard sein)
Das Ergebnis enes Aufrufes ohne Parameter:
Gruß
LotPings
dein ganzer Aufbau scheint mir unnötig kompliziert, wenn du Datum-Zeit Angaben in deiner Timer.xml finden willst benutze doch einfach findstr mit einer Regular Expression dafür.
Hier ist ein Testbatch, ohne Parameter aufgerufen durchsucht er sich zur Demonstration selber nach Datum/Zeit ansonsten die übergebene Datei (kann auch ein Wildcard sein)
:: FindDT.cmd :::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
::Regular Expression Datum
set ReD=[0-3][0-9]\.[01][0-9]\.[12][09][0-9][0-9]
::Regular Expression Zeit
Set ReZ=[0-2][0-9]:[0-5][0-9]:[0-5][0-9]
set "Datei=%~1"
if not defined Datei set "Datei=%~f0"
echo ------------------ Datum ------------------
findstr "%ReD%" "%Datei%"
echo ------------------ Zeit ------------------
findstr "%ReZ%" "%Datei%"
echo ------------------ Datum + Zeit ------------------
findstr "%ReD%.*%ReZ%" "%Datei%"
:: Rem Beispielszeilen
:: 01.01.1900
:: 23:59:59
:: 12.06.1958
:: 12:00:00
:: 21.07.1969, 03:56:00 1. Mondlandung
:: 11.05.2009 10:40:43
Das Ergebnis enes Aufrufes ohne Parameter:
>findDT
------------------ Datum ------------------
:: 01.01.1900
:: 12.06.1958
:: 21.07.1969, 03:56:00 1. Mondlandung
:: 11.05.2009 10:40:43
------------------ Zeit ------------------
:: 23:59:59
:: 12:00:00
:: 21.07.1969, 03:56:00 1. Mondlandung
:: 11.05.2009 10:40:43
------------------ Datum + Zeit ------------------
:: 21.07.1969, 03:56:00 1. Mondlandung
:: 11.05.2009 10:40:43
Gruß
LotPings