malli88
Goto Top

TXT Nach String durchsuchen und Zeilennummer als errorlevel schreiben.

Hallo zusammen.

Ich habe die hoheitliche Aufgabe bekommen eine known errordatenbank zu schreiben.
Hier die Ausgangssituation:
Wir haben mehrer Batchscripte
Die Scripte sollen wenn ein bekannter Fehler, der als String in einer knownerror.txt gespeichert ist diese Datei danach durchsuchen und die Zeilennummer als Errorlevel zurück geben.
Geht sowas überhaupt mit Batch?

Bitte um Hilfe.

Danke!!!

Content-Key: 244217

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

Printed on: April 23, 2024 at 20:04 o'clock

Member: Gersen
Solution Gersen Jul 21, 2014 updated at 12:34:13 (UTC)
Goto Top
Hallo,

so etwas:

for /f "tokens=1 delims=:" %%i in ('findstr /n /c:"fehlerstring" "knownerror.txt"') do (  
echo gefunden in Zeile: %%i
exit /B %%i 
)

Gruß,
Gersen
Member: Malli88
Malli88 Jul 21, 2014 at 12:34:27 (UTC)
Goto Top
Du bist der König!

face-big-smile
Member: Malli88
Malli88 Jul 21, 2014 at 12:39:12 (UTC)
Goto Top
Hast du zufällig noch ne Idee wie ich den Errorstate eines WINSCP an das ausführende Batchscript übergeben kann?
Wenn ich absichtlich einen Error 2 in WINSCP produziere bekomme ich in dem Shellscript immer nur einen Error 1.
Member: Gersen
Gersen Jul 21, 2014 at 13:09:57 (UTC)
Goto Top
Für jeden Befehl der Batch wird der Returncode in eine Variable "ERRORLEVEL" geschrieben - und durch den nächsten Befehl wieder überschrieben.
winscp.com ...
if %errorlevel% neq 0 exit /b %errorlevel%
Hier würde für den Fall, dass der WinSCP-Befehl nicht erfolgreich verläuft (Returncode != 0), das Skript mit dem Returncode von WinSCP verlassen.
Member: Malli88
Malli88 Jul 21, 2014 at 13:14:17 (UTC)
Goto Top
Das funktioniert aber leider nicht.

Hier mal ein Log von dem besagten WINSCP befehl.

2014-07-21 14:36:59.789+0200 [info] C:\ABITDATAtest\Import
2014-07-21 14:36:59.789+0200 [info] Fehler beim Wechseln in Verzeichnis '/home/ftproot/multiversa/daa'.
2014-07-21 14:36:59.789+0200 [info] Kann den realen Pfad für '/home/ftproot/multiversa/daa' nicht ermitteln.
2014-07-21 14:36:59.789+0200 [info] Datei oder Verzeichnis nicht gefunden.
2014-07-21 14:36:59.789+0200 [info] Fehlercode: 2
2014-07-21 14:36:59.789+0200 [info] Fehlernachricht vom Server : No such file
2014-07-21 14:36:59.789+0200 [info] /
2014-07-21 14:36:59.789+0200 [info] ---------------------------------------------------------------------------------
2014-07-21 14:36:59.789+0200 [info] errorlevel 1
2014-07-21 14:36:59.791+0200 [info] SCHEDULER-915 Process event
2014-07-21 14:36:59.793+0200 [ERROR] SCHEDULER-280 Process terminated with exit code 1 (0x1)
2014-07-21 14:36:59.795+0200 [WARN] SCHEDULER-845 Task ended without processing the order. The order remains in job's order queue in the same state
2014-07-21 14:36:59.796+0200 [info] SCHEDULER-843 Task has ended processing of Order TEST:TEST, state=SFTPImport, on JobScheduler
Member: Gersen
Solution Gersen Jul 21, 2014 updated at 13:52:17 (UTC)
Goto Top
Ja. Mea culpa - ich lese hier:

"WinSCP executables return exit code 1, when any command is interrupted due to an error or any prompt is answered Abort (even automatically in batch mode). Otherwise it returns the exit code 0."

Ein Weg wäre, das XML-Logging zu verwenden - und für den Fall, dass WinSCP mit dem RC 1 abbricht, die XML-Datei zu parsen. Aber ob sich der Aufwand lohnt...?
Member: Malli88
Malli88 Jul 21, 2014 at 13:52:33 (UTC)
Goto Top
Danke du hast mir sehr weitergeholfen!!!!
Member: Malli88
Malli88 Jul 21, 2014 at 14:03:12 (UTC)
Goto Top
Leider muss ich dich doch nochmal belästigen. Sorry, bin echt ein totaler Anfänger in Batch.
Wie kann ich den den Errorcode der im WinSCP erzeugt wird in eine Variable packen und diese im Batch auslesen um ggf. damit zu Parsen?
Member: Gersen
Gersen Jul 21, 2014 updated at 14:50:11 (UTC)
Goto Top
Ein Versuch wäre (anhand der Struktur Deiner Log-Datei):

echo. > C:\temp\winscp.log
winscp.com {Deine Parameter} /log="C:\temp\winscp.log"  
if %errorlevel% neq 0 (
for /f "tokens=1,2,3,4 delims=:" %%i in ('findstr /c:"Fehlercode:" "C:\temp\winscp.log"') do (  
echo Fehlercode ist %%l 
exit /B %%l
)
)