forgottenrealm

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?
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen
Kommentar vom Moderator Biber am 09.03.2010 um 14: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-ID: 137795

Url: https://administrator.de/forum/logdatei-auswerten-und-bestimmten-text-in-variable-speichern-137795.html

Ausgedruckt am: 22.05.2025 um 01:05 Uhr

bastla
bastla 09.03.2010 um 15:06:42 Uhr
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
ForgottenRealm
ForgottenRealm 09.03.2010 um 15:31:41 Uhr
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?
bastla
bastla 09.03.2010 um 16:16:30 Uhr
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) ...
ForgottenRealm
ForgottenRealm 10.03.2010 um 09:07:55 Uhr
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