oskar231
Goto Top

tsv-Datei zeilenweise in Variable übernehmen

Hallo!

Ich möchte erstellte Event(error)logs übersichtlich aufbereiten und per Mail (Blat) versenden.

Die Logs möchte ich also auslesen (Spaltenzahl immer 2, Zeilenzahl variabel) und in EINE Variable schreiben, die ich später im Mailbody positionieren kann. Die Tabs zum Trennen der Spalten und die Umbrüche zum Trennen der Zeilen sollten mit übernommen werden.

Bisher habe ich geschafft die letzte Zeile einer Datei in eine Variable zu bekommen:

For /f "tokens=1-2 delims= " %%G IN (eventlog\SYSTEM_error.tsv) DO set SYS_error=%%G %%H

Kann ich an die Variable "%SYS_error%" irgendwie mit jedem Schleifendurchlauf das aktuelle Ergebnis anhängen?

Am besten wäre wenn in der Variable "%SYS_error%" folgendes stände:

%SYS_error% =
"Wert1_Zeile1 Wert2_Zeile1<br>Wert1_Zeile2 Wert2_Zeile2<br>Wert1_Zeile3 Wert2_Zeile3<br>Wert1_Zeile4 Wert2_Zeile4 ..."

Gruß,
Oskar231

Content-Key: 78158

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

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

Member: Biber
Biber Jan 15, 2008 at 08:22:15 (UTC)
Goto Top
Moin Oskar231,

willkommen im Forum.
Wegen zwei Verständnisproblemen muss ich noch einmal nachfragen.
a) variable Zeilenzahl je Event hab ich verstanden... aber was ist das kriterium, an dem Du ein "neues" Ereignis erkennst? Kannst Du mal bitte so zwei, drei "events" mit diesen mehrzeiligen einträgen aus der Logdatei posten?
b) ein "echter" Zeilenbruch, also so etwas wie ein cbCRLF in VBScript innerhalb einer Umgebungsvariablen geht im Batch nicht. Was natürlich ginge ist dieses "<br>"-Tag, falls Du eine HTML-Mail schreibst. Falls nicht, falls Du also eine reine Textmail erzeugen willst, bekommen wir ja auch ein mehrzeiliges Layout hin, aber eben nicht mit einer Variablen. Wie ist da der Plan?

Grüße
Biber
Member: Oskar231
Oskar231 Jan 15, 2008 at 08:56:02 (UTC)
Goto Top
a) variable Zeilenzahl je Event hab ich
verstanden... aber was ist das kriterium, an
dem Du ein "neues" Ereignis
erkennst? Kannst Du mal bitte so zwei, drei
"events" mit diesen mehrzeiligen
einträgen aus der Logdatei posten?

So sieht die Error-Logdatei(SYSTEM_error.tsv) für z.B. System aus:

Quelle Ereignis
Cdrom 7
Kerberos 7
Print 33
NETLOGON 5719
Service Control Manager 7000
Service Control Manager 7006
Service Control Manager 7026
Service Control Manager 7031
Service Control Manager 7034
DCOM 10005

bei den *.tsv sind die spalten Tab-getrennt.

b) ein "echter" Zeilenbruch, also
so etwas wie ein cbCRLF in VBScript innerhalb
einer Umgebungsvariablen geht im Batch nicht.
Was natürlich ginge ist dieses
"<br>"-Tag, falls Du eine
HTML-Mail schreibst. Falls nicht, falls Du
also eine reine Textmail erzeugen willst,
bekommen wir ja auch ein mehrzeiliges Layout
hin, aber eben nicht mit
einer Variablen. Wie ist
da der Plan?

Die generierte Mail wird als html verschickt, allein schon aus Layoutgründen.

Hiermit bekomme ich schonmal eine "Verkettung" der Einzelergebnisse:


@echo off & setlocal
For /f "tokens=1-2 delims= " %%G IN (eventlog\SYSTEM_error.tsv) DO call :ProcessLog "%%G %%H"
goto :ProcessMail

:ProcessLog
set SYS_error=%SYS_error% %1 %2
goto :eof

:ProcessMail
...


Nicht aber eine passende Formatierung:

%SYS_error% =
"Wert1_Zeile1 Wert2_Zeile1<br>Wert1_Zeile2 Wert2_Zeile2<br>Wert1_Zeile3 Wert2_Zeile3<br>Wert1_Zeile4 Wert2_Zeile4 ..."
Member: Biber
Biber Jan 15, 2008 at 09:42:37 (UTC)
Goto Top
Hmmm, sicher bin ich nicht, ob ich Punkt a) richtig verstanden habe...

Ein versuch:
:: ----snipp BspEvent.cmd
@echo off & setlocal
##Uncomment this line und comment next## Set "Tsv=eventlog\SYSTEM_error.tsv"  
Set "tsv=E:\schnipsel\BspEventstabDelimited.tsv"  
Set "lastEvent=Noch Nix"  
For /f "tokens=1-2 delims=	" %%G IN (%tsv%) DO call :ProcessLog "%%G" "%%H"  
goto :ProcessMail

:ProcessLog
If "%~1" == "%lastevent%" set "this_SYS_error=%this_SYS_error%	 %~2^<br^>" & goto :eof  
Set "Mailbody=%mailbody%%this_sys_error% ^<br^>"  
Set "this_sys_error="  
Set "lastEvent=%~1"  
set "this_SYS_error=%this_SYS_error% %~1	 %~2^<br^>"   
:: DEBUG-Kontrolle echo This_Sys_error [%this_sys_error%]
goto :eof


:ProcessMail
:: Nicht aber eine passende Formatierung:
Echo Mailbody [%mailbody%]

...brächte auf den Bildschirm:
>e:\schnipsel\BspEvent.cmd
Mailbody [ <br> Cdrom    7<br> <br> Kerberos     7<br> <br> Print        33<br> <br> NETLOGON    571
9<br> <br> Service Control Manager       7000<br>        7006<br>        7026<br>        7031<br>
 7034<br> <br>]
... wobei das interessante die "Service Control"-Eventzeile ist, wo eben nur einmal der Eventtitel "Service Control" auftaucht und alle Ereignis-Nummern danach.

Als "delims" in der FOR/F-Anweisung steht ein TAB, ebenso habe ich unten zwischen %~^1 und %~2 ein TAB verwendet.
Eine Maskierung der zeichen "<" und ">" beim Schreiben des <br>-Tags ist nötig - dazu ein Caret ("^") benutzen.

Grüße
Biber
Member: Oskar231
Oskar231 Jan 15, 2008 at 11:24:51 (UTC)
Goto Top
Eine Maskierung der zeichen "<"
und ">" beim Schreiben des
<br>-Tags ist nötig - dazu ein
Caret ("^"9 benutzen.

^<br^> Mit "^" funktioniert das bei direkter Ausgabe in der Kommandozeile (echo), in der Mail schreibt er dann aber:

^Quelle EreignisCdrom 7Kerberos 7Print 33 ...

<br> Ohne "^" und mit "@echo off" bekomme ich keinen Syntax Error und die Mail sieht so aus:

Cdrom 7
Kerberos 7
Print 33
NETLOGON 5719
...

????

Gruß,
Oskar231
Member: Biber
Biber Jan 15, 2008 at 11:46:22 (UTC)
Goto Top
Sorry, Oskar,
mein Denkfehler... da es schon einmal maskiert werden muss, damit es in die Variable geschrieben wird und dann -zig mal neu der Variablen zugewiesen, ist halt irgendwann mal die Maskierung verbraucht (Maskierung gilt immer für "den folgenden Befehl").

Workaround: schreibe am Anfang in die Variable(n) statt "<br>" einfach "#" oder "§" ...ein Zeichen, dass im Nutz-Text nicht vorkommt.

Erst unmittelbar vor dem Schreiben dann dieses Zeichen ersetzen:

SET mailbody=%mailbody:#=^<br^>%
:: ...und dann schreiben....
:: -oder- direkt da wo Du es brauchst die Variable aufbereiten
Echo %mailbody:#=^<br^>%

Gruß
Biber
Member: Oskar231
Oskar231 Jan 16, 2008 at 07:17:28 (UTC)
Goto Top
Danke Biber, hast mir sehr geholfen.

Gruß,
Oskar231