Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

tsv-Datei zeilenweise in Variable übernehmen

Frage Entwicklung Batch & Shell

Mitglied: Oskar231

Oskar231 (Level 1) - Jetzt verbinden

15.01.2008, aktualisiert 16.01.2008, 5404 Aufrufe, 6 Kommentare

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
Mitglied: Biber
15.01.2008 um 09:22 Uhr
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
Bitte warten ..
Mitglied: Oskar231
15.01.2008 um 09:56 Uhr
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 ..."
Bitte warten ..
Mitglied: Biber
15.01.2008 um 10:42 Uhr
Hmmm, sicher bin ich nicht, ob ich Punkt a) richtig verstanden habe...

Ein versuch:
01.
:: ----snipp BspEvent.cmd 
02.
@echo off & setlocal 
03.
##Uncomment this line und comment next## Set "Tsv=eventlog\SYSTEM_error.tsv" 
04.
Set "tsv=E:\schnipsel\BspEventstabDelimited.tsv" 
05.
Set "lastEvent=Noch Nix" 
06.
For /f "tokens=1-2 delims=	" %%G IN (%tsv%) DO call :ProcessLog "%%G" "%%H" 
07.
goto :ProcessMail 
08.
 
09.
:ProcessLog 
10.
If "%~1" == "%lastevent%" set "this_SYS_error=%this_SYS_error%	 %~2^<br^>" & goto :eof 
11.
Set "Mailbody=%mailbody%%this_sys_error% ^<br^>" 
12.
Set "this_sys_error=" 
13.
Set "lastEvent=%~1" 
14.
set "this_SYS_error=%this_SYS_error% %~1	 %~2^<br^>"  
15.
:: DEBUG-Kontrolle echo This_Sys_error [%this_sys_error%] 
16.
goto :eof 
17.
 
18.
 
19.
:ProcessMail 
20.
:: Nicht aber eine passende Formatierung: 
21.
Echo Mailbody [%mailbody%]
...brächte auf den Bildschirm:
01.
>e:\schnipsel\BspEvent.cmd 
02.
Mailbody [ <br> Cdrom    7<br> <br> Kerberos     7<br> <br> Print        33<br> <br> NETLOGON    571 
03.
9<br> <br> Service Control Manager       7000<br>        7006<br>        7026<br>        7031<br> 
04.
 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
Bitte warten ..
Mitglied: Oskar231
15.01.2008 um 12:24 Uhr
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
Bitte warten ..
Mitglied: Biber
15.01.2008 um 12:46 Uhr
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:

01.
SET mailbody=%mailbody:#=^<br^>% 
02.
:: ...und dann schreiben.... 
03.
:: -oder- direkt da wo Du es brauchst die Variable aufbereiten 
04.
Echo %mailbody:#=^<br^>%
Gruß
Biber
Bitte warten ..
Mitglied: Oskar231
16.01.2008 um 08:17 Uhr
Danke Biber, hast mir sehr geholfen.

Gruß,
Oskar231
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Aktueller Besitzer der aktuellen Datei herausfinden und in Variable schreiben (11)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
gelöst Variable aus ini Datei auslesen und weiterverwenden (17)

Frage von n0cturne zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...