2016-06-16 5 views
0

Ich versuche, einen Stapel zu schreiben, um nach einem Schlüsselwort wie "Fehlgeschlagen" "Fehler" in einer Protokolldatei zu suchen und die Bedingung in eine andere Datei zu schreiben.Windows-Stapel zum Suchen nach Schlüsselwörtern in einer Datei und Anwenden der Bedingung

Beispiel: a.) Abc.log ... search.bat - wenn abc.log ein Wort wie "Error" oder "Failed" hat, ECHO "DATA LOAD FAILED" Sonst ECHO "DATA LOAD SUCCESS"

diese versuchte,

for /F "delims=" %%a in ('findstr /I /c:"EPMAT" C:\Temp_logs\ExpDataload.log') do set ErrorCount=%%a 

IF /I "%ErrorCount%" == "EPMAT-1:Command Failed to execute." (
    SET Message="DATA LOAD FAILED" 
) ELSE (
    SET Message="DATA LOAD SUCCESS" 
) 

ECHO %Message% 

Aber% Errorcount% wird die gesamte Zeile zu speichern, statt Stichwort. Also habe ich sogar versucht, die gesamte Zeile zu überprüfen, immer noch zeigt es "DATA LOAD SUCCESS" anstelle von FAILED.

Ich vermisse etwas in der IF-Bedingung.

+0

Haben Sie PowerShell hier markiert, weil Sie ein PowerShell-Skript verwenden können? –

+0

Entschuldigung, ich suche gerade nach einer Windows-Batch-Lösung. Vielen Dank. – cec4111

Antwort

0

findstr gibt die übereinstimmenden Zeilen aus, die gefunden werden. Ihre Schleife weist nacheinander jede Zeile dieses Ausgangs ErrorCount zu.

Also, nach der Schleife wird die Variable halten letzten Spiel gefunden, was Ihr Problem sein kann, wenn Sie vielleicht versuchen, mit dem ersten Spiel zu vergleichen.

Aber, wenn keine Übereinstimmung gefunden wurde, wird die Variable tatsächlich leer sein, so dass Sie nur zu "" vergleichen können:

IF /I "%ErrorCount%" == "" (
    SET Message="DATA LOAD SUCCESS" 
) ELSE (
    SET Message="DATA LOAD FAILED" 
) 

Alternativ, wenn Sie nicht wirklich interessiert sind, in der aktuellen Zeile gefunden, nur Überprüfen Sie den Fehlerlevel wie in @ TesselationHecklers Antwort.

0

In einem Test, der Skriptform funktioniert für mich. Und ja, ErrorCount wird die ganze Zeile - ich kann nur vermuten, dass es einige nicht übereinstimmende Leerzeichen gibt, wo die Zeichenfolgen nicht gleich sind. Können Sie einige Zeilen aus ExpDataload.log veröffentlichen?

Als alternativer Ansatz kann findstr nach mehreren Worten suchen, und setzt einen Return/Errorlevel von 0, wenn es eine Übereinstimmung oder 1 findet, wenn es fehlschlägt:

findstr /I "failed error" c:\temp_logs\expdataload.log 
if NOT ERRORLEVEL 1 (
    echo "DATA LOAD FAILED" 
) else (
    echo "DATA LOAD SUCCESS" 
) 

Bearbeiten mit Änderung des @ aschipfl zu machen ... Arbeit. : - |

+0

Es tut uns leid, diese Arbeit, es zeigt "DATA LOAD SUCCESS" auch nach dem Auffinden von Fehlern. – cec4111

+0

Ich denke, ich könnte nur die Logik umgekehrt und gebrochen haben. Versuchen Sie diese bearbeitete Version. – TessellatingHeckler

+1

@TesselingHeckler, 'wenn ErrorLevel 0' prüft, ob' ErrorLevel' * * 0 oder größer * ist! Sie müssen es durch "wenn nicht ErrorLevel 1" ersetzen. – aschipfl

Verwandte Themen