forgottenrealm
Goto Top

Logdatei auswerten und bestimmten Text in Variable speichern

Hallo


Wieder einmal habe ich ein Problem bei einer For-Schleife.

Diesmal möchte ich aus einer bestehenden Logdatei bestimmte Wörter herausfiltern und die komplette Zeile, in der dieses Wort vorkommt, als Variable speichern um diese später verwenden zu können.


Gegeben ist:

@set ERRORCODE=(0x00000002)
@set LOGFILE=%USERPROFILE%\Desktop\Test.log
@set ERRORS=%USERPROFILE%\Desktop\Errors.log

for %%i in ("%LOGFILE%") do findstr /C:"%ERRORCODE%" && echo %%i>>"%ERRORS%"


Leider funktioniert das nicht so ganz.

Wo liegt der Fehler?
Kommentar vom Moderator Biber am Mar 09, 2010 um 13:47:57 Uhr
Leider funktioniert das nicht so ganz.
Ich werde beantragen, diesen Leer-Satz forumsweit zu bannen.
Wenn das eine Fehlerbeschreibung von erwachsenem Windows-Anwender zu erwachsenem Windows Anwender ist - wie unterhalten sich schulpflichtige PlayStation-Zockerinnen??

Content-Key: 137795

Url: https://administrator.de/contentid/137795

Printed on: April 24, 2024 at 03:04 o'clock

Member: bastla
bastla Mar 09, 2010 at 14:06:42 (UTC)
Goto Top
Hallo ForgottenRealm!

Abgesehen davon, dass ich Bibers obigen Antrag aufs Heftigste unterstütze - hast Du es schon mal mit einer "for /f"-Schleife versucht?

Außerdem - nach "als Variable speichern" (auch wenn dies für mehrere Zeilen zumeist ohnehin nicht viel Sinn hat) sieht Dein Code nicht aus ...

... und wenn die Zeilen tatsächlich nur in eine Datei sollten, wäre die Schleife entbehrlich:
findstr /C:"%ERRORCODE%" "%LOGFILE%">"%ERRORS%"
Grüße
bastla
Member: ForgottenRealm
ForgottenRealm Mar 09, 2010 at 14:31:41 (UTC)
Goto Top
Hi

Ich habe noch etwas an der Datei gearbeitet und bin nun soweit, dass ich die ERRORS Datei erstellt bekomme.

@set ERRORCODE=^(0x00000020^)
@set LOGFILE=Test.log
@set ERRORS=Errors.log
@set NICHTKOPIERT=NichtKopiert.log

type "%LOGFILE%"|findstr /C:"%ERRORCODE%">>"%ERRORS%"

Mit Type gehts auch, wenn auch etwas länger als deine Zeile.

Nun erhalte ich eine weitere Logdatei, aus der ich in jeder Zeile die ersten 71 Zeichen entfernen möchte.

Dafür dachte ich an die nachfolgende Schleife, um jede Zeile abzuarbeiten;

for /f %%L IN (%ERRORS%) DO (
set UNFERTIG=%%L
set FERTIG=%UNFERTIG:~-71%
echo %FERTIG%>>%NICHTKOPIERT%
)

Die erzeugte Logdatei ist allerdings Fehlerhaft, denn es steht dort nur "ECHO ist eingeschaltet (ON)." drin, was darauf hindeutet, dass die Variable %%L nicht erstellt wird.

Die Ausgabe im CMD Window sagt, dass die Variable %unfertig% nur den Wert bis zum ersten Leerzeichen in jeder Zeile bekommt und somit nicht länger als 71 Zeichen ist und somit auch nicht verarbeitet werden kann.

Wenn ich die Variable %ERRORS% im ersten Teil der Schleife mit ' oder " einfasse, wird in beiden Fällen nur der Dateiname verarbeitet und nicht der Inhalt.

Wie lässt sich dies umgehen?
Member: bastla
bastla Mar 09, 2010 at 15:16:30 (UTC)
Goto Top
Hallo ForgottenRealm!

Etwa so:
@echo off & setlocal
set "ERRORCODE=(0x00000020)"  
set "LOGFILE=Test.log"  
set "ERRORS=Errors.log"  
set "NICHTKOPIERT=NichtKopiert.log"  

del "%NICHTKOPIERT%" 2>nul  
findstr /c:"%ERRORCODE%" "%LOGFILE%">"%ERRORS%"  
for /f "usebackq delims=" %%i in ("%ERRORS%") do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
>>"%NICHTKOPIERT%" echo %Zeile:~71%  
goto :eof
Wenn die Datei "Errors.log" nicht für andere Zwecke benötigt wird, ließen sich die Zeilen 8 und 9 zu
for /f "delims=" %%i in ('findstr /c:"%ERRORCODE%" "%LOGFILE%"') do set "Zeile=%%i" & call :ProcessLine
zusammenfassen ...

Grüße
bastla

P.S.:
... was darauf hindeutet, dass die Variable %%L nicht erstellt wird.
Tatsächlich werden alle Variablen erstellt, aber da keine "delayedExpansion" (Beispiele und Erklärung mehrfach hier im Forum zu finden) vorgenommen wird, kann auf die Werte der Variablen erst nach dem Abarbeiten der Schleife zugegriffen werden (wo sie in diesem Fall nix mehr nützen) ...
Member: ForgottenRealm
ForgottenRealm Mar 10, 2010 at 08:07:55 (UTC)
Goto Top
Hallo

Funktioniert einwandfrei, vielen Dank!

Ich habe noch das erste goto :eof durch eine andere Sprunganweisung ausgetauscht, da dieses Programm in ein weiteres Programm eingebunden werden soll, welches sonst ja beendet wird.


Auf die Idee mit dem Call bin ich gar nicht gekommen und bis zu dem Punkt hatte ich die Zeile auch schon mal face-smile