ralf82
Goto Top

For-Schleife mit findstr

Hallo alle zusammen,

ich benötige etwas Hilfe bei einem Problem.

Ich habe auf einem Server eine Alarmierungs-Software laufen die für vom eigenen Betrieb Log-Dateien erstellt. Leider kommt es hin und wieder mal vor, dass das übergeordnete System Fehler produziert. In den Log-Files sind die eindeutig beschrieben.
Nun möchte ich die Log-Files mittels Batch-Datei auswerten. Das Skript soll über den Aufgabenplaner zeitgesteuert die Log-File aufrufen und die letzten X-Zeilen nach dem Fehlertext suchen. Wenn gefunden wurde, was ich gesucht habe, soll mir eine E-Mail gesendet werden.

Folgendes habe ich bisher erreicht:

  • der Name für die Tages-Logfile wird erstellt
  • die Anzahl der Zeile in der Logfile wird bestimmt
  • die Anzahl der Zeile die übersprungen werden können werden berechnet
  • Ausgabe der zu prüfenden Zeilen

Ich hänge jetzt an der Stelle, das ich die Zeile ausgegeben bekomme, allerdings schaffe ich es nicht diese auf meinen Fehlerwert zu prüfen. Meine Code für die Prüfung sieht folgendermaßen aus:

for /f "skip=%var% usebackq tokens=*" %%f in (%aip%) do (  
	findstr "analog=4201" %%f	  
 )

Auf dem unteren Bild ist zu sehen wir die Zeilen aussehen. Im oberen Bild ist zu sehen was darauf gemacht wird, wenn ich mit findstr suche.

Kann man jemand mir jemand helfen wie ich es schaffe richtig in den Zeilen zu suchen?

Vielen Dank im Vorraus

Gruß Ralf
01_mitfehler
01_nuranzeige

Content-ID: 2799768312

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

niewiederit
niewiederit 16.05.2022 um 14:51:37 Uhr
Goto Top
Hallo,

für mich sieht es so aus als wäre der Wert, in der Variable %%f, falsch.

FINDSTR erwartet hier einen Dateinamen Dein Wert ist aber der,
der im ersten Bild, nach "FINDSTR:" und vor "kann nicht geöffnet werden" steht:

FINDSTR: "Command" kann nicht geöffnet werden
FINDSTR: "code" kann nicht geöffnet werden
...

Viele Grüße
colinardo
colinardo 16.05.2022 aktualisiert um 15:55:09 Uhr
Goto Top
Servus.
Wie @niewiederit schon sagt findstr erwartet einen Dateinamen und nicht den Inhalt als letzten Parameter.
Dafür brauchst du aber ehrlich gesagt keinen FOR-Loop, hierfür reicht:
more +%var% "E:\datei.log" | findstr /ilc:"analog=4201"   
Falls die Zeilen doch einzeln abgearbeitet werden müssen und in %aip% der Inhalt steht .... musst du den Inhalt an findstr "pipen", dann arbeitet es mit dem ihm übergebenen Inhalt.
for /f "skip=%var% delims=" %%f in ('echo.%aip% ^| findstr /ilc:"analog=4201"') do (  
   echo %%f
 )
Grüße Uwe
Ralf82
Ralf82 16.05.2022 um 15:43:06 Uhr
Goto Top
Hi,

vielen Dank für eure Antworten. Den ersten Vorschlag hatte ich zuerst auch. Da die Datei am Tagesende allerdings bis zu 180.000 Zeilen haben kann und ich nur auf Neueinträge seit des letzten Aufrufs reagieren möchte, sollen nur die letzten Zeilen durchsucht werden. Also von %var% an bis zum Schluss. In %aip% steht der zusammengesetzte Dateiname.

Wenn ich das zweite Beispiel bei mir integriere, bricht er ohne Fund ab.

Vielen Dank

Gruß Ralf
colinardo
Lösung colinardo 16.05.2022 aktualisiert um 15:55:53 Uhr
Goto Top
In %aip% steht der zusammengesetzte Dateiname.
Dann kann das zweite Beispiel oben nicht funktionieren, denn ich ging hier davon aus das in der Variablen der Inhalt steht nicht der Dateiname. Wenn darin der Dateiname steht musst du es stattdessen so schreiben um es mit einem For-Loop zu verarbeiten
for /f "delims=" %%f in ('findstr /ilc:"analog=4201" "%aip%"') do (  
   echo %%f
 )
bzw. mit Überspringen von einer Anzahl an Zeilen
for /f "delims=" %%f in ('more +%var% "%aip%" ^| findstr /ilc:"analog=4201"') do (  
    echo %%f
 )
Ralf82
Ralf82 16.05.2022 um 15:55:42 Uhr
Goto Top
Jetzt funktioniert es.

Vielen vielen Dank.

Schöne Grüße aus dem Norden

Ralf