Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

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, 5420 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 ..
Ähnliche Inhalte
Batch & Shell
gelöst Datei zeilenweise auslesen - es passiert aber nichts (3)

Frage von Nagus zum Thema Batch & Shell ...

Batch & Shell
gelöst In einer Batch variable die Datei extension ermitteln ? (4)

Frage von Kriegstreiber zum Thema Batch & Shell ...

Batch & Shell
gelöst Mit zusammengesetzter Variable auf andere Variable zugreifen (2)

Frage von abiber zum Thema Batch & Shell ...

Neue Wissensbeiträge
Ubuntu

Ubuntu 17.10 steht zum Download bereit

(3)

Information von Frank zum Thema Ubuntu ...

Datenschutz

Autofahrer-Pranger - Bewertungsportal illegal

(8)

Information von BassFishFox zum Thema Datenschutz ...

Windows 10

Neues Win10 Funktionsupdate verbuggt RemoteApp

(8)

Information von thomasreischer zum Thema Windows 10 ...

Microsoft

Die neuen RSAT-Tools für Win10 1709 sind da

(2)

Information von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows 10
Seekrank bei Windows 10 (18)

Frage von zauberer123 zum Thema Windows 10 ...

Windows 10
Windows 10 Fall Creators Update Fehler (14)

Frage von ZeroCool23 zum Thema Windows 10 ...

Windows Server
Frage zu Server Rack (9)

Frage von rainergugus zum Thema Windows Server ...