.sessl
Goto Top

Die vorletzte Zeile einer Textdatei mittels Batch auslesen

WinSCP Übertragung von Dateien, Infomail mittels BLAT ob Übertragung erfolgreich war oder nicht, überprüfen ob Infomail versandt wurde oder nicht

Hallo zusammen,

ich habe mich in den letzten Tagen etwas mit Batch Scripting beschäftigt.
Nun stehe ich trotz intensiver Suche, hier und überall, an einem Punkt an dem ich nicht weiter komme.

Folgendes habe ich vor:

- definierte Dateien mittels WinSCP übertragen [funktioniert]
- überprüfen ob die Übertragung erfolgreich war oder nicht [funktioniert]
- Infomail mit Status mittels 'BLAT' übertragen [funktioniert manchmal]
- überprüfen ob Infomail versandt wurde [funktioniert nicht]

An sich funktioniert der Versand der Infomails, doch manchmal kommt keine Verbindung zum Mailserver zustande,
aus diesem Grund, wollte ich einfach das Logfile von Blat auslesen und eine simple Schleife erstellen.

Nun mein Problem.
Ich finde keine Möglichkeit die vorletzte Zeile auszulesen und einen Teil in eine Variable zu 'stecken'


Logfile von Blat: (oberer Teil, vom erfolgreichem Teil wurde abgeschnitten)(interessant ist die Fehlerlog)

2010.10.22 23:37:13 (Fri): <<<getline<<< 250 2.6.0  <01cb7231$Blat.v2.6.2$4a6f15a9$1114f3c93f39@192.168.40.110> Queued mail for delivery
2010.10.22 23:37:13 (Fri): >>>putline>>> QUIT
2010.10.22 23:37:13 (Fri): <<<getline<<< 221 2.0.0 PROXY1 Service closing transmission channel
2010.10.22 23:37:13 (Fri)-------------End of Session------------------

2010.10.23 22:00:16 (Sat)------------Start of Session-----------------
Blat v2.6.2 w/GSS encryption (build : Feb 25 2007 12:06:19)
2010.10.23 22:00:46 (Sat): Error: Wait a bit (possible timeout).
2010.10.23 22:00:46 (Sat): SMTP server error
2010.10.23 22:00:46 (Sat): Error: Not a socket.
2010.10.23 22:00:46 (Sat): Error: Not a socket.
2010.10.23 22:00:46 (Sat)-------------End of Session------------------


Hier nun meine Batch Datei:
@echo off

chcp 1252>nul
set ue=ü
set ae=ä
set oe=ö
set Uue=Ü
set Aae=Ä
set Ooe=Ö
set ss=ß
chcp 850>nul
set error=Error


WinSCP.com /script=scp_export_.txt /log=scp_log.txt
if errorlevel 1 goto error


:mailerfolg

blat "mail_info\erfolgreich.txt" ^  
-to max.muster@mann.de ^
-debug -timestamp -log "mail_info\blatSMTPlog.txt" ^  
-subject "WinSCP %Uue%bertragung - Erfolgreich!"  

for /f "tokens=6 delims=:, " %%a in (mail_info\blatSMTPlog.txt) do (set var1=%%a)  
if %var1%==%error% goto mailerfolg


goto end


:error
:mailfehler

blat "mail_info\fehlerhaft.txt" ^  
-to max.muster@mann.de ^
-debug -timestamp -log "mail_info\blatSMTPlog.txt" ^  
-subject "WinSCP %Uue%bertragung - Fehlerhaft!  

for /f "tokens=6 delims=:, " %%b in (mail_info\blatSMTPlog.txt) do (set var2=%%b)  
if %var2%==%error% goto mailfehler


:end

Jedoch lese ich nur die letzte Zeile mit diese FOR-Schleife aus, ich benötige die vorletze Zeile.
Hat jemand eine Idee?

Würde in der Blat-Log folgende Zeile die letzte Zeile sein, würde das Script schon funktionieren
2010.10.23 22:00:46 (Sat): Error: Not a socket


Besten Dank für Infos und Hilfestellungen
Grüße Tobias

Content-Key: 153821

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

Printed on: April 26, 2024 at 22:04 o'clock

Member: miniversum
miniversum Oct 26, 2010 at 14:32:09 (UTC)
Goto Top
Jetzt mal so aus dem Bauch raus: Ändere mal Zeile 26 in:
for /f "tokens=6 delims=:, " %%a in (mail_info\blatSMTPlog.txt) do if "%%a" neq "" (set var1=%%a)

Wobei die bessere Lösung wäre, einfach den Errorlevel abzufragen. Dafür ist der ja da face-smile
http://www.blat.net/examples/ErrorLevel2.html
Member: .Sessl
.Sessl Oct 26, 2010 at 14:45:46 (UTC)
Goto Top
Hallo miniversum,

nein, leider nicht. Die Variable %%a zieht den Wert 'of' von End of session. Also die letzte Zeile.
Nur Interesse halber, was sollte das notequal "" erreichen?


Gruß
Tobias
Member: miniversum
miniversum Oct 26, 2010 at 17:24:28 (UTC)
Goto Top
Na dann eben auf "of" kontrollieren.
Dadurch werden nur die Zeilen in die Variable übernommen in denen dieses Tocken nicht "of" ist.
Aber wie schon geschrieben wäre woll die Abfrage von errorlevel besser geeignet.
Member: .Sessl
.Sessl Oct 26, 2010 at 19:29:32 (UTC)
Goto Top
Der Link ist doch neu, oder habe ich diesen vorhin übersehen?
Btw. damit klappt es, danke. "Warum habe ich diese Lösung nicht gefunden?"


Gibt es dennoch eine Lösung für meine Frage?


Gruß
Tobias
Member: miniversum
miniversum Oct 26, 2010 at 19:43:12 (UTC)
Goto Top
Möglichkeit 1:
for /f "tokens=6 delims=:, " %%a in (mail_info\blatSMTPlog.txt) do if "%%a" neq "of" (set var1=%%a)
Ist aber unschön.
Möglichkeit 2:
Du magst es wie bisher auch, filterst aber die Zeile mit "End of Session" raus. Das geht mit findstr /v Da ist dan die letzte Zeile die die du willst. Geht aber auch nur wenn die letzte Zeile gleich ist.
Möglichkeit 3 (Die universellere Lösung):
Zähle die Zeilen der Datei (mit findstr /n oder mit for einfach durchzählen). Danach vom Wert 2 Subtrahieren. Diesen Wert dann in die For Schleife als skip einbauen und die zuweisung mit if not defined zuweisen.
Hilfen zu den beschriebenen Befehlen und Stichwörtern findest du hier im Batch und Shell Bereich genügend.

Vorzuziehen ist allerdings bei sowas auf jeden Fall die errorlevel Lösung.
Member: .Sessl
.Sessl Oct 26, 2010 at 20:50:21 (UTC)
Goto Top
Naja, Möglichkeit 1 geht nicht, da die letzte Zeile immer, bei Erfolg oder Misserfolg, im Logfile steht.
Möglichkeit 2 und 3 müsste ich mal ausprobieren.

Danke für die schnelle Hilfe.
Member: miniversum
miniversum Oct 27, 2010 at 10:45:43 (UTC)
Goto Top
Warum soll dann Möglichkeit 1 nicht gehen?
for /f "tokens=6 delims=:, " %%a in (mail_info\blatSMTPlog.txt) do if "%%a" neq "of" (set var1=%%a)
Sollte dir dennoch die vorletzte Zeile liefern
Member: .Sessl
.Sessl Oct 29, 2010 at 11:38:52 (UTC)
Goto Top
Nein leider nicht.
Wenn ich mir die Variable %var1% ausgeben lassen, steht immer of drin.

Er landet also in einer endlos Schleife.