Top-Themen

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, 5428 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
Textdatei zeilenweise in Variable schreiben
gelöst Frage von goodbytesBatch & Shell20 Kommentare

Hallo, mit einer Batch möchte ich mehrere Laufwerke mappen, abhängig vom Usernamen. Klar könnte ich auch für jeden User ...

Batch & Shell
Powershell - zeilenweise Variablen aus TXT Datei einlesen
gelöst Frage von adm2015Batch & Shell12 Kommentare

Hallo, ich habe folgendes Problem. Ich möchte meinen alten Batch Code in Powershell verwenden und finde keinen passenden Lösungsansatz. ...

Batch & Shell
Text Zeilenweise auslesen und variable überprüfen
Frage von BruendlBatch & Shell11 Kommentare

Moin Moin, ich habe eine Textdatei mit folgendem Inhalt: ich möchte jetzt gerne die beiden Werte, die von einem ...

Batch & Shell
Variablenanordnung aus einer TXT Datei als aufgelöste Variable übernehmen?
Frage von KriegstreiberBatch & Shell1 Kommentar

Hallo alle zusammen und schönes Wochenende, wieder einmal ne etwas komplizierte Geschichte. Ich versuche das zu erklären: In einer ...

Neue Wissensbeiträge
Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 2 StundenPerl1 Kommentar

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 3 StundenSicherheit

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 108 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 2 TagenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell20 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
Frage von CenuzeNetzwerkgrundlagen10 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

Windows Server
Logging von "gesendeten Nachrichten" auf Terminalservern
Frage von Z3R0C0MM4N0THiN6Windows Server9 Kommentare

Hallo zusammen, kann mir jemand auf kurzem Wege sagen ob 1) die per Task-Manager (oder damals tsadmin) an Benutzer ...