Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Mit Batch Datensätze auslesen und weiterverarbeiten

Frage Entwicklung Batch & Shell

Mitglied: rastikf

rastikf (Level 1) - Jetzt verbinden

08.05.2009, aktualisiert 09.05.2009, 6055 Aufrufe, 13 Kommentare

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

Mit freundlichen Grüßen
Rasti
Mitglied: rubberman
09.05.2009 um 02:10 Uhr
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
01.
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.
Bitte warten ..
Mitglied: bastla
09.05.2009 um 11:05 Uhr
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:
01.
@echo off & setlocal 
02.
:: 
03.
:: Auslesen der Zeile 3 in die Variable %Text% 
04.
:: 
05.
set "Timestamp=%Text:~19,10% %Text:~39,8%" 
06.
set "Diff=5" 
07.
 
08.
set C=%Temp%\CheckTimestamp.vbs 
09.
>%C% echo T=CDate(WScript.Arguments(0)):D=WScript.Arguments(1):WScript.Echo (DateAdd("n",-D,Now)^<T)*(DateAdd("n",D,Now)^>T) 
10.
for /f %%i in ('cscript //nologo %C% "%Timestamp%" %Diff%') do set "OK=%%i" 
11.
 
12.
if "%OK%"=="1" ( 
13.
    echo Aktuell 
14.
) else ( 
15.
    echo Nicht aktuell 
16.
)
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]
Bitte warten ..
Mitglied: LotPings
09.05.2009 um 11:14 Uhr
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
Bitte warten ..
Mitglied: 76109
09.05.2009 um 12:38 Uhr
Hallo bastla,

Deine Batch ist etwas zu kompliziert für mich.

Aber Du könntest mit diesem Beispiel eventuell noch ein bisschen abkürzen

01.
Abs(DateDiff("n", CDate(Timestamp), Now)) <= Diff
Gruß Dieter
Bitte warten ..
Mitglied: bastla
09.05.2009 um 13:59 Uhr
@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 ); 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
Bitte warten ..
Mitglied: 76109
09.05.2009 um 14:35 Uhr
@bastla

Zitat von bastla:
Stimmt (immerhin 19 Zeichen weniger

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
Bitte warten ..
Mitglied: bastla
09.05.2009 um 14:43 Uhr
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
Bitte warten ..
Mitglied: rastikf
09.05.2009 um 19:42 Uhr
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!

Mit freundlichen Grüßen
Rasti
Bitte warten ..
Mitglied: rastikf
10.05.2009 um 13:30 Uhr
@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
Mit freundlichen Grüßen
Rasti
Bitte warten ..
Mitglied: bastla
10.05.2009 um 13:35 Uhr
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
Bitte warten ..
Mitglied: rastikf
10.05.2009 um 13:44 Uhr
Hallo Bastla,
hät ich ja auch drauf kommen können... hab den Fehler gefunden er hat tatsächlich nicht das richtige Format übermittelt. Habs angepasst und funktioniert jetzt bestens!
Vielen Dank nochmal an alle, habt mir sehr geholfen

Mit freundlichen Grüßen
Rasti
Bitte warten ..
Mitglied: rastikf
10.05.2009 um 23:14 Uhr
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

Mit freundlichen Grüßen
Rasti
Bitte warten ..
Mitglied: LotPings
11.05.2009 um 10:53 Uhr
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)
01.
:: FindDT.cmd ::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
@echo off 
03.
::Regular Expression Datum 
04.
set ReD=[0-3][0-9]\.[01][0-9]\.[12][09][0-9][0-9] 
05.
 
06.
::Regular Expression Zeit 
07.
Set ReZ=[0-2][0-9]:[0-5][0-9]:[0-5][0-9] 
08.
 
09.
set "Datei=%~1" 
10.
if not defined Datei set "Datei=%~f0" 
11.
 
12.
echo ------------------ Datum ------------------ 
13.
findstr "%ReD%" "%Datei%" 
14.
 
15.
echo ------------------ Zeit ------------------ 
16.
findstr "%ReZ%" "%Datei%" 
17.
 
18.
echo ------------------ Datum + Zeit ------------------ 
19.
findstr "%ReD%.*%ReZ%" "%Datei%" 
20.
 
21.
:: Rem Beispielszeilen 
22.
::  01.01.1900 
23.
::  23:59:59 
24.
:: 12.06.1958  
25.
:: 12:00:00 
26.
:: 21.07.1969, 03:56:00  1. Mondlandung 
27.
:: 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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst Mit batch zeilen auslesen (2)

Frage von keksegriller zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
Per Batch aktuell angemeldete User auslesen (1)

Frage von Peter32 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (12)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...