Wie kann ich mehrere aufeinanderfolgende Zeilen aus mehreren Textdateien auslesen?
Hallo zusammen,
hoffe ihr könnt mir weiterhelfen, denn leider bin ich an einem Punkt angekommen, an dem meine Kenntnisse nicht mehr ausreichen, um das Problem selbst lösen bzw. Anregungen aus anderen Forenbeiträgen umsetzen zu können.
Ich habe einen Ordner mit ca. 20 unterschiedlich benannten log-Dateien (Protokolldateien meines Backup-Programms) und suche nach einer Batch-Lösung, wie ich diese Textdateien nach einem bestimmten Text (z.B. "==> Ende:") durchsuchen kann und anschließend die Zeile mit dem Suchergebnis sowie die folgenden zwei Zeilen, in eine andere Datei schreiben kann.
Ich habe hier im Forum Wie kann ich mehrere aufeinaderfolgende Zeilen aus einer Textdatei auslesen? bereits herausgefunden, wie man mehrere Zeilen aus EINER Textdatei auslesen kann. Leider schaffe ich es nicht die dortige Lösung so umzuwandeln, dass MEHRERE Textdateien mit unterschiedlichen Dateinamen durchsucht werden.
Meine Idee war eine weitere FOR-Schleife um die FOR-Schleife in Zeile 12-14 zu bauen, um damit alle Textdateien zu durchsuchen. Leider verstehe ich FOR-Schleifen noch nicht so ganz und habe mittlerweile so viel durch try and error verändert und versucht, dass ich den Wald vor lauter Bäumen nicht mehr sehe. Ich hoffe ihr könnt mir weiterhelfen.
Hier mein aktueller Stand:
-> Problem: keine Ausgabe. Wenn ich @echo on mache, sehe ich, dass der Dateiname der ersten Protokolldatei anscheinend korrekt erkannt wird, aber der Sprung zu Zeile 21 nicht stattfindet.
Viele Grüße
cleolee
hoffe ihr könnt mir weiterhelfen, denn leider bin ich an einem Punkt angekommen, an dem meine Kenntnisse nicht mehr ausreichen, um das Problem selbst lösen bzw. Anregungen aus anderen Forenbeiträgen umsetzen zu können.
Ich habe einen Ordner mit ca. 20 unterschiedlich benannten log-Dateien (Protokolldateien meines Backup-Programms) und suche nach einer Batch-Lösung, wie ich diese Textdateien nach einem bestimmten Text (z.B. "==> Ende:") durchsuchen kann und anschließend die Zeile mit dem Suchergebnis sowie die folgenden zwei Zeilen, in eine andere Datei schreiben kann.
Ich habe hier im Forum Wie kann ich mehrere aufeinaderfolgende Zeilen aus einer Textdatei auslesen? bereits herausgefunden, wie man mehrere Zeilen aus EINER Textdatei auslesen kann. Leider schaffe ich es nicht die dortige Lösung so umzuwandeln, dass MEHRERE Textdateien mit unterschiedlichen Dateinamen durchsucht werden.
Meine Idee war eine weitere FOR-Schleife um die FOR-Schleife in Zeile 12-14 zu bauen, um damit alle Textdateien zu durchsuchen. Leider verstehe ich FOR-Schleifen noch nicht so ganz und habe mittlerweile so viel durch try and error verändert und versucht, dass ich den Wald vor lauter Bäumen nicht mehr sehe. Ich hoffe ihr könnt mir weiterhelfen.
Hier mein aktueller Stand:
@echo off & setlocal
set "Quellordner=%Userprofile%\Desktop\Protokolle"
set "Quelldateien=*.log"
set "Zieldatei=%Userprofile%\Desktop\Protokolle\Fazit.txt"
set "Suchtext=Ende:"
set /a Folgezeilen=2"
del "%Zieldatei%" 2>nul
for %%a in ("%Quellordner%\%Quelldateien%") do (
for /f "delims=:" %%i in ('findstr /i /n /c:"%Suchtext% %%~a"') do (
set /a NachZeile=%%i-1
call :ZEILENVERARBEITUNG
)
)
goto :ENDE
:ZEILENVERARBEITUNG
set /a Zeilen=Folgezeilen
setlocal enabledelayedexpansion
for /f "delims=" %%k in ('more +%NachZeile% "%%a"') do (
set "Ausgabe=%%k"
setlocal enabledelayedexpansion
if !Zeilen! geq 0 echo !Ausgabe!
endlocal
set /a Zeilen-=1
)>> %Zieldatei%
goto :ENDE
:ENDE
start %Zieldatei%
exit
-> Problem: keine Ausgabe. Wenn ich @echo on mache, sehe ich, dass der Dateiname der ersten Protokolldatei anscheinend korrekt erkannt wird, aber der Sprung zu Zeile 21 nicht stattfindet.
Viele Grüße
cleolee
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3520685839
Url: https://administrator.de/forum/wie-kann-ich-mehrere-aufeinanderfolgende-zeilen-aus-mehreren-textdateien-auslesen-3520685839.html
Ausgedruckt am: 05.04.2025 um 17:04 Uhr
8 Kommentare
Neuester Kommentar
Moin,
etwa so:
oder man nimmt zeitgemäß gleich Powershell, damit wird das Ganze erheblich einfacher:
Powershell Leitfaden für Anfänger
Gruß Thomas
etwa so:
@echo off
setlocal EnableDelayedExpansion
set Quellordner=%Userprofile%\Desktop\Protokolle
set Quelldateien=*.log
set Zieldatei=%Userprofile%\Desktop\Protokolle\Fazit.txt
set Suchtext=Ende:
set Folgezeilen=2
if exist "%Zieldatei%" del "%Zieldatei%"
for /f "Tokens=1-3,* Delims=:" %%A in ('findstr /i /n "%Suchtext%" "%Quellordner%\%Quelldateien%"') do call :zeilenVerarbeiten "%%A:%%B" "%%C" "%%D"
"%Zieldatei%"
goto :EoF
:zeilenVerarbeiten
>>"%Zieldatei%" echo %~3
set count=1
for /f "UseBackQ Skip=%~2 Delims=" %%A in ("%~1") do (
if !count! GTR %Folgezeilen% (
>>"%Zieldatei%" echo]
goto :EoF
)
>>"%Zieldatei%" echo %%A
set /a count+=1
)
oder man nimmt zeitgemäß gleich Powershell, damit wird das Ganze erheblich einfacher:
$Quellordner = "$Home\Desktop\Protokolle"
$Quelldateien = "*.log"
$Zieldatei = "$Home\Desktop\Protokolle\Fazit.txt"
$Suchtext = "Ende:"
$Folgezeilen = 2
$Matches = Select-String -SimpleMatch $Suchtext -Context 0,$Folgezeilen "$Quellordner\$Quelldateien"
$Matches | Foreach { $_.Line ; $_.Context.Postcontext ; "" } | Set-Content $Zieldatei
&$Zieldatei
Gruß Thomas
Ja, ich hatte anfangs überlesen, dass du auch die Trefferzeile ausgeben wolltest. Dies hatte ich zwischenzeitlich bereits in beiden Codes angepasst.
Gruß Thomas
2. Die 2 Folgezeilen nach dem Suchergebnis werden zwar wiedergegeben, allerdings nur das erste Wort.
Ah ok, hatte keine Leerzeichen in meinen Testdateien, daher habe ich diese auch nicht bedacht. Dann muss bei der For-Schleife in der Call-Funktion auch noch entweder "Tokens=*" oder "Delims=" gesetzt werden. Habe es oben angepasst.3. Es wird nur 1 Textdatei durchsucht.
Nein, dass ist definitiv nicht der Fall. Bei mir werden alle Testdateien abgearbeitet (aber natürlich nur die mit der Endung ".log").Und für die Übersichtlichkeit wäre es noch super, wenn in der Zieldatei zwischen den 3 Zeilen aus den jeweiligen Protokollen eine Leerzeile steht.
ist oben ergänzt.Gruß Thomas
Kann nicht sein. Dies wurde durch das Anhängen von "%%D" in Zeile 11, sowie durch den echo Befehl in Zeile 16 Behoben. Anscheinend hast du die Änderungen nicht vollumfänglich übernommen, denn wenn der echo Befehl in Zeile 16 Leer wäre, gäbe er zumindest ein typisches "Echo ist ausgeschaltet (off)" zurück, welches in die Zieldatei geschrieben würde.
2. wurde behohen
3. Also bei mir wurde nur eine Testdatei abgearbeitet und zwar die, die im Quellorder zuerst kommt.
Poste mal bitte die Ausgabe von folgendem Befehl:3. Also bei mir wurde nur eine Testdatei abgearbeitet und zwar die, die im Quellorder zuerst kommt.
findstr /n /i "Ende:" "%userprofile%\Desktop\Protokolle\*.log"
Zu Powershell:
Super, so wird wird auch die Ergebniszeile selbst in die Zieldatei geschrieben. Vielen Dank!
Wäre super, wenn du mir hier noch mit 2 Funktionen helfen könntest:
1) In der Zieldatei jeweils 1 Leerzeile zwischen den 3-Zeilen-Blöcken ergänzen.
2) Öffnen der Zieldatei mit dem Editor oder Notepad.
Erledigt.Super, so wird wird auch die Ergebniszeile selbst in die Zieldatei geschrieben. Vielen Dank!
Wäre super, wenn du mir hier noch mit 2 Funktionen helfen könntest:
1) In der Zieldatei jeweils 1 Leerzeile zwischen den 3-Zeilen-Blöcken ergänzen.
2) Öffnen der Zieldatei mit dem Editor oder Notepad.
Zitat von @cleolee:
dass erklärt einiges. Du hast also tatsächlich "==>" da drin stehen. Das ">" wird von Batch natürlich als Umleitungsoperator erkannt. Vermutlich hast du auch eine Datei namens "Ende" im Skriptordner liegen.C:\Users\Cleolee>findstr /n /i "Ende:" "%userprofile%\Desktop\Protokolle\*.log"
C:\Users\Cleolee\Desktop\Protokolle\Protokoll1.log:46639: ==> Ende: 30.07.2022 11:21:27 - Backup-Auftrag:
[...]
Probieren wir mal das Ganze ein wenig umzustellen, so dürfte es klappen:
@echo off
setlocal EnableDelayedExpansion
set Quellordner=%Userprofile%\Desktop\Protokolle
set Quelldateien=*.log
set Zieldatei=%Userprofile%\Desktop\Protokolle\Fazit.txt
set Suchtext=Ende:
set Folgezeilen=2
if exist "%Zieldatei%" del "%Zieldatei%"
for /f "Tokens=1-3,* Delims=:" %%A in ('findstr /i /n "%Suchtext%" "%Quellordner%\%Quelldateien%"') do (
>>"%Zieldatei%" echo %%D
call :zeilenVerarbeiten "%%A:%%B" "%%C"
)
"%Zieldatei%"
goto :EoF
:zeilenVerarbeiten
set count=1
for /f "UseBackQ Skip=%~2 Delims=" %%A in ("%~1") do (
if !count! GTR %Folgezeilen% (
>>"%Zieldatei%" echo]
goto :EoF
)
>>"%Zieldatei%" echo %%A
set /a count+=1
)