Forum: PC-Programmierung Batchdatei: Wenn in Zeile a x steht mache nix sonst mache B


von Batch-Neuling (Gast)


Lesenswert?

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.

von Bernd K. (prof7bit)


Lesenswert?

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)?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Batch-Neuling (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Batch-Neuling schrieb:
> würde ich die scripte über haupt ausführen können?

Natürlich. Notfalls rufst Du sie über eine Batchdatei auf.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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
von Bernd K. (prof7bit)


Lesenswert?

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
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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! ;-)

von Bernd K. (prof7bit)


Lesenswert?

Frank M. schrieb:
> Sorry, ich hatte Dich tatsächlich falsch verstanden.

Entschuldigung angenommen, hab mich auch schon wieder beruhigt ;-)

von Jan L. (ranzcopter)


Lesenswert?

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...

von Mario M. (thelonging)


Lesenswert?

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
von Batch-Neuling (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.