rastikf
Goto Top

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

Content-ID: 115644

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

Ausgedruckt am: 15.11.2024 um 13:11 Uhr

rubberman
rubberman 09.05.2009 um 02:10:32 Uhr
Goto Top
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
echo %Text:~19,10%
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.
bastla
bastla 09.05.2009 um 11:05:51 Uhr
Goto Top
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:
@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
)
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]
77559
77559 09.05.2009 um 11:14:24 Uhr
Goto Top
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
76109
76109 09.05.2009 um 12:38:43 Uhr
Goto Top
Hallo bastla,

Deine Batch ist etwas zu kompliziert für mich.

Aber Du könntest mit diesem Beispiel eventuell noch ein bisschen abkürzenface-smile

Abs(DateDiff("n", CDate(Timestamp), Now)) <= Diff  

Gruß Dieter
bastla
bastla 09.05.2009 um 13:59:54 Uhr
Goto Top
@76109
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 face-wink); dann sähe die Zeile 9 so aus:
>%C% echo WScript.Echo -(Abs(DateDiff("n",CDate(WScript.Arguments(0)),Now))^<=CInt(WScript.Arguments(1)))
Grüße
bastla
76109
76109 09.05.2009 um 14:35:26 Uhr
Goto Top
@bastla

Zitat von @bastla:
Stimmt (immerhin 19 Zeichen weniger

Superface-smile

Ü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
bastla
bastla 09.05.2009 um 14:43:34 Uhr
Goto Top
Hallo didi1954!
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
rastikf
rastikf 09.05.2009 um 19:42:17 Uhr
Goto Top
Vielen Dank schonmal für die zahlreichen Vorschläge! Ich werde die Sachen nachher mal alle durcharbeiten und werde mich nochmal melden falls ein paar fragen dazu noch bestehen sollten!

MFG
Rasti
rastikf
rastikf 10.05.2009 um 13:30:16 Uhr
Goto Top
@bastla
hi, dein script sieht ja ziemlich gut aus, bloß wirft er bei mir eine fehlermeldung raus, nämlich: Laufzeitfehler in VBScript: Typen unverträglich 'CDATE' !!!
Da scheint dem etwas nicht zu gefallen! was könnte das sein?
Danke
MFG
Rasti
bastla
bastla 10.05.2009 um 13:35:44 Uhr
Goto Top
Hallo rastikf!

Lass zur Kontrolle mit der (irgendwo zwischen den Zeilen 5 und 12 eingefügten) zusätzlichen Zeile
echo %Timestamp%
den Übergabeparameter anzeigen - der sollte, wie oben beschrieben, das Format
TT.MM.JJJJ hh:mm:ss
aufweisen (das VBScript "verlässt sich darauf", dass der Parameter so ankommt).

Grüße
bastla
rastikf
rastikf 10.05.2009 um 13:44:35 Uhr
Goto Top
Hallo Bastla,
hät ich ja auch drauf kommen können... hab den Fehler gefunden face-smile er hat tatsächlich nicht das richtige Format übermittelt. Habs angepasst und funktioniert jetzt bestens!
Vielen Dank nochmal an alle, habt mir sehr geholfen

MFG
Rasti
rastikf
rastikf 10.05.2009 um 23:14:53 Uhr
Goto Top
Hey, hab noch eine kurze ergänzende frage zu meiner Batch! Momentan sieht das Ganze so aus:
@echo off & setlocal
del Abgleich.xml
del checktimestamp.vbs
:start
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ C:\timer.xml) do @(
for /L %%a in (3,3,3) do @if %%i==%%a @echo %%j >> Abgleich.xml
)
for /F "Tokens=*" %%i in (C:\Abgleich.xml) do set Aufnahme=%%i
set "Timestamp=%Aufnahme:~62,10% %Aufnahme:~81,8%"
set "Diff=5"

set C=C:\CheckTimestamp.vbs
%C% echo WScript.Echo -(Abs(DateDiff("n",CDate(WScript.Arguments(0)),Now))^<=CInt(WScript.Arguments(1)))
for /f %%i in ('cscript //nologo %C% "%Timestamp%" %Diff%') do set "OK=%%i"

if "%OK%"=="1" (
goto :end
exit
) else (
goto :start1
)

sie tut genau das was ich will, bloß wenn nun die auszulesenden Daten (Datum,Zeit) sich nicht in Zeile 3 befinden hab ich ein Problem!Also entweder ich bau mir ne schleife für alle Eventualitäten, was meine momentane lösung ist, oder ich lasse einfach alle Zeilen nach dem Datum und der Zeit auswerten, was deutlich bequemer wäre. Sprich egal wo Datum und Zeit in diesem Dokument sind er wärtet es aus und führt die entsprechende Aktion aus. Das was es einfacher macht ist, das im auszuwertendem Dokument, Datum,Zeit immer in einer Zeile stehen, also muss er nur Zeilenweise auswerten, nur soll er Zeile für Zeile nach den jeweiligen Variablen ausschau halten. Wenn mir dabei noch jemand helfen würde...
Vielen Dank schonmal

MFG
Rasti
77559
77559 11.05.2009 um 10:53:33 Uhr
Goto Top
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)
:: 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