zendara
Goto Top

Die letzten 5 Zeilen aus einem Logfile auslesen und in umgekehrter chronologischer Reihenfolge mit Echo ausgeben

Hallo,

Ich versuche einen Batch zu schreiben der eine IP anpingt und protokolliert sobald der Ping unterbrochen wird. Unteranderem läuft auch ein Counter der die Anzahl der Unterbrechungen mitzählt.
Es werden im Batch alle protokollierten Fehler aufgelistet was aber bei einer bestimmten Menge nicht mehr sehr übersichtlich ist.
Also habe ich versucht in einer chronologisch umgekehrter Reihenfolge die letzten 5 Fehler/Zeilen in eine Variable zu speichern und diese wieder auszugeben…
Taja… ich versuche das noch immer und komm einfach nicht auf den Fehler.


@echo off & setlocal enabledelayedexpansion

call :_killer

echo IP eingeben:
set /p ip=
::set ip=192.168.8.230

set "log=D:\Test_folder\Ping_Client_Verfuegbarkeit\Ping_Client_Verfuegbarkeit.log"  
REM Counter für Fehler
set "count=1"  
REM x5line Variable ohne funktion
set "x5line=1"  
REM lines: zählt die Fehler/Einträge
set "lines=0"  
REM Platzhalter macht erst ab 5 Fehlverbindungen Sinn
set line1=0
set line2=0
set line3=0
set line4=0
set line5=0

::if exist %log% del %log%

REM Zeilen zählen	
if exist %log% FOR /F "delims=:" %%A IN ('findstr /N .* "%log%"') do (  
	set "lines=%%A"  
	)
set /a "count=%lines%+1"  
set /a "x5line=%lines%+1"  

if %lines% GEQ 5 call :_more5

:show
cls
	echo.
	echo ==================================
	echo %ip%
	echo ==================================
	echo.
	echo Count = %count%
	echo Error counter = %lines%
	echo x5line = %x5line%
	echo %line1%
	echo %line2%
	echo %line3%
	echo %line4%
	echo %line5%
	echo.
	echo ist online
	echo.
	echo ==================================
	echo.
if %lines% GEQ 5 call :_show_last5

echo den ganzen Log kann man Zeilenweise auslesen
if exist %log% for /f "delims=" %%i in (%log%) do (  
	echo %%i
	)

:scan
REM ping IP
ping %ip% -n 1 %1|find "TTL=" > nul  
if %errorlevel%==1 call :lost

::goto scan

:lost
color 0c
set errtime=%time:~0,2%:%time:~3,2%:%time:~6,2%
	echo ID %count%	%ip%	%date%	%errtime%	keine Verbindung >>%log%
if %lines% GEQ 5 call :_more5
ping localhost -n 2 >nul
goto count

:_more5
set /a "line1=%lines%-0"  
set /a "line2=%lines%-1"  
set /a "line3=%lines%-2"  
set /a "line4=%lines%-3"  
set /a "line5=%lines%-4"  

REM liest die letzten 5 Einträge der Log Datei aus
REM inkl. verschiedener Lösungsansätze
if exist %log% for /f "delims=" %%i in (%log%) do (  
	for /F "delims=  skip=%line1%" %%a in (%log%) do set "idline1=%%i"  
	)

if exist %log% for /f "delims=" %%j in (%log%) do (  
	for /F "delims=" %%b in ('findstr /n "ID %line2%" %log%') do set "idline2=%%j"  
	)

if exist %log% for /f "delims=" %%k in (%log%) do (  
	for /F "delims=:" %%c in ('findstr /n . "%%~k"^|findstr "^6:"') do set idline3=%%c  
	)

if exist %log% for /f "delims=" %%l in (%log%) do (  
	for /F "delims=" %%d in ('findstr /n "ID %line4%" %log%') do set "idline4=%%l"  
	)

::if exist %log% for /F "skip=2" %%m in (%log%) do set "idline5=%%m" 
for /F %%m in ('find /N 3 %log%^') do set "idline5=%%m"  
::if exist %log% for /f "delims=" %%m in (%log%) do ( 
::	for /F "delims=:" %%e in ('findstr /n "ID %line5%" %log%') do set "idline5=%%m" 
::	)

echo _more5 %line1% - %idline1%
echo _more5 %line2% - %idline2%
echo _more5 %line3% - %idline3%
echo _more5 %line4% - %idline4%
echo _more5 %line5% - %idline5%
goto:EOF

:count
echo count
echo ==================================
echo %count% %x5line%
set /a "count=%count%+1"  
set /a "x5line=%x5line%+1"  
set /a "lines=%lines%+1"  
::goto scan
goto show
exit

:_show_last5
echo hier sollten die letzten 5 Einträge stehen
	echo !idline1!
	echo !idline2!
	echo %idline3%
	echo %idline4%
	echo %idline5%
	echo.
	echo ==================================
	echo.
goto:EOF

:_killer
tasklist | find /i "ping.exe" >nul && D:\Test_folder\PStools\pskill ping.exe  
tasklist | find /i "find.exe" >nul && D:\Test_folder\PStools\pskill find.exe  
tasklist | find /i "findstr.exe" >nul && D:\Test_folder\PStools\pskill findstr.exe  
tasklist | find /i "taskhost.exe" >nul && D:\Test_folder\PStools\pskill taskhost.exe  
cls
goto:EOF

Wie man sieht habe ich mich unter :_more5 schon leicht verausgabt und mehrer Lösungsansätze ausprobiert aber leider ohne Erfolg.
Jede Zeile im Log hat eine fortlaufende ID. Man könnte also direkt nach der ID Nummer suchen bzw. hab ich mit skip auch schon rumgespielt.
Irgendwie übernimmt er mir die Einträge in die Variable nicht richtig.

Ich hoffe mir kann jemand weiterhelfen.
Bin für jede Hilfe dankbar.

lg
Zendara

Content-ID: 275409

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

114757
114757 23.06.2015 um 13:46:26 Uhr
Goto Top
Warum so umständlich wenn's mit Powershell so einfach geht face-smile
$zeilen = gc 'C:\logdatei.txt' -Tail 5  
4..0 | %{$zeilen[$_]}
Gruß jodel32
SaschaRD
SaschaRD 23.06.2015 um 13:51:53 Uhr
Goto Top
@ Jodel
Einer der vielen Gründe warum ich seit längerem (einem Jahr ca.) alle Skripte ausschließlich in Powershell schreibe.


@Zendara
Ich habe hier noch einen älteren Beitrag , vielleicht hilft Dir dies weiter.

Gruß, Sascha
Zendara
Zendara 23.06.2015 um 17:15:45 Uhr
Goto Top
Hallo und Danke für eure Antworten,

ich habe jetzt eine Lösung gefunden.

der richtige Befehl ist:

for /f "delims=" %%i in ('findstr /C:"ID %line1%" %log%') do (  
        set "idline1=%%i"  
)

Der ganze Batch sieht jetzt wie folgt aus:

@echo off & setlocal enabledelayedexpansion

call :_killer

echo IP eingeben:
set /p ip=
::set ip=192.168.8.230

set "log=D:\Test_folder\Ping_Client_Verfuegbarkeit\Ping_Client_Verfuegbarkeit.log"  
REM Counter für Fehler
set "count=1"  
REM lines: zählt die Fehler/Einträge
set "lines=0"  
REM Platzhalter macht erst ab 5 Fehlverbindungen Sinn
set line1=0
set line2=0
set line3=0
set line4=0
set line5=0
set "idline1=1"  
set "idline2=2"  
set "idline3=3"  
set "idline4=4"  
set "idline5=5"  
if exist %log% del %log%

REM Zeilen zählen	
if exist %log% FOR /F "delims=:" %%A IN ('findstr /N .* "%log%"') do (  
	set "lines=%%A"  
	)
set /a "count=%lines%+1"  

call :_more5
:show

ping %ip% -n 1 %1|find "TTL=" > nul  
if %errorlevel%==0 set "status=online"  

cls
	echo.
	echo ==================================
	echo %ip%
	echo ==================================
	echo.
	echo Count = %count%
	echo Error counter = %lines%
	echo.
	echo %status%
	echo.
	echo ==================================
	echo.
	echo Letzten 5 Einträge
	echo.
	echo %idline1%
	echo %idline2%
	echo %idline3%
	echo %idline4%
	echo %idline5%
	echo.
	echo ==================================
	echo.

::echo den ganzen Log kann man Zeilenweise auslesen
::if exist %log% for /f "delims=" %%i in (%log%) do ( 
::	echo %%i
::	)

:scan
REM ping IP
ping %ip% -n 1 %1|find "TTL=" > nul  
if %errorlevel%==1 call :lost

goto scan

:lost
set "status=offline"  
set errtime=%time:~0,2%:%time:~3,2%:%time:~6,2%
	echo ID %count%	%ip%	%date%	%errtime%	keine Verbindung >>%log%
call :_more5
goto count

:_more5
::https://www.lima-city.de/thread/daten-automatisch-aus-text-datei-entnehmen
set /a "line1=%count%-0"  
set /a "line2=%count%-1"  
set /a "line3=%count%-2"  
set /a "line4=%count%-3"  
set /a "line5=%count%-4"  

for /f "delims=" %%i in ('findstr /C:"ID %line1%" %log%') do (  
        set "idline1=%%i"  
)
for /f "delims=" %%i in ('findstr /C:"ID %line2%" %log%') do (  
        set "idline2=%%i"  
)
for /f "delims=" %%i in ('findstr /C:"ID %line3%" %log%') do (  
        set "idline3=%%i"  
)
for /f "delims=" %%i in ('findstr /C:"ID %line4%" %log%') do (  
        set "idline4=%%i"  
)
for /f "delims=" %%i in ('findstr /C:"ID %line5%" %log%') do (  
        set "idline5=%%i"  
)
goto:EOF

:count
set /a "count=%count%+1"  
set /a "lines=%lines%+1"  
goto show

:_killer
tasklist | find /i "ping.exe" >nul && D:\Test_folder\PStools\pskill ping.exe  
tasklist | find /i "find.exe" >nul && D:\Test_folder\PStools\pskill find.exe  
tasklist | find /i "findstr.exe" >nul && D:\Test_folder\PStools\pskill findstr.exe  
tasklist | find /i "taskhost.exe" >nul && D:\Test_folder\PStools\pskill taskhost.exe  
cls
goto:EOF

Lg
Zendara