Mehrere Texte aus mehreren Dateien raussuchen
Hallo zusammen,
ich kenne mich so gut wie gar nicht mit BATCH-Programmierung aus.
Ich habe folgende Aufgabenstellung:
In einer Textdatei stehen mehrere Suchbegriffe unterschiedlicher Länge ( 1 Suchbegriff pro Zeile )
Nun möchte ich in einem bestimmten Verzeichnis alle Dateien nach allen Suchbegriffen durchsuchen
und in einer neuen Textdatei jeweils den Namen der Datei, die Zeilennummer und Suchtext ausgeben
, wenn dieser darin vorkommt.
Kann mir da jemand helfen?
Vielen Dank im Vorraus.
ich kenne mich so gut wie gar nicht mit BATCH-Programmierung aus.
Ich habe folgende Aufgabenstellung:
In einer Textdatei stehen mehrere Suchbegriffe unterschiedlicher Länge ( 1 Suchbegriff pro Zeile )
Nun möchte ich in einem bestimmten Verzeichnis alle Dateien nach allen Suchbegriffen durchsuchen
und in einer neuen Textdatei jeweils den Namen der Datei, die Zeilennummer und Suchtext ausgeben
, wenn dieser darin vorkommt.
Kann mir da jemand helfen?
Vielen Dank im Vorraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 153144
Url: https://administrator.de/forum/mehrere-texte-aus-mehreren-dateien-raussuchen-153144.html
Ausgedruckt am: 22.05.2025 um 06:05 Uhr
22 Kommentare
Neuester Kommentar

Salü,
wie "groß" ist denn der Umfang?
Denn Batch hat seine Grenzen - sehr wahrscheinlich geht es mit VBS schneller.
(Der Such & Loglauf)
Gruß
wie "groß" ist denn der Umfang?
Denn Batch hat seine Grenzen - sehr wahrscheinlich geht es mit VBS schneller.
(Der Such & Loglauf)
alle Dateien nach allen Suchbegriffen
PDF / Wörd und co kannst mit Batch eh nicht beackern...Gruß
Hallo REBSNB,
dazu sollte folgender Code genügen:
Zuerst wird eine evtl. vorhandene alte Ausgabedatei gelöscht. Existiert sie nicht, wird die Fehlermeldung durch 2>NUL nicht angezeigt.
Der Suchstring wird (durch /r) als regulärer Ausdruck betrachtet. FINDSTR sucht nach dem Suchstring buchstabengetreu (durch /c:) und an Wortgrenzen, \<=Wortanfang, \>=Wortende. Wenn das nicht Deinen Anforderungen entspricht, diese Zeichen und den Parameter /r entfernen. Die Zeilennummern werden durch /n ausgegeben. Der Suchstring kann auch Leerzeichen enthalten. Die Ausgabedatei ist nach folgendem Schema aufgebaut:
Wenn Du nur reinen Text ohne Sonderzeichen suchst, ist das ausreichend. Wenn nicht, ist VBScript besser.
Gruß
Friemler
dazu sollte folgender Code genügen:
@echo off
setlocal
set "SearchExpressions=PfadUndNameDerDateiMitSuchbegriffen"
set "FolderToScan=DerPfadZumOrdnerMitDenDateien"
set "LogFile=PfadUndNameDerZieldatei"
del "%LogFile%" 2>NUL
for /f "usebackq delims=" %%e in ("%SearchExpressions%") do (
>>"%LogFile%" findstr /n /r /c:"\<%%e\>" "%FolderToScan%\*.*"
>>"%LogFile%" echo %%e
>>"%LogFile%" echo.
)
endlocal
Zuerst wird eine evtl. vorhandene alte Ausgabedatei gelöscht. Existiert sie nicht, wird die Fehlermeldung durch 2>NUL nicht angezeigt.
Der Suchstring wird (durch /r) als regulärer Ausdruck betrachtet. FINDSTR sucht nach dem Suchstring buchstabengetreu (durch /c:) und an Wortgrenzen, \<=Wortanfang, \>=Wortende. Wenn das nicht Deinen Anforderungen entspricht, diese Zeichen und den Parameter /r entfernen. Die Zeilennummern werden durch /n ausgegeben. Der Suchstring kann auch Leerzeichen enthalten. Die Ausgabedatei ist nach folgendem Schema aufgebaut:
Dateiname:Zeilennummer:Inhalt der Zeile
gesuchter Ausdruck
Leerzeile
:
:
Wenn Du nur reinen Text ohne Sonderzeichen suchst, ist das ausreichend. Wenn nicht, ist VBScript besser.
Gruß
Friemler

Dann drösel ich das mal auf, auch auf die Gefahr hin, dass einer der beiden B´s bereits batcheln...

Ein schnellschuss aus der Hüfte:
try it
edit der Friemler (zur Abwechslung)
/edit
Zitat von @REBSNB:
Hallo zusammen,
ich kenne mich so gut wie gar nicht mit BATCH-Programmierung aus.
Ich habe folgende Aufgabenstellung:
In einer Textdatei stehen mehrere Suchbegriffe unterschiedlicher Länge ( 1 Suchbegriff pro Zeile )
okHallo zusammen,
ich kenne mich so gut wie gar nicht mit BATCH-Programmierung aus.
Ich habe folgende Aufgabenstellung:
In einer Textdatei stehen mehrere Suchbegriffe unterschiedlicher Länge ( 1 Suchbegriff pro Zeile )
Nun möchte ich in einem bestimmten Verzeichnis alle Dateien nach allen Suchbegriffen durchsuchen
das kann findstrund in einer neuen Textdatei jeweils den Namen der Datei, die Zeilennummer und Suchtext ausgeben
"Zeilennummer" schreit ja gerade nach Findstr /n, wenn dieser darin vorkommt.
Kann mir da jemand helfen?
sicherlich Kann mir da jemand helfen?
Ein schnellschuss aus der Hüfte:
- Ich habe viele cmds im Ordner C:\script\
- dort (C:\script\test.ini) liegt die "steuerdatei"
- C:\script\test.ini ist ein durchlauferhitzer der bei jedem Treffer neugeschrieben wird
- C:\script\test2.ini ist das endresultat
- das ist keine batch, sondern eine Demo für die Dosbox - als batch müssen die einzelnen % gegen %% getauscht werden.
for /f %a in (C:\script\test.txt) do for /f %b in ('dir /s /b c:\script\*.cmd') do (findstr /n "%a" %b>C:\script\test.ini && echo %b %a>>C:\script\test2.ini|type c:\script\test.ini>>C:\script\test2.ini)
try it
edit der Friemler (zur Abwechslung)
Hallo Norbert,
nachdem ich nun den Code auch mal getestet habe (hüstel) konnte ich Deinen Fehler nicht nachvollziehen. Habe aber trotzdem noch eine kleine Verbesserung eingefügt. Jetzt werden die Suchbegriffe (und die Leerzeile) nur noch in die Ergebnisdatei geschrieben, wenn sie vorher auch in einer der zu durchsuchenden Dateien gefunden wurden.
Um Copy 'n Paste-Fehler zu vermeiden, klicke auf das Wort Quelltext rechts oben in der Box mit dem Skript-Code und kopiere den Quelltext aus dem sich dann öffnenden Fenster.
Gruß
Friemler
nachdem ich nun den Code auch mal getestet habe (hüstel) konnte ich Deinen Fehler nicht nachvollziehen. Habe aber trotzdem noch eine kleine Verbesserung eingefügt. Jetzt werden die Suchbegriffe (und die Leerzeile) nur noch in die Ergebnisdatei geschrieben, wenn sie vorher auch in einer der zu durchsuchenden Dateien gefunden wurden.
Um Copy 'n Paste-Fehler zu vermeiden, klicke auf das Wort Quelltext rechts oben in der Box mit dem Skript-Code und kopiere den Quelltext aus dem sich dann öffnenden Fenster.
@echo off
setlocal
set "SearchExpressions=C:\TEST\TEST_FORUM\Suchbegriffe.txt"
set "FolderToScan=C:\TEST\TEST_FORUM\Dateien"
set "LogFile=C:\TEST\TEST_FORUM\Ergebnis.txt"
del "%LogFile%" 2>NUL
for /f "usebackq delims=" %%e in ("%SearchExpressions%") do (
>>"%LogFile%" (findstr /n /r /c:"\<%%e\>" "%FolderToScan%\*.*" && (echo %%e & echo.))
)
endlocal
Gruß
Friemler

moinsen (again)
ich hab etwas länger gebraucht, weil ich den einzeiler auch getestet hab.
Nur habe ich eine "steuerdatei" C:\script\test.txt in der die zu suchenden Inhalte stehen.
Oder andersherum:
Und was hast du?
ich hab etwas länger gebraucht, weil ich den einzeiler auch getestet hab.
Nur habe ich eine "steuerdatei" C:\script\test.txt in der die zu suchenden Inhalte stehen.
Oder andersherum:
Rem für jeden Treffer %a in Steuerdatei "mache" für jeden Treffer %b im Verzeichnis und unterverzeichnis c:\script\*.cmd "mache(schreibe)" finde Treffer %a in %b nach C:\script\test.ini im Erfolgsfall (Treffer in Datei gefunden) schreibe %b (Dateinamen mit Pfad) %a (Suchwort) in das Logfile C:\script\test2.ini
for /f %a in (C:\script\test.txt) do for /f %b in ('dir /s /b c:\script\*.cmd') do (findstr /n "%a" %b>C:\script\test.ini && echo %b %a>>C:\script\test2.ini|type c:\script\test.ini>>C:\script\test2.ini)
Und was hast du?
Hallo REBSNB und willkommen im Forum!
Ziemlich ähnlicher Ansatz wie bereits von Friemler und T-Mo (wobei Groß-/Kleinschreibung nicht unterschieden wird - falls doch gewünscht, "/i" entfernen):
Grüße
bastla
Ziemlich ähnlicher Ansatz wie bereits von Friemler und T-Mo (wobei Groß-/Kleinschreibung nicht unterschieden wird - falls doch gewünscht, "/i" entfernen):
@echo off & setlocal
set "SearchExpressions=C:\TEST\TEST_FORUM\Suchbegriffe.txt"
set "FolderToScan=C:\TEST\TEST_FORUM\Dateien"
set "LogFile=C:\TEST\TEST_FORUM\Ergebnis.txt"
type NUL>"%LogFile%"
for /f "usebackq delims=:" %%e in ("%SearchExpressions%") do for /f "tokens=1-3 delims=:" %%i in ('findstr /i /n /c:"%%e" "%FolderToScan%\*.*"') do (
findstr /b /c:"%%i:%%j" "%LogFile%">nul || (
echo\
echo %%i:%%j
)
echo %%k: %%e
)>>"%LogFile%"
bastla
Hallo bastla,
tut mir leid das sagen zu müssen, aber Dein Skript liefert falsche Ergebnisse. Der Grund ist folgender:
Beim ersten Durchlauf der äußeren FOR-Schleife wird der erste Suchbegriff ausgewählt. Danach wird in dem Ausdruck 1
im Kopf der zweiten FOR-Schleife gesucht. Erzeugt wird eine Liste der Dateinamen mit Zeilennummern und Zeileninhalt. Der Ausdruck 2
prüft, ob der Dateiname schon in der Ergebnisdatei steht, wenn nicht wird er dort hinein geschrieben.
Beim nächsten Durchlauf der äußeren FOR-Schleife (also bei der Suche nach dem nächsten Suchbegriff) liefert Ausdruck 1 wieder eine Dateiliste. Wenn Suchbegriff 1 und Suchbegriff 2 beide in mehreren Dateien vorkommen, tauchen deren Dateinamen sowohl in der Liste, die Ausduck 1 im ersten Durchlauf liefert, als auch in der Liste, die Ausdruck 1 im zweiten Durchlauf liefert, auf. Da der Name der ersten Datei schon in der Ergebnisdatei enthalten ist, schreibt Ausdruck 2 den Namen nicht nochmal hinein. Nur die Zeilennummer und der Suchbegriff landen in der Ergebnisdatei. Dadurch wird der Eindruck erweckt, der zweite Suchbegriff käme nur in der zweiten Datei vor.
Leider habe ich aber auch noch keine funktionierende Alternative (nich' hauen!
).
Gruß
Friemler
tut mir leid das sagen zu müssen, aber Dein Skript liefert falsche Ergebnisse. Der Grund ist folgender:
Beim ersten Durchlauf der äußeren FOR-Schleife wird der erste Suchbegriff ausgewählt. Danach wird in dem Ausdruck 1
findstr /i /n /c:"%%e" "%FolderToScan%\*.*"
findstr /b /c:"%%i:%%j" "%LogFile%">nul || (
echo\
echo %%i:%%j
)
Beim nächsten Durchlauf der äußeren FOR-Schleife (also bei der Suche nach dem nächsten Suchbegriff) liefert Ausdruck 1 wieder eine Dateiliste. Wenn Suchbegriff 1 und Suchbegriff 2 beide in mehreren Dateien vorkommen, tauchen deren Dateinamen sowohl in der Liste, die Ausduck 1 im ersten Durchlauf liefert, als auch in der Liste, die Ausdruck 1 im zweiten Durchlauf liefert, auf. Da der Name der ersten Datei schon in der Ergebnisdatei enthalten ist, schreibt Ausdruck 2 den Namen nicht nochmal hinein. Nur die Zeilennummer und der Suchbegriff landen in der Ergebnisdatei. Dadurch wird der Eindruck erweckt, der zweite Suchbegriff käme nur in der zweiten Datei vor.
Leider habe ich aber auch noch keine funktionierende Alternative (nich' hauen!
Gruß
Friemler
Hallo Friemler!
- war leider das Ergebnis von "Zwischendurch-Batchen" ...
Wenn ja eigentlich jede Datei nur einmal "angefasst" werden darf, müsste das eher so aussehen:
Grüße
bastla
tut mir leid das sagen zu müssen, aber Dein Skript liefert falsche Ergebnisse.
Muss Dir nicht leid tun Wenn ja eigentlich jede Datei nur einmal "angefasst" werden darf, müsste das eher so aussehen:
@echo off & setlocal
set "SearchExpressions=C:\TEST\TEST_FORUM\Suchbegriffe.txt"
set "FolderToScan=C:\TEST\TEST_FORUM\Dateien"
set "LogFile=C:\TEST\TEST_FORUM\Ergebnis.txt"
type NUL>"%LogFile%"
for %%d in ("%FolderToScan%\*.*") do findstr /i /g:"%SearchExpressions%" "%%d" >nul && (
echo\
echo %%~fd
for /f "usebackq delims=" %%e in ("%SearchExpressions%") do for /f "delims=:" %%i in ('findstr /i /n /c:"%%e" "%%d"') do echo %%i: %%e
)>>"%LogFile%"
bastla
Hallo Friemler!
[Edit]
Ich hab' inzwischen auch schon mal an die ziemlich sicher folgende Frage "Lassen sich die Fundstellen denn nicht nach Zeilennummern sortieren?" gedacht:
Wenn mehr über die Suchbegriffe bekannt wäre (insbes., ob diese "!" enthalten), ließe sich das durch Verwendung von "delayedExpansion" natürlich noch etwas hybscher gestalten ...
[/Edit]
Grüße
bastla
Wollte gerade meine Variante posten, aber Du warst schneller (und kürzer).
So what? Kann ja nicht schaden, mehrere Alternativen darzustellen ...[Edit]
Ich hab' inzwischen auch schon mal an die ziemlich sicher folgende Frage "Lassen sich die Fundstellen denn nicht nach Zeilennummern sortieren?" gedacht:
@echo off & setlocal
set "SearchExpressions=C:\TEST\TEST_FORUM\Suchbegriffe.txt"
set "FolderToScan=C:\TEST\TEST_FORUM\Dateien"
set "LogFile=C:\TEST\TEST_FORUM\Ergebnis.txt"
set "T4F=%temp%\Temp4File.txt"
set "Sorted=%temp%\Sorted.txt"
type nul>"%LogFile%"
for %%d in ("%FolderToScan%\*.*") do findstr /i /g:"%SearchExpressions%" "%%d" >nul && (
echo\
echo %%~fd
del "%T4F%" 2>nul
for /f "usebackq delims=" %%e in ("%SearchExpressions%") do for /f "delims=:" %%i in ('findstr /i /n /c:"%%e" "%%d"') do call :ProcessLine %%i "%%e"
call :SortIt
type "%T4F%"
)>>"%LogFile%"
goto :eof
:ProcessLine
set /a Nr=100000+%1
>>"%T4F%" echo %Nr%:%2
goto :eof
:SortIt
sort "%T4F%" /o "%Sorted%"
del "%T4F%"
for /f "usebackq tokens=1* delims=:" %%a in ("%Sorted%") do set /a Nr=%%a-100000 & call :WriteLine %%b
goto :eof
:WriteLine
>>"%T4F%" echo %Nr%:%~1
goto :eof
[/Edit]
Grüße
bastla
Hallo bastla,
Habe mich die letzten paar Minuten mit unserem Spam-Bot User A14011997 beschäftigt...
OK, here we go
Ein Konglomerat aus TimoBeil/bastla/Friemler.
[Edit]
Und trotzdem erst durch bastla's Hinweis fehlerfrei (s.u.).
Gruß
Friemler
Habe mich die letzten paar Minuten mit unserem Spam-Bot User A14011997 beschäftigt...
OK, here we go
@echo off
setlocal
set "SearchExpressions=C:\TEST\TEST_FORUM\Suchbegriffe.txt"
set "FolderToScan=C:\TEST\TEST_FORUM\Dateien"
set "LogFile=C:\TEST\TEST_FORUM\Ergebnis.txt"
del "%LogFile%" 2>NUL
pushd "%FolderToScan%"
for /f "delims=" %%f in ('dir /b /a:-d') do (
for /f "usebackq delims=" %%e in ("%SearchExpressions%") do (
for /f "delims=:" %%n in ('findstr /n /r /c:"\<%%e\>" "%%f"') do (
findstr /b /c:"%%f" "%LogFile%" > NUL || (echo\ & echo %%f)
echo %%n: %%e
)>>"%LogFile%"
)
)
popd
endlocal
Ein Konglomerat aus TimoBeil/bastla/Friemler.
[Edit]
Und trotzdem erst durch bastla's Hinweis fehlerfrei (s.u.).
Gruß
Friemler
Hallo Friemler!

Ich würde allerdings die Zeile 10 durch
ersetzen (und natürlich knapp vor "
Grüße
bastla
P.S.:
Ein Konglomerat aus TimoBeil/bastla/Friemler
Das hat doch was ... Ich würde allerdings die Zeile 10 durch
pushd "%FolderToScan%"
for /f "delims=" %%f in ('dir /b /a:-d') do (
endlocal
" noch "popd
" einfügen) ...Grüße
bastla
P.S.:
Habe mich die letzten paar Minuten mit unserem Spam-Bot User A14011997 beschäftigt...
... habe ich für mich inzwischen schon unter "Zeitverschwendung" abgelegt ...
Hallo bastla,
tja, ja wenn man nicht jedesmal testet...
PS:
Aber Bibers Kommentare sind köstlich...
Gruß
Friemler
tja, ja wenn man nicht jedesmal testet...
PS:
Aber Bibers Kommentare sind köstlich...
Gruß
Friemler

moin,
1.) ist das doch ne ganz andere Baustelle - die dann wieder kein späterer potentieller Fragesteller findet
2.) apropos "finden" - da haben die Köche schon mal was
Gruß
Suchen und Ersetzen Funktion mit implementiert.
1.) ist das doch ne ganz andere Baustelle - die dann wieder kein späterer potentieller Fragesteller findet
2.) apropos "finden" - da haben die Köche schon mal was
Gruß