cleolee
Goto Top

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:

@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

Content-Key: 3520685839

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: TK1987
Lösung TK1987 02.08.2022 aktualisiert um 13:18:55 Uhr
Goto Top
Moin,

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
Powershell Leitfaden für Anfänger

Gruß Thomas
Mitglied: cleolee
cleolee 02.08.2022 um 12:36:16 Uhr
Goto Top
Hallo Thomas,

vielen Dank für deine rasche Antwort.

Da ich mich überhaupt nicht mit Powershell auskenne und die Textauslese-Funktion als Ergänzung meiner umfangreichen Backup-Batch gedacht ist, habe ich zuerst deinen Batch-Vorschlag und Folgendes in der Zieldatei festgestellt:
1. Die Zeile, die das Suchergebnis enthält, fehlt komplett
2. Die 2 Folgezeilen nach dem Suchergebnis werden zwar wiedergegeben, allerdings nur das erste Wort.
3. Es wird nur 1 Textdatei durchsucht.


Daher habe ich mich mal an deinen Powershell-Vorschlag gewagt und erfreulicherweise funktioniert hier die komplette Wiedergabe der Folgezeilen und es werden alle Textdateien durchsucht. Aber leider fehlt auch hier die Zeile, die das Suchergebnis enthält. Wenn wir das noch gelöst bekommen, versuche ich vorerst dieses Powershell-Skript durch meine bestehende Backup-Batchdatei aufzurufen. Endziel wäre dann natürlich diese auch in Powershell umzuschreiben. Aber davor muss ich mich erst noch mehr einlesen.

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.

Gruß Cleolee
Mitglied: TK1987
TK1987 02.08.2022 aktualisiert um 13:05:51 Uhr
Goto Top
Zitat von @cleolee:
1. Die Zeile, die das Suchergebnis enthält, fehlt komplett
Ja, ich hatte anfangs überlesen, dass du auch die Trefferzeile ausgeben wolltest. Dies hatte ich zwischenzeitlich bereits in beiden Codes angepasst.
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
Mitglied: cleolee
cleolee 02.08.2022 um 13:12:06 Uhr
Goto Top
Sorry, hatte erst nach dem posten gesehen, dass du die Codes aktualisiert hast.

Zur Batch:
1. Die Zeile, die das Suchergebnis enthält, fehlt leider immer noch komplett
2. wurde behohen
3. Also bei mir wurde nur eine Testdatei abgearbeitet und zwar die, die im Quellorder zuerst kommt.

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.

Vielen Dank & Gruß
Cleolee
Mitglied: TK1987
TK1987 02.08.2022 um 13:27:16 Uhr
Goto Top
Zitat von @cleolee:
1. Die Zeile, die das Suchergebnis enthält, fehlt leider immer noch komplett
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:
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.
Mitglied: cleolee
cleolee 02.08.2022 um 14:44:24 Uhr
Goto Top
Hallo Thomas,
vorab nochmals vielen Dank für deine bisherige Hilfe! Da wir ja mit dem Powershell-Code eine Lösung haben, kann ich meine Frage gerne als gelöst markieren. Ich möchte dich nicht unnötig beschäftigen. Also nur für den Fall, dass einfach dein Ehrgeiz geweckt ist, das mit der Batch auch noch zu lösen, hier der aktuelle Stand:

Zitat von @TK1987:

Zitat von @cleolee:
1. Die Zeile, die das Suchergebnis enthält, fehlt leider immer noch komplett
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.
Ich habe gerade extra eine neue Batchdatei erstellt und deinen Code aus dem ersten Beitrag komplett reinkopiert. Jetzt taucht die Zeile mit dem Suchergebnis in der Zieldatei einmal komplett auf, d.h. nur für 1 der 15 Testdateien.

Die Leerzeile zwischen den Zeilen-Blöcken erscheint 6x, d.h. auch nicht nach allen Testdateien.

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:
findstr /n /i "Ende:" "%userprofile%\Desktop\Protokolle\*.log"  
Ok, jetzt werden tatsächlich alle Testdateien abgearbeitet.
Ausgabe des Befehls:
Microsoft Windows [Version 10.0.19044.1826]
(c) Microsoft Corporation. Alle Rechte vorbehalten.

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: Kopieren_von_PC_(Auftrag_1).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll10.log:2004:  ==> Ende: 30.07.2022 11:21:46 - Backup-Auftrag: Spiegeln_von_PC_(Auftrag_10).buj (S)
C:\Users\Cleolee\Desktop\Protokolle\Protokoll11.log:22:  ==> Ende: 30.07.2022 11:10:22 - Backup-Auftrag: Spiegeln_von_PC_(Auftrag_11).buj (S)
C:\Users\Cleolee\Desktop\Protokolle\Protokoll12.log:80121:  ==> Ende: 30.07.2022 11:08:52 - Backup-Auftrag: Spiegeln_von_PC_(Auftrag_12).buj (S)
C:\Users\Cleolee\Desktop\Protokolle\Protokoll13.log:11603:  ==> Ende: 30.07.2022 11:09:13 - Backup-Auftrag: Spiegeln_von_PC_(Auftrag_13).buj (S)
C:\Users\Cleolee\Desktop\Protokolle\Protokoll14.log:23:  ==> Ende: 30.07.2022 11:09:13 - Backup-Auftrag: Spiegeln_von_PC_(Auftrag_14).buj (S)
C:\Users\Cleolee\Desktop\Protokolle\Protokoll15.log:63989:Ende: 30.07.2022 11:10:22 - Backup-Auftrag: Spiegeln_von_PC_(Auftrag_15).buj (S)
C:\Users\Cleolee\Desktop\Protokolle\Protokoll2.log:64:  ==> Ende: 30.07.2022 11:21:28 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_2).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll3.log:236:  ==> Ende: 30.07.2022 11:21:30 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_3).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll4.log:1953:  ==> Ende: 30.07.2022 11:21:37 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_4).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll5.log:34:  ==> Ende: 30.07.2022 11:21:39 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_5).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll6.log:1036:  ==> Ende: 30.07.2022 11:21:43 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_6).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll7.log:6170:  ==> Ende: 30.07.2022 11:11:06 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_7).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll8.log:24:  ==> Ende: 30.07.2022 11:11:06 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_8).buj
C:\Users\Cleolee\Desktop\Protokolle\Protokoll9.log:992:  ==> Ende: 30.07.2022 11:11:13 - Backup-Auftrag: Kopieren_von_PC_(Auftrag_9).buj

C:\Users\Cleolee>


So sieht es im Texteditor aus:
  Status: OK - Verstrichene Zeit: 00:10:14
          Datensicherung: 11 von 46.602 Dateien kopiert (4,40 GiB von 75,60 GiB)
  Status: OK - Verstrichene Zeit: 00:00:02
          Datensicherung: 0 von 1955 Dateien kopiert (0 B von 3,74 GiB)

  Status: OK - Verstrichene Zeit: 00:00:00
          Datensicherung: 0 von 1 Dateien kopiert (0 B von 113 B)

  Status: 75 Fehler beim Backup (38,9 MiB) - Verstrichene Zeit: 00:04:49
          Datensicherung: 1.093 von 78.949 Dateien kopiert (795 MiB von 15,30 GiB)

  Status: 1 Fehler beim Backup (165 B) - Verstrichene Zeit: 00:00:20
          Datensicherung: 73 von 11.577 Dateien kopiert (87,5 MiB von 50,03 GiB)

  Status: OK - Verstrichene Zeit: 00:00:00
          Datensicherung: 0 von 1 Dateien kopiert (0 B von 56 B)

Ende: 30.07.2022 11:10:22 - Backup-Auftrag: Spiegeln_von_PC_(Auftrag_15).buj (S)
  Status: OK - Verstrichene Zeit: 00:01:08
          Datensicherung: 0 von 63.967 Dateien kopiert (0 B von 184,14 GiB)

  Status: OK - Verstrichene Zeit: 00:00:00
          Datensicherung: 1 von 47 Dateien kopiert (8,09 KiB von 15,29 GiB)
  Status: OK - Verstrichene Zeit: 00:00:01
          Datensicherung: 1 von 219 Dateien kopiert (28,5 KiB von 37,94 GiB)
  Status: OK - Verstrichene Zeit: 00:00:07
          Datensicherung: 1 von 1936 Dateien kopiert (212 KiB von 73,06 GiB)
  Status: OK - Verstrichene Zeit: 00:00:01
          Datensicherung: 2 von 17 Dateien kopiert (524 KiB von 6,00 GiB)
  Status: OK - Verstrichene Zeit: 00:00:03
          Datensicherung: 1 von 1019 Dateien kopiert (83,6 KiB von 99,19 GiB)
  Status: OK - Verstrichene Zeit: 00:00:43
          Datensicherung: 0 von 6133 Dateien kopiert (0 B von 17,55 GiB)
  Status: OK - Verstrichene Zeit: 00:00:00
          Datensicherung: 0 von 7 Dateien kopiert (0 B von 5,61 MiB)
  Status: 1 Fehler beim Backup - Verstrichene Zeit: 00:00:06
          Datensicherung: 29 von 972 Dateien kopiert (15,4 MiB von 2,80 GiB)


Erledigt.
Vielen Dank!
Mitglied: TK1987
Lösung TK1987 02.08.2022 aktualisiert um 15:22:06 Uhr
Goto Top
Zitat von @cleolee:
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: 
[...]
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.

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
)
Mitglied: cleolee
cleolee 02.08.2022 um 16:00:55 Uhr
Goto Top
Zitat von @TK1987:
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.
Genau. Das war mir nicht bewusst. Wieder was gelernt ;)

Probieren wir mal das Ganze ein wenig umzustellen, so dürfte es klappen:
Jetzt werden aus allen Testdateien die jeweiligen 3-Zeiler kopiert.

Vielen Dank für deine geduldige Hilfe!

Gruß Cleolee