pantherstyle
Goto Top

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:
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

Content-Key: 114232

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

Printed on: April 26, 2024 at 10:04 o'clock

Mitglied: 77559
77559 Apr 20, 2009 at 07:46:03 (UTC)
Goto Top
Bei mehreren Suchbegriffen nutzt Findstr eine ODER Verknüpfung.
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
Member: bastla
bastla Apr 20, 2009 at 07:47:57 (UTC)
Goto Top
Hallo Pantherstyle!

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
    )
)
Grüße
bastla
Member: Pantherstyle
Pantherstyle Apr 20, 2009 at 07:57:46 (UTC)
Goto Top
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$
    • $URL$
    • $LastChange$
    • $LastChangedDate$
    • $LastchangedBy$

Hier fehlen sowohl die Doppelpunkte, als auch $Author:$ . Woran kann es liegen, dass er diese Datei nicht als Fehlerhaft ausgiebt?
Mitglied: 77559
77559 Apr 20, 2009 at 07:58:54 (UTC)
Goto Top
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 face-wink

Gruß
Lotpings
Member: Pantherstyle
Pantherstyle Apr 20, 2009 at 08:11:00 (UTC)
Goto Top
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:

C:\Arbeitskopie\Suchordner\keintreffer1.txt
C:\Arbeitskopie\Suchordner\keintreffer2.txt
C:\Arbeitskopie\Suchordner\treffer1.txt
C:\Arbeitskopie\Suchordner\treffer2.txt
C:\Arbeitskopie\Suchordner\treffer3.txt
C:\Arbeitskopie\Suchordner\treffer4.txt
C:\Arbeitskopie\Suchordner\treffer5.txt
C:\Arbeitskopie\Suchordner\treffer6.txt

Könnte daher ein Fehler rühren?

PS. der andere Ansatz hat gar keine Ergebnisse geliefert ^^ . Eine Mischung aus nur den richtigen Treffern wäre toll ;D
Mitglied: 77559
77559 Apr 20, 2009 at 08:12:11 (UTC)
Goto Top
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.

* $Id$
    • $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
Member: Pantherstyle
Pantherstyle Apr 20, 2009 at 08:20:48 (UTC)
Goto Top
Folgendes wird bei LotPings auf der Console ausgegeben:

C:\Arbeitskopie\trunk\Daten\SoftwarePaket\Batch-Dateien\IDTools>echo off
C:\ARBEITSKOPIE\HELFER\INDEX.TXT
C:\Arbeitskopie\Suchordner\keintreffer1.txt
C:\Arbeitskopie\Suchordner\keintreffer2.txt
C:\Arbeitskopie\Suchordner\treffer1.txt
C:\Arbeitskopie\Suchordner\treffer2.txt
C:\Arbeitskopie\Suchordner\treffer3.txt
C:\Arbeitskopie\Suchordner\treffer4.txt
C:\Arbeitskopie\Suchordner\treffer5.txt
C:\Arbeitskopie\Suchordner\treffer6.txt
FINDSTR: C:\Arbeitskopie\Suchordner\---------- C:\ARBEITSKOPIE\HELFER\INDEX.TXT
kann nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\keintreffer1.txt
kann nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\keintreffer2.txt
kann nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\treffer1.txt kan
n nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\treffer2.txt kan
n nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\treffer3.txt kan
n nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\treffer4.txt kan
n nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\treffer5.txt kan
n nicht geöffnet werden.
FINDSTR: C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\treffer6.txt kan
n nicht geöffnet werden.
Mitglied: 77559
77559 Apr 20, 2009 at 08:21:23 (UTC)
Goto Top
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.

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 face-smile,
und Logikfehler sind von außen auch schwer zu erkennen.
Member: Pantherstyle
Pantherstyle Apr 20, 2009 at 08:25:46 (UTC)
Goto Top
set OK= ) habe ich in (findstr /L "%%a" %SEARCH_PATH%\%%i\%%j>nul

PS. Auch das mit dem Echo habe ich ganz am Ende zusammen mit Pause eingefügt --> diese Stelle reagiert nicht / wird nicht erreicht.
Mitglied: 77559
77559 Apr 20, 2009 at 08:34:21 (UTC)
Goto Top
Zitat von @Pantherstyle:
Folgendes wird bei LotPings auf der Console ausgegeben:
...
C:\Arbeitskopie\Suchordner\C:\Arbeitskopie\Suchordner\keintreffer1.txt
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.
Member: Pantherstyle
Pantherstyle Apr 20, 2009 at 08:39:10 (UTC)
Goto Top
Hast du außer dem skip=4 auch den delims oder tokens
rausgenommen?
Dann passen der Pfad und die Schleifenvariablen %%A %%B

Nein die tokens und delims habe ich nicht angefasst.
Mitglied: 77559
77559 Apr 20, 2009 at 09:04:52 (UTC)
Goto Top
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
Member: Pantherstyle
Pantherstyle Apr 20, 2009 at 09:16:29 (UTC)
Goto Top
Das mit dem Search_Path habe ich entfernt. Leider gibt er mir noch immer Alle Dateien aus.
Auszug aus der Console Abwicklung:

C:\Arbeitskopie\trunk\Daten\SoftwarePaket\Batch-Dateien\IDTools>echo off
Ein Unterverzeichnis oder eine Datei mit dem Namen "C:\Arbeitskopie\Helfer" exis
tiert bereits.
C:\ARBEITSKOPIE\HELFER\INDEX.TXT
C:\Arbeitskopie\Suchordner\keintreffer1.txt
C:\Arbeitskopie\Suchordner\keintreffer2.txt
C:\Arbeitskopie\Suchordner\treffer1.txt
C:\Arbeitskopie\Suchordner\treffer2.txt
C:\Arbeitskopie\Suchordner\treffer3.txt
C:\Arbeitskopie\Suchordner\treffer4.txt
C:\Arbeitskopie\Suchordner\treffer5.txt
C:\Arbeitskopie\Suchordner\treffer6.txt
FINDSTR: ---------- C:\ARBEITSKOPIE\HELFER\INDEX.TXT kann nicht geöffnet werden
.
Drücken Sie eine beliebige Taste . . .
%A\%B "1 " " * $Id: BI_EPM_IMPORT_ERRORS.sql 18632 2009-02-19 14:52:33Z jueschwa
$"
%A\%B "1 2 " " * $Author: jueschwa $"
%A\%B "1 2 3 " " * $URL: svn://bflexxdev06/branches/SHELL/DEV/bflexxDB.shell/P/B
I_EPM_IMPORT_ERRORS.sql $"
%A\%B "1 2 3 4 " " * $LastChangedRevision: 18632 $"
%A\%B "1 2 3 4 5 " " * $LastChangedDate: 2009-02-19 15:52:33 +0100 (Do, 19 Feb 2
009) $"
%A\%B "1 2 3 4 5 6" " * $LastChangedBy: jueschwa $"
Drücken Sie eine beliebige Taste . . .
%A\%B "1 " " * $Id:$"
%A\%B "1 2 " " * $Author:$"
%A\%B "1 2 3 " " * $URL:$"
%A\%B "1 2 3 4 " " * $LastChangedRevision:$"
%A\%B "1 2 3 4 5 " " * $LastChangedDate:$"
%A\%B "1 2 3 4 5 6" " * $LastChangedBy:$"
Drücken Sie eine beliebige Taste . . .
Drücken Sie eine beliebige Taste . . .
Drücken Sie eine beliebige Taste . . .
Drücken Sie eine beliebige Taste . . .
Drücken Sie eine beliebige Taste . . .
%A\%B "1 " " * $Id:$"
%A\%B "1 2 " " * $Author:$"
%A\%B "1 2 3 " " * $URL:$"
%A\%B "1 2 3 4 " " * $LastChangedRevision:$"
%A\%B "1 2 3 4 5 " " * $LastChangedDate:$"
Drücken Sie eine beliebige Taste . . .
Member: bastla
bastla Apr 20, 2009 at 10:06:06 (UTC)
Goto Top
@lotping
Mein Vorschlag war ja leider ein ziemlicher Schnellschuss face-sad - wenn der dann auch noch langsamer läuft ... face-wink

@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
)
Grüße
bastla
Mitglied: 77559
77559 Apr 20, 2009 at 10:30:30 (UTC)
Goto Top
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
Member: Pantherstyle
Pantherstyle Apr 20, 2009 at 10:52:40 (UTC)
Goto Top
ich habe %%i und %%j überprüft. Sie sind mit den Werten
C: und Arbeitskopie\Suchordner\treffer3.txt belegt. Dies konnte ich aber erst nach mehrerem Probieren herausfinden, da die oben genannte Schleife nicht richtig funktioniert. Sie wird nicht einmal durchlaufen.
Member: bastla
bastla Apr 20, 2009 at 16:15:14 (UTC)
Goto Top
Hallo Pantherstyle!
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
und zusätzlich in der bisherigen Zeile 4 das ">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
Member: Biber
Biber Apr 21, 2009, updated at Oct 18, 2012 at 16:38:01 (UTC)
Goto Top
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
Member: Pantherstyle
Pantherstyle Apr 21, 2009 at 07:37:26 (UTC)
Goto Top
Ohh du hast volkommen Recht ich habe völlig verschwitzt, dass ich schon einen Beitrag dazu hatte sorry.
Mitglied: 77559
77559 Apr 23, 2009 at 08:44:27 (UTC)
Goto Top
Da es mit der PM nicht so klappt hier der letzte Stand.

::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