.txt in jeder zeile auf zeichensatz überprüfen (ändert sich)
Hallo es geht um folgenen Beitrag: https://www.administrator.de/index.php?content=34e67b04934b68b8de4c96020 ...
Guten Morgen,
wie gesagt es geht um diesen Beitrag hier: Eventlog.txt filtern anhand von Ziffer
(sollte man lesen damit man vesteht was ich meine)
Das ganze funktioniert alles einwandfrei, leider habe ich bei meiner fragestellung ganz fergessen das sich ja das Datum verändert und somit auch der Zeichensatz.
D.h.
wenn das Datum auf:
Ihr versteht was ich meine?
Das ganze ist ja ein Script und soll beim Kunden installiert werden, und da währe es natürlich hilfreich nicht alle 10 Tage jeden monat und alle 10 monate jedes Jahr das Script umschreiben zu müssen...
Ich weiß das ganze is nich so einfach, z.Z wird die log Datei ja durch TAB-Space getrennt, das einzige was ich noch machen könnte ist die Informationen der Zeilen nicht durch TAB-Space sonder durch komma zu trennen, aber da bringt das mit dem Zeichensatz auch nich wirklich viel....
das sähe dann so aus:
(Die 4 nach der Uhrzeit soll überprüft werden)
Hier nochmal dei .bat die die .txt auf den 19ten Zeichensatz überprüft
Hat jemand eine Idee was man da machen kann?
z.B. den Zeichensatz(die länge) vom Datum überprüfen und dem entsprechend den Zeichensatz in der .bat zu editieren.
Guten Morgen,
wie gesagt es geht um diesen Beitrag hier: Eventlog.txt filtern anhand von Ziffer
(sollte man lesen damit man vesteht was ich meine)
Das ganze funktioniert alles einwandfrei, leider habe ich bei meiner fragestellung ganz fergessen das sich ja das Datum verändert und somit auch der Zeichensatz.
D.h.
wenn das Datum auf:
1/1/2007 steht, ist z.B der Zeichensatz 18
1/10/2007 steht, ist der Zeichensatz 19
2/1/2007 steht ist, der Zeichensatz 18
10/10/2007 steht, ist der Zeichensatz 20
Ihr versteht was ich meine?
Das ganze ist ja ein Script und soll beim Kunden installiert werden, und da währe es natürlich hilfreich nicht alle 10 Tage jeden monat und alle 10 monate jedes Jahr das Script umschreiben zu müssen...
Ich weiß das ganze is nich so einfach, z.Z wird die log Datei ja durch TAB-Space getrennt, das einzige was ich noch machen könnte ist die Informationen der Zeilen nicht durch TAB-Space sonder durch komma zu trennen, aber da bringt das mit dem Zeichensatz auch nich wirklich viel....
das sähe dann so aus:
8/14/2007,17:02:54,4,0,1002,Winlogon,N/A,WS42,blabla
8/14/2007,17:03:17,4,0,1002,Winlogon,N/A,WS42,balbalblalbala
(Die 4 nach der Uhrzeit soll überprüft werden)
Hier nochmal dei .bat die die .txt auf den 19ten Zeichensatz überprüft
@echo off & setlocal
set "Log=C:ProgrammeResource Kitapp.txt"
set "Err=C:ProgrammeResource KitError-app.txt"
set "Code=1"
if exist "%Err%" del "%Err%"
for /f "usebackq delims=" %%i in ("%Log%") do call :ProcessLine "%%i"
if exist "%Err%" type "%Err%"
goto :eof
:ProcessLine
set "Line=%~1"
if "%Line:~19,1%"=="%Code%" echo %Line%>>"%Err%" <------------ hier muss die 19 verändert werden
goto :eof
Hat jemand eine Idee was man da machen kann?
z.B. den Zeichensatz(die länge) vom Datum überprüfen und dem entsprechend den Zeichensatz in der .bat zu editieren.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 66343
Url: https://administrator.de/contentid/66343
Ausgedruckt am: 27.11.2024 um 04:11 Uhr
6 Kommentare
Neuester Kommentar
Moin Silentuser,
in diesem Fall ist es ja nicht nicht sinnvoll, die einzelne Textzeile als Ganzes mit einer fixen Tabellenstruktur (alle "Spalten" gleich lang aufzufassen.
Mit der Batch FOR /F-Anweisung kannst Du die Zeile zerlegen.
Beispiel: Ersetze den Block :ProcessLine wie folgt:
Damiz wird die jeweilige Zeile (kommt an als Parameter %1) zerlegt in Tokens ("Satzteile"), deren Delimiter jeweils ein Komma ist.
Das 1. Token %%i entspricht dem Datum,
das 2. Token %%j entspricht der Uhrzeit,
das 3. Token %%k entspricht dem Errorcode,
das 4. Token %%l entspricht dem Rest der Zeile,
Im obigen Beispiel lasse ich alles mit einem 3.Token/Errorcode GEQ (größer gleich) Deinem festgelegten %Code% anzeigen.
So kannst Du Dir aussuchen, was und wie Du in die Error-Logdatei schreiben willst.
Grüße
Biber
in diesem Fall ist es ja nicht nicht sinnvoll, die einzelne Textzeile als Ganzes mit einer fixen Tabellenstruktur (alle "Spalten" gleich lang aufzufassen.
Mit der Batch FOR /F-Anweisung kannst Du die Zeile zerlegen.
Beispiel: Ersetze den Block :ProcessLine wie folgt:
...
:ProcessLine
For /f "delims=, tokens=1,2,3,*" %%i in (%1) Do if %%k GEQ %Code% (
echo [Errorcode: %%k] [logdate:%%i,%%j] [Errortext-,%%l]
)
goto :eof
Damiz wird die jeweilige Zeile (kommt an als Parameter %1) zerlegt in Tokens ("Satzteile"), deren Delimiter jeweils ein Komma ist.
Das 1. Token %%i entspricht dem Datum,
das 2. Token %%j entspricht der Uhrzeit,
das 3. Token %%k entspricht dem Errorcode,
das 4. Token %%l entspricht dem Rest der Zeile,
Im obigen Beispiel lasse ich alles mit einem 3.Token/Errorcode GEQ (größer gleich) Deinem festgelegten %Code% anzeigen.
So kannst Du Dir aussuchen, was und wie Du in die Error-Logdatei schreiben willst.
Grüße
Biber
Tja, Silentuser,
sehe mit bloßem Auge den Denk- oder Tippfehler auch nicht.
Aber ich habe bei unserem WebMassa mal darum gebeten, hier weitere 35cm Platz unterhalb dieses Kommentars eingeräumt zu bekommen.
Geht klar!
Dann poste doch einfach mal die ersten drei dutzend Zeilen der Logdatei, dann kommen wir vielleicht dem Bug auf die Spur...
Grüße
Biber
sehe mit bloßem Auge den Denk- oder Tippfehler auch nicht.
Aber ich habe bei unserem WebMassa mal darum gebeten, hier weitere 35cm Platz unterhalb dieses Kommentars eingeräumt zu bekommen.
Geht klar!
Dann poste doch einfach mal die ersten drei dutzend Zeilen der Logdatei, dann kommen wir vielleicht dem Bug auf die Spur...
Grüße
Biber
Moin Silentuser,
okay, das Problem liegt darin, das auch die jeweilige Errorlog-Zeile ihrerseits Anführungszeichen (") enthalten kann.
Zum Beispiel den Text Der Dienst "Update Services" wurde gestartet.
Das bringt wiederum die For/F-Anweisung in dem Block :ProcessLine durcheinander.
Also, ein paar Anregungungen zur Verfeinerung:
--> Haken an der Geschichte: am Ende des "Errortext"-Parameters %%l kleibt noch ein sinnfreies Anführungszeichen. Sieht blöd aus.
BESSER: ...For /f "delims=" %%i in ('findstr ",%code%," "%Log%"') DO...
Geht schneller. Und unten in ":Processline" kann entsprechend statt "GEQ" ein "EQU" rein.
Also kannst Du auch schreiben
Statt: ...For /f "delims=, tokens=1,2,3,*" %%i .... DO ...mit %%i bis %%l
Besser z.B.....
For /f "delims=, tokens=1,2,3,6,*" ...%%i ... DO .....mit %%i bis %%m (oder ähnlich).
Grüße
Biber
okay, das Problem liegt darin, das auch die jeweilige Errorlog-Zeile ihrerseits Anführungszeichen (") enthalten kann.
Zum Beispiel den Text Der Dienst "Update Services" wurde gestartet.
Das bringt wiederum die For/F-Anweisung in dem Block :ProcessLine durcheinander.
Also, ein paar Anregungungen zur Verfeinerung:
- Die 80-Prozentlösung: Ersetze den Block ":ProcessLine" wie folgt:
..
:ProcessLine
For /f "delims=, tokens=1,2,3,*" %%i in ('echo %1') Do if %%k GEQ %Code% (
echo [Errorcode: %%k] [logdate: %%~i -- %%j] [Errortext: %%l]>>"%Err%"
)
- Deshalb eventuell noch....falls immer nur EIN Errorcode abgefragt wird und nicht ein GEQ/größer gleich Errorcode, dann schon oben schreiben
BESSER: ...For /f "delims=" %%i in ('findstr ",%code%," "%Log%"') DO...
Geht schneller. Und unten in ":Processline" kann entsprechend statt "GEQ" ein "EQU" rein.
- Ebenfalls in ":Processline kannst Du überlegen, ob Du den String, die ganze Eventlog-Zeile, weiter aussiebst und weitere Parameter wegfilterst.
Also kannst Du auch schreiben
Statt: ...For /f "delims=, tokens=1,2,3,*" %%i .... DO ...mit %%i bis %%l
Besser z.B.....
For /f "delims=, tokens=1,2,3,6,*" ...%%i ... DO .....mit %%i bis %%m (oder ähnlich).
- Falls dieses oben beschriebene Anführungszeichen nervt, dann müssen eben die eine oder andere dynamische Variable nochmals kurz umgespeichert werden in eine statische (also eine die als als "Set var=%%k" angelegt wurde). Dann lässt sich mit "echo %var:0.~1%" alles bis aufs letzte Zeichen, also das Anführungszeichen anzeigen.
Grüße
Biber