Hallo Zusammen,
Ich habe eine Software A, die Ereignisgesteuert Batchdateien aufruft und
eine Software B, welche bei Veränderung in einem Logfile den Inhalt
verarbeitet. Das Logfile soll sich nur ändern wenn in Zeile 3 ein
anderer Ereigniscode steht.
Das Logfile (file.log) sieht wie folgt aus:
" Ereignisauslösung
'Ereignisbezeichnung'"
Das Muster der durch die Software A aufgerufenen Batchdatei sieht wie
folgt aus:
[code]
> file.log(
echo Ereignisauslösung
echo.
echo 'Ereignisbezeichnung'
)
[\code]
Die Software A löst in unregelmäßigen Abständen die Ereignisse aus und
ruft eine die entsprechende Batchdateien auf. Es funktioniert auch
super, aber wenn zwei mal hintereinander das gleiche Ereignisausgelöst
wurde darf in Software B keine Verarbeitung des Logfiles statt
finden(somit das Logfile nicht verändert und auch nicht gespeichert
werden).
Die Logik für die Lösung müsst also heißen:
Wenn in Zeile 3 des Logfile Ereignisbezeichnung Y mache nix sonst
schreibe das Logfile mit der anderen Ereignisbezeichnung und speicher.
Leider bin ich im Batchfile schreiben Neuling. Könnt ihr mir da weiter
helfen?
Ich weiß das ich so für beliebig viele Ereignisbezeichnung ebenso viele
Batchfiles brauche die alle fast gleich aussehen. Der schönste weg wäre
näturlich beliebig viel Batchfiles in den ich nur noch den Speicherort
des Logfiles und die Ereignisbezeichnung in zwei Variablen speichere und
ein Batchfile mit der Logik aufrufe, welches Verarbeitung macht.
Ich bin über jede Hilfe dankbar.
Batch-Neuling schrieb: > ein Batchfile mit der Logik aufrufe Ich weiß nicht ob das auf lange Sicht Spaß macht zu versuchen allein mit den doch recht wenigen und sperrigen Mitteln die simple Batch-Files bieten solche Dinge zu programmieren. Wie wäre es stattdessen eine etwas ergonomischere und freundlichere Script-Sprache zu verwenden (also so ziemlich JEDE andere Sprache außer cmd.exe batch)?
Mit for kann man in Batchdateien andere Dateien zeilenweise verarbeiten. Gib' mal in einem Konsolenfenster "for -?" ein und lies Dir den angezeigten Hilfetext durch. Einfacher ist allerdings die Verwendung einer Skriptsprache; jedes Windows seit 1999 kennt vbscript bzw. jscript, die damit geschriebenen Skripte werden vom "Windows Scripting Host" ausgeführt, der in der Konsole mit cscript aufgerufen wird. In so einem Skript kann auf das Dateisystem zugegriffen werden, und es ist VB- bzw.- Javascriptartige Textinterpretation-/Verarbeitung möglich. https://en.wikipedia.org/wiki/Windows_Script_Host Neuere Windows-Versionen bieten dann noch die "PowerShell", mit der wiederum andere Dinge möglich sind.
Ich muss gestehen mit skriptsprache habe ich mich noc garnicht beschäftig. Ich kann in der Software A bat/exe aufrufen. würde ich die scripte über haupt ausführen können? An der Menge der Dateine wird sich auf Grund der Softwarefunktionalität von Software A nix ändern lassen. wenn Ihr mir bei einer Musterscriptdatei helft würde ich auch das versuchen.
Batch-Neuling schrieb: > würde ich die scripte über haupt ausführen können? Natürlich. Notfalls rufst Du sie über eine Batchdatei auf.
Bernd K. schrieb: > Ich weiß nicht ob das auf lange Sicht Spaß macht zu versuchen allein mit > den doch recht wenigen und sperrigen Mitteln die simple Batch-Files > bieten solche Dinge zu programmieren. Du hast offenbar keine Ahnung, was man mit der Shell alles anstellen kann. In Verbindung mit den vielen kleinen Unix-Tools kann man sich mächtige Programme zusammenbauen. Ich selber habe schon komplette Menüprogramme inkl. rekursiver Installationsprozeduren mit der Shell gebaut (eisfair-Admin-Menüs). Auf "bashisms" (bash-spezifische Erweiterungen) kann man dabei sogar verzichten, da schon die Standard-Shell alles bietet, was man braucht. Hier mal das vorgestellte Problem stufenweise gelöst: Die ersten 3 Zeilen aus Datei, z.B. /etc/passwd:
1 | head -3 </etc/passwd |
Ausgabe:
1 | root:x:0:0:root:/root:/bin/bash |
2 | daemon:x:1:1:daemon:/usr/sbin:/bin/sh |
3 | bin:x:2:2:bin:/bin:/bin/sh |
Davon die letzte Zeile ist die 3. Zeile:
1 | head -3 </etc/passwd | tail -1 |
Ausgabe:
1 | bin:x:2:2:bin:/bin:/bin/sh |
Wenn darin ein x ist, Meldung ausgeben:
1 | if head -3 </etc/passwd | tail -1 | fgrep "x" |
2 | then |
3 | echo x ist vorhanden |
4 | else |
5 | echo x ist nicht vorhanden |
6 | fi |
Ausgabe:
1 | bin:x:2:2:bin:/bin:/bin/sh |
2 | x ist vorhanden |
Ausgabe von fgrep unterdrücken:
1 | if head -3 </etc/passwd | tail -1 | fgrep "x" >/dev/null |
2 | then |
3 | echo x ist vorhanden |
4 | else |
5 | echo x ist nicht vorhanden |
6 | fi |
Ausgabe:
1 | x ist vorhanden |
Oder in einer Zeile:
1 | if head -3 </etc/passwd | tail -1 | fgrep x >/dev/null; then echo x ist vorhanden; else echo x ist nicht vorhanden; fi |
Fertig. Ist insgesamt in unter einer Minute realisiert. Es geht auch noch einfacher, wenn man sed bzw. ed statt head und tail verwendet. Ich wollte es hier erstmal einfach halten, ohne direkt mit Kanonen aufzufahren. Mit sed bzw. ed kann man die Daten noch manipulieren, bevor man sie auswertet, mit grep statt fgrep gehen auch noch zusätzlich reguläre Ausdrücke. Da kann man dann aus den vollen schöpfen... wenn man will :-) P.S. Hier noch die kürzere Version mit sed:
1 | if sed -n '3,3 p' </etc/passwd | fgrep x >/dev/null; then echo x ist vorhanden; else echo x ist nicht vorhanden; fi |
:
Bearbeitet durch Moderator
Frank M. schrieb: > Du hast offenbar keine Ahnung, was man mit der Shell alles anstellen > kann. In Verbindung mit den vielen kleinen Unix-Tools kann man Du hast offenbar eine Leseschwäche. Die solltest Du dringend korrigieren bevor Du anderen Leuten keine Ahnung unterstellst. An keiner Stelle habe ich auf etwas anderes Bezug genommen als reines Batch (Ba TC h mit TC! Von Microsoft!). Von Unix-Tools war keine Rede und auch nicht von sowas wie einer vernünftigen Shell.
:
Bearbeitet durch User
Bernd K. schrieb: > Du hast offenbar eine Leseschwäche. Die solltest Du dringend korrigieren > bevor Du anderen Leuten keine Ahnung unterstellst. Sorry, ich hatte Dich tatsächlich falsch verstanden. > An keiner Stelle habe > ich auf etwas anderes Bezug genommen als reines Batch (Ba TC h mit TC! > Von Microsoft!). Von Unix-Tools war keine Rede und auch nicht von sowas > wie einer vernünftigen Shell. Das nicht vorhande Wort "Windows" hatte ich im Eröffnungsposting ebenso überlesen. Tut mir leid! ;-)
Frank M. schrieb: > Sorry, ich hatte Dich tatsächlich falsch verstanden. Entschuldigung angenommen, hab mich auch schon wieder beruhigt ;-)
Frank M. schrieb: > > Das nicht vorhande Wort "Windows" hatte ich im Eröffnungsposting ebenso > überlesen. Tut mir leid! ;-) Naja, hätte er .BAT-Datei geschrieben, wär's klar gewesen - "Batchdatei" ist für mich eigentlich auch nicht fest auf "DOS-Derivat" abonniert...
Wenn ich die Aufgabenstellung richtig verstanden habe, müssten die Batchdateien wie folgt aussehen:
1 | @echo off |
2 | set logfile=file.log |
3 | set event=EVENT123 |
4 | for /f "skip=2" %%v in (%logfile%) do set lastev=%%v |
5 | if "%lastev%" == "%event%" goto :ende |
6 | echo Ereignisauslösung>%logfile% |
7 | echo.>>%logfile% |
8 | echo %event%>>%logfile% |
9 | :ende |
:
Bearbeitet durch User
endlich habe wieder mal Zeit weiter zu machen. Danke Mario. Der Code macht genau das was er soll.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.