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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 78158
Url: https://administrator.de/forum/tsv-datei-zeilenweise-in-variable-uebernehmen-78158.html
Ausgedruckt am: 30.04.2025 um 09:04 Uhr
6 Kommentare
Neuester Kommentar
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
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
Hmmm, sicher bin ich nicht, ob ich Punkt a) richtig verstanden habe...
Ein versuch:
...brächte auf den Bildschirm:
... 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
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>]
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
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:
Gruß
Biber
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