Strings finden und in eine Datei ausgeben
Guten Montag Morgen,
ich habe eine Batch Datei, die mir Elemente aus einem Ordner nach 6 bestimmten Strings durchsuchen soll und diese in eine Text-Datei schreibt. Dabei soll die Batch-Datei Alle Dateien ausgeben, die einen oder meherere der Strings NICHT enthalten. Die Dateien die Alle Strings in korrekter Schreibweise beinhalten sollen nicht herausgefiltert werden.
Dazu hier mein Code:
Der Code arbeitet mit der Textdatei indexpfade, welche die zu durchsuchenden Dateien mit Pfadangabe enthält. Die hinter findstr aufgezählten Strings sind die Suchkriterien. Bis jetzt filtert meine Batch allerdings nur die Dateien heraus, die gar keinen der Strings enthalten und vernachlässigt diejenigen, die mindestens einen korrekten String beinhalten.
Ich hoffe mal das ich das Problem so geschildert habe, dass mir jemand helfen kann :D
ich habe eine Batch Datei, die mir Elemente aus einem Ordner nach 6 bestimmten Strings durchsuchen soll und diese in eine Text-Datei schreibt. Dabei soll die Batch-Datei Alle Dateien ausgeben, die einen oder meherere der Strings NICHT enthalten. Die Dateien die Alle Strings in korrekter Schreibweise beinhalten sollen nicht herausgefiltert werden.
Dazu hier mein Code:
for /F "skip=4 tokens=1* delims=\" %%i IN (%HELP_PATH%\indexpfade.txt) DO (
findstr /L :"\$Id: \$Author: \$URL: \$LastChangedRevision: \$LastChangedDate: \$LastChangedBy:" %SEARCH_PATH%\%%i\%%j
if ERRORLEVEL 1 echo %SEARCH_PATH% %%i %%j >> %HELP_PATH%\IDtreffer.txt
)
Der Code arbeitet mit der Textdatei indexpfade, welche die zu durchsuchenden Dateien mit Pfadangabe enthält. Die hinter findstr aufgezählten Strings sind die Suchkriterien. Bis jetzt filtert meine Batch allerdings nur die Dateien heraus, die gar keinen der Strings enthalten und vernachlässigt diejenigen, die mindestens einen korrekten String beinhalten.
Ich hoffe mal das ich das Problem so geschildert habe, dass mir jemand helfen kann :D
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 114232
Url: https://administrator.de/forum/strings-finden-und-in-eine-datei-ausgeben-114232.html
Ausgedruckt am: 10.04.2025 um 08:04 Uhr
20 Kommentare
Neuester Kommentar

Bei mehreren Suchbegriffen nutzt Findstr eine ODER Verknüpfung.
Du musst die Ausgabe nochmal parsen ob jeder Suchbegriff vorkommt.
Etwa so (ungetestet) :
Gruß
LotPings
Du musst die Ausgabe nochmal parsen ob jeder Suchbegriff vorkommt.
Etwa so (ungetestet) :
@echo off&setlocal EnableDelayedExpansion
for /F "skip=4 tokens=1* delims=\" %%A IN (%HELP_PATH%\indexpfade.txt
) DO CAll :Sub1 "%SEARCH_PATH%\%%A\%%B"
goto :eof
:Sub1
for /L %%N in (1 1 6) do if defined S%%N set "S%%N="
for /F "Delims=" %%C in (
'findstr /L "\$Id: \$Author: \$URL: \$LastChangedRevision: \$LastChangedDate: \$LastChangedBy:" %1'
) do call :Sub2 "%%C"
if "123456" NEQ "%S1%%S2%%S3%%S4%%S5%%S6%" echo %1 >> %HELP_PATH%\IDtreffer.txt
Goto :eof
:Sub2
Echo %1|findstr /L "\$Id:" >NUL 2>&1 && Set S1=1
Echo %1|findstr /L "\$Author:" >NUL 2>&1 && Set S2=2
Echo %1|findstr /L "\$URL:" >NUL 2>&1 && Set S3=3
Echo %1|findstr /L "\$LastChangedRevision:" >NUL 2>&1 && Set S4=4
Echo %1|findstr /L "\$LastChangedDate:" >NUL 2>&1 && Set S5=5
Echo %1|findstr /L "\$LastChangedBy:" >NUL 2>&1 && Set S6=6
Gruß
LotPings
Hallo Pantherstyle!
Du könntest es so versuchen:
Grüße
bastla
Du könntest es so versuchen:
for /F "skip=4 tokens=1* delims=\" %%i IN (%HELP_PATH%\indexpfade.txt) DO (
set OK=True
for %%a in (\$Id: \$Author: \$URL: \$LastChangedRevision: \$LastChangedDate: \$LastChangedBy:) do
findstr /L: "%%a" %SEARCH_PATH%\%%i\%%j>nul || set OK=
if not defined OK echo %SEARCH_PATH% %%i %%j >> %HELP_PATH%\IDtreffer.txt
)
)
bastla

Hallo bastla,
dein Ansatz ist zwar kürzer, erfordert aber mehrfaches Durchlaufen aller Dateien. Hab auch hi und her überlegt und nur die Ergebnisse mehrmals verarbeitet.
Jedenfalls hat er jetzt ja 2 Ansätze
Gruß
Lotpings
dein Ansatz ist zwar kürzer, erfordert aber mehrfaches Durchlaufen aller Dateien. Hab auch hi und her überlegt und nur die Ergebnisse mehrmals verarbeitet.
Jedenfalls hat er jetzt ja 2 Ansätze
Gruß
Lotpings

Zitat von @Pantherstyle:
Hallo LotPings ich habe deinen Ansatz soweit übernommen und
eingefügt (aber noch nicht verstanden :D), leider trifft er zwar
den Großteil, aber eine Datei gibt er dennoch als richtig aus,
obwohl sie es nicht ist. Inhalt dieser Datei:
Eigentlich gibt er nur Fehlerhafte aus.Hallo LotPings ich habe deinen Ansatz soweit übernommen und
eingefügt (aber noch nicht verstanden :D), leider trifft er zwar
den Großteil, aber eine Datei gibt er dennoch als richtig aus,
obwohl sie es nicht ist. Inhalt dieser Datei:
* $Id$
Hier fehlen sowohl die Doppelpunkte, als auch $Author:$ . Woran kann
es liegen, dass er diese Datei nicht als Fehlerhaft ausgiebt?
- $URL$
- $LastChange$
- $LastChangedDate$
- $LastchangedBy$
Hier fehlen sowohl die Doppelpunkte, als auch $Author:$ . Woran kann
es liegen, dass er diese Datei nicht als Fehlerhaft ausgiebt?
Stehen die Suchbegriffe evtl. an andere Stelle in der Datei?
Ich kan hier nur einfache Tests machen, in der Kommandozeile ergibt
>Echo $Id$|findstr /L "\$Id:" && echo gefunden || echo nicht gefunden
nicht gefunden
Kann ich mir also nicht erklären.
Bau dir doch mal zum Testen einen echo Befehl ganz am Ende ein:
Echo %%A\%%B "%S1%%S2%%S3%%S4%%S5%%S6%" %1
Gruß
LotPings

Zitat von @Pantherstyle:
Sorry hatte noch ein Relikt eingebaut. Das Skip 4 wird gestrichen (da
an anderer Stelle nicht mehr benötigt). Durch das Löschen
von skip= 4 zeigt er mir jetzt jedoch ALLE Dateien an, auch
diejenigen, die keine Fehler enthalten. Vielleicht hilft euch ja ein
Einblick in die Datei, aus der gelesen wird:
Der Batch ist ja nach deinen Kriterien entstanden, das kann ich von hier nicht beurteilen. Bau mal den Echo aus dem anderen Posting ein.Sorry hatte noch ein Relikt eingebaut. Das Skip 4 wird gestrichen (da
an anderer Stelle nicht mehr benötigt). Durch das Löschen
von skip= 4 zeigt er mir jetzt jedoch ALLE Dateien an, auch
diejenigen, die keine Fehler enthalten. Vielleicht hilft euch ja ein
Einblick in die Datei, aus der gelesen wird:
PS. der andere Ansatz hat gar keine Ergebnisse geliefert
bastla hat den Fehler mit dem Doppelpunkt nach dem /L übernommen, nimm das mal raus.. Eine Mischung aus nur den richtigen Treffern wäre toll ;D
Tests mit deinen Daten kannst nun mal nur Du selbst machen und Logikfehler sind von außen auch schwer zu erkennen.

...
Hast du außer dem skip=4 auch den delims oder tokens rausgenommen?
Dann passen der Pfad und die Schleifenvariablen %%A %%B nicht mehr.
C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\keintreffer1.txt
kann nicht geöffnet werden.
FINDSTR:
kann nicht geöffnet werden.
FINDSTR:
Hast du außer dem skip=4 auch den delims oder tokens rausgenommen?
Dann passen der Pfad und die Schleifenvariablen %%A %%B nicht mehr.

Dein ganzer Aufbau passt ja auch nicht.
Wenn die Zeilen aus der Datei "%HELP_PATH%\indexpfade.txt"
so aussehen:
C:\Arbeitskopie\Suchordner\keintreffer1.txt
und du sie parst mit:
for /F "tokens=1* delims=\" %%A
Dann steht in
%%A=C:
%%B=Arbeitskopie\Suchordner\keintreffer1.txt
Offensichtlich steht in der Variable
%Searchpath%=C;\Arbeitskopie\Suchordner\
sodass dann in der Kombination dies herauskommt, was nicht funktionieren kann:
C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\keintreffer1.txt
Entweder musst du tokens anpassen oder den Searchpath weglassen.
In dem Log kamen auch ein paar Zeilen mit Strichen vor, verursacht wogl durch Findstr; die kann man unterdrcken indem man die Datei nicht direkt angibt sondern per Umleitung durch <Datei.
Gruß
LotPings
Wenn die Zeilen aus der Datei "%HELP_PATH%\indexpfade.txt"
so aussehen:
C:\Arbeitskopie\Suchordner\keintreffer1.txt
und du sie parst mit:
for /F "tokens=1* delims=\" %%A
Dann steht in
%%A=C:
%%B=Arbeitskopie\Suchordner\keintreffer1.txt
Offensichtlich steht in der Variable
%Searchpath%=C;\Arbeitskopie\Suchordner\
sodass dann in der Kombination dies herauskommt, was nicht funktionieren kann:
C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\keintreffer1.txt
Entweder musst du tokens anpassen oder den Searchpath weglassen.
In dem Log kamen auch ein paar Zeilen mit Strichen vor, verursacht wogl durch Findstr; die kann man unterdrcken indem man die Datei nicht direkt angibt sondern per Umleitung durch <Datei.
Gruß
LotPings
@lotping
Mein Vorschlag war ja leider ein ziemlicher Schnellschuss
- wenn der dann auch noch langsamer läuft ... 
@Pantherstyle
Vielleicht ja so (unter der Voraussetzung, dass in %%i und %%j auch das drin ist, was rein gehört):
Grüße
bastla
Mein Vorschlag war ja leider ein ziemlicher Schnellschuss
@Pantherstyle
Vielleicht ja so (unter der Voraussetzung, dass in %%i und %%j auch das drin ist, was rein gehört):
for /F "tokens=1* delims=\" %%i IN (%HELP_PATH%\indexpfade.txt) DO (
set OK=True
for %%a in (\$Id: \$Author: \$URL: \$LastChangedRevision: \$LastChangedDate: \$LastChangedBy:) do
findstr /B "%%a" %SEARCH_PATH%\%%i\%%j>nul || set OK=
)
if not defined OK echo %SEARCH_PATH% %%i %%j >> %HELP_PATH%\IDtreffer.txt
)
bastla

Sorry,
aber Ich kann jetzt nicht mehr erkennen mit welcher Version der Batch Datei Du arbeitest.
Ich glaube das führt jetzt hier auch etwas weit. Wenn du willst kannst du mir Persönlicher Mail ein paar der Dateien schicken.
Meine Mail ist mein UserName at online dot ms
Gruß
LotPings
aber Ich kann jetzt nicht mehr erkennen mit welcher Version der Batch Datei Du arbeitest.
Ich glaube das führt jetzt hier auch etwas weit. Wenn du willst kannst du mir Persönlicher Mail ein paar der Dateien schicken.
Meine Mail ist mein UserName at online dot ms
Gruß
LotPings
Hallo Pantherstyle!
und zusätzlich in der bisherigen Zeile 4 das "
Was der Code macht (oder zumindest machen sollte):
Für jede Datei wird zunächst die Variable %OK% mit dem Wert "True" vorbelegt und danach nach jedem der in der "for %%a"-Schleife angegebenen Begriffe durchsucht, wobei verlangt ist, dass der Suchbegriff in der durchsuchten Datei am Anfang der Zeile stehen muss (ansonsten das "/B" weg lassen).
Wird ein Suchwort nicht gefunden, wird der Inhalt von %OK% gelöscht (damit gilt %OK% als "
Grüße
bastla
da die oben genannte Schleife nicht richtig funktioniert. Sie wird nicht einmal durchlaufen.
Du kannst ja zum Testen und Nachvollziehen die folgende Zeile vor der bisherigen Zeile 4 einfügen:echo Suche %%a in %SEARCH_PATH%\%%i\%%j
>nul
" entfernen ...Was der Code macht (oder zumindest machen sollte):
Für jede Datei wird zunächst die Variable %OK% mit dem Wert "True" vorbelegt und danach nach jedem der in der "for %%a"-Schleife angegebenen Begriffe durchsucht, wobei verlangt ist, dass der Suchbegriff in der durchsuchten Datei am Anfang der Zeile stehen muss (ansonsten das "/B" weg lassen).
Wird ein Suchwort nicht gefunden, wird der Inhalt von %OK% gelöscht (damit gilt %OK% als "
not defined
"). Nach der "for %%a"-Schleife kann %OK% demnach nur dann noch einen Inhalt haben, wenn jeder einzelne Suchbegriff gefunden wurde - anderenfalls werden die Dateidaten in die Datei "IDtreffer.txt" geschrieben.Grüße
bastla
Moin Pantherstyle,
Nachfrage:
hat sich jetzt Dein Parallelbeitrag Filter reagieren falsch erledigt und kann der in den Papierkorb verschoben werden?
Die damalige Aufgabenstellung scheint sich ja jetzt durch diese neuen Variationen des Themas überholt zu sein.
Oder liest Du in dem anderen Thread auch noch mit?
Grüße
Biber
Nachfrage:
hat sich jetzt Dein Parallelbeitrag Filter reagieren falsch erledigt und kann der in den Papierkorb verschoben werden?
Die damalige Aufgabenstellung scheint sich ja jetzt durch diese neuen Variationen des Themas überholt zu sein.
Oder liest Du in dem anderen Thread auch noch mit?
Grüße
Biber

Da es mit der PM nicht so klappt hier der letzte Stand.
Gruß
LotPings
::IDtool.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
set SEARCH_PATH=F:\Test\1\Suchordner
set HELP_PATH=F:\Test\1\Helfer
set Log=IDBlockUnvollstaendig.txt
pushd %HELP_PATH%
rd "%HELP_PATH%" /s /q 1>NUL 2>NUL
For /F "delims=" %%A in (
'DIR "%SEARCH_PATH%" /B /S /A-D /On ^|find /V /I "svn"'
) Do call :Process "%%~fA"
popd
start "" Notepad "%HELP_PATH%\%Log%"
goto :eof
:Process
set File=%1
echo Processing %File%
for /L %%N in (1 1 6) do if defined S%%N set "S%%N="
for /F "Delims=" %%C in (
'Type %1^|findstr /L "\$Id: \$Author: \$URL: \$LastChangedRevision: \$LastChangedDate: \$LastChangedBy:"'
) do call :Sub2 "%%C"
if "123456" NEQ "%S1%%S2%%S3%%S4%%S5%%S6%" echo "%S1%%S2%%S3%%S4%%S5%%S6%" %1 >>"%HELP_PATH%\%Log%"
Goto :eof
:Sub2
Echo %1|findstr /L "\$Id:" >NUL 2>&1 && Set S1=1
Echo %1|findstr /L "\$Author:" >NUL 2>&1 && Set S2=2
Echo %1|findstr /L "\$URL:" >NUL 2>&1 && Set S3=3
Echo %1|findstr /L "\$LastChangedRevision:" >NUL 2>&1 && Set S4=4
Echo %1|findstr /L "\$LastChangedDate:" >NUL 2>&1 && Set S5=5
Echo %1|findstr /L "\$LastChangedBy:" >NUL 2>&1 && Set S6=6
::Echo %File% "%S1%%S2%%S3%%S4%%S5%%S6%" %1
::IDtool.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Gruß
LotPings