v-twin-1000
Goto Top

Mehrstufige String-Suche durch Batchdatei ?

Hallo allerseits,

ich möchte das unten stehende Batch von biber auf "mehrere Strings in einer Zeile suchen" erweitern.

Zu Fuß über Zwischen-Dateien hat das geklappt
z.B.
1.Step wordfind c:\xyz\*.* "String1" > c:\temp\string1.txt
2.Step wordfind c:\temp\string2.txt "String2" > c:\temp\string2.txt
2.Step wordfind c:\temp\string3.txt "String3" > c:\temp\string3.txt
usw.

Wie kann ich das in das vorhande Batch integrieren ?


::-- snipp Wordfind.bat
:: einfacher Batchdreizeiler zum Suchen eines Strings in Dateien.
:: Usage: Batch irgendwo in den Pfad stellen.
:: Aufruf: Wordfind [Dateimaske] [Suchwort]
:: -Beispiel: Wordfind d:\temp\*.txt "biber"
:: !! Skizze: ohne Parameterprüfung, Help, etc.
@echo off
If Not [%1]==[___] (%0 ___ %1|find %2) & goto :eof
Setlocal EnableDelayedExpansion
for %%i in (%2) do (
Set /a "Line=10000"
For /F "delims=" %%a In (%%i) Do (
Set /a "Line=!line! +1"
Set cl=!line:~-3!
echo [%%i:!cl!] %%a
))
::-- snapp Wordfind.bat

Content-Key: 51411

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

Printed on: April 16, 2024 at 05:04 o'clock

Member: AxelHahn
AxelHahn Feb 12, 2007 at 13:41:16 (UTC)
Goto Top
Hallo,

wenn du mit UND Verknüpfung suchen willst, dann Pipe alles hintereinander:

type [Dateiname] | findstr "begriff1" | findstr "Begriff2" (... usw. ...)

Bei Suche mit ODER trenne deine Begriffe mit Leerzeichen

type [Dateiname] | findstr "begriff1 Begriff2 (... usw. ...)"

oder verwende eine Textdatei mit Suchbegriffen (je Zeile einer) - in findstr ist es Parameter G:/[Dateiname].


Ggf. helfen auch reguläre Suchmuster, um aus deinen Suchbegriffen ben nur einen Suchbegriff zu machen (das erzwingt aber eine Reihenfolge der Suchbegriffe), z.B.

type [Dateiname] | findstr "Begriff1.*Begriff2(... usw. ...)"


Viele Grüsse
-= Axel =-
Member: V-Twin-1000
V-Twin-1000 Feb 13, 2007 at 08:54:07 (UTC)
Goto Top
Hallo Axel,

das mit "findstr" geht ganz gut. Jetzt möchte das Batch noch umbauen das bis zu 4
suchstrings eingegeben werden können. Das funktioniert leider nicht, aber warum ?

So habe ich es aufgebaut:

:: einfacher Batchdreizeiler zum Suchen eines Strings in Dateien.
:: Usage: Batch irgendwo in den Pfad stellen.
:: Aufruf: Wordfind [Dateimaske] [Suchwort]
:: -Beispiel: Wordfind d:\temp\*.txt "biber" "schlotter" "Zitter" "hurz"
@echo off
:s4
ECHO s4
IF [%5] == [___] goto :s3
If Not [%1]==[___] (%0 ___ %1|findstr "%2" |findstr "%3" |findstr "%4" |findstr "%5") & goto :eof
goto :search
:s3
ECHO s3
IF [%4] == [___] goto :s2
If Not [%1]==[___] (%0 ___ %1|findstr "%2" |findstr "%3" |findstr "%4") & goto :eof
goto :search
:s2
ECHO s2
IF [%3] == [___] goto :s1
If Not [%1]==[___] (%0 ___ %1|findstr "%2" |findstr "%3" ) & goto :eof
goto :search
:s1
ECHO s1
IF [%2] == [___] goto :eof
If Not [%1]==[___] (%0 ___ %1|findstr "%2" ) & goto :eof
:search
ECHO search
Setlocal EnableDelayedExpansion
for %%i in (%2) do (
Set /a "Line=10000"
For /F "delims=" %%a In (%%i) Do (
Set /a "Line=!line! +1"
Set cl=!line:~-3!
echo [%%i:!cl!] %%a
))
Member: Biber
Biber Feb 13, 2007 at 09:10:48 (UTC)
Goto Top
Moin V-Twin-1000,
-in Bearbeitung--
Member: Biber
Biber Feb 14, 2007 at 20:58:05 (UTC)
Goto Top
Soooooooo, V-Twin-1000,

hat einen Moment länger gedauert.
Aber jetzt habe ich wenigstens eine Alternative für Dich ...

Vorschlag.
:: ---- snipp WordsInOneLine.bat Biber 2007
@echo off & setlocal
If [%2]== (echo Syntax: %~n0 ^<FileMask^> ^<searchStr1 [..searchStrN]^>) && goto :eof
Set "filemask=%~1" & set "SearchStr1=%~2"  
Shift & Shift
For %%i in (%1 %2 %3 %4 %5 %6 %7 %8 %9) do call :addFilter "%%~i"  
set "allfilter=findstr /n /i "%searchstr1%" "%filemask%" %NextFilter%"  
Set allfilter=%allfilter:@@@=^^^|%
for /f "delims=" %%i in ('%Allfilter%') do echo %%i  
goto :eof
:AddFilter
Set "NextFilter=%nextfilter%@@@findstr /i %1"  

In Aktion mit unterschiedlicher Parameteranzahl:
>WordsInOneLine /?
Syntax: WordsInOneLine <FileMask> <searchStr1 [..searchStrN]>
(= 8:54:15  D:\temp=)
>type f:\temp\ziffern.txt
eins zwei drei vier fünf sechs sieben acht neun sieben acht neun
sieben acht neun zehn elf drei vier fünf drei vier fünf
zwölf dreizehn sieben acht neun sieben acht neun
sieben acht neun sieben acht neun drei vier fünf
drei vier fünf drei vier fünf drei vier fünf drei vier fünf
eins zwei drei vier eins zwei drei vier eins zwei drei vier
zehn elf drei vier zehn elf drei vier zehn elf drei vier
(= 8:54:58  D:\temp=)
>wordsInOneLine f:\temp\zi*.* vier
f:\temp\Ziffern.txt:1:eins zwei drei vier fünf sechs sieben acht neun sieben acht neun
f:\temp\Ziffern.txt:2:sieben acht neun zehn elf drei vier fünf drei vier fünf
f:\temp\Ziffern.txt:4:sieben acht neun sieben acht neun drei vier fünf
f:\temp\Ziffern.txt:5:drei vier fünf drei vier fünf drei vier fünf drei vier fünf
f:\temp\Ziffern.txt:6:eins zwei drei vier eins zwei drei vier eins zwei drei vier
f:\temp\Ziffern.txt:7:zehn elf drei vier zehn elf drei vier zehn elf drei vier

(= 8:55:14  D:\temp=)
>wordsInOneLine f:\temp\zi*.* vier fünf
f:\temp\Ziffern.txt:1:eins zwei drei vier fünf sechs sieben acht neun sieben acht neun
f:\temp\Ziffern.txt:2:sieben acht neun zehn elf drei vier fünf drei vier fünf
f:\temp\Ziffern.txt:4:sieben acht neun sieben acht neun drei vier fünf
f:\temp\Ziffern.txt:5:drei vier fünf drei vier fünf drei vier fünf drei vier fünf

(= 8:55:19  D:\temp=)
>wordsInOneLine f:\temp\zi*.* vier fünf acht
f:\temp\Ziffern.txt:1:eins zwei drei vier fünf sechs sieben acht neun sieben acht neun
f:\temp\Ziffern.txt:2:sieben acht neun zehn elf drei vier fünf drei vier fünf
f:\temp\Ziffern.txt:4:sieben acht neun sieben acht neun drei vier fünf

(= 8:55:24  D:\temp=)
>wordsInOneLine f:\temp\zi*.* vier fünf acht sieben
f:\temp\Ziffern.txt:1:eins zwei drei vier fünf sechs sieben acht neun sieben acht neun
f:\temp\Ziffern.txt:2:sieben acht neun zehn elf drei vier fünf drei vier fünf
f:\temp\Ziffern.txt:4:sieben acht neun sieben acht neun drei vier fünf

(= 8:55:29  D:\temp=)
>wordsInOneLine f:\temp\zi*.* vier fünf acht sieben elf
f:\temp\Ziffern.txt:2:sieben acht neun zehn elf drei vier fünf drei vier fünf

(= 8:55:32  D:\temp=)
>wordsInOneLine f:\temp\zi*.* vier fünf acht sieben zehn
f:\temp\Ziffern.txt:2:sieben acht neun zehn elf drei vier fünf drei vier fünf

Ich denke, der ist flexibel genug und ich hab ihn so lang gelassen, dass er noch lesbar bleibt.

Gruss
Biber

[Edit 15.2.2007 Demo-Beispiel ausgetauscht]
Member: V-Twin-1000
V-Twin-1000 Feb 16, 2007 at 11:08:38 (UTC)
Goto Top
Hallo Biber,

funktioniert einwandfrei. Danke !

Gruß
V-Twin-1000
Member: Biber
Biber Feb 16, 2007 at 12:59:40 (UTC)
Goto Top
Freut mich, V-Twin-1000,

kannst Du den Beitrag dann "Editieren" und auf "Erledigt" setzen bitte?

Ich habe unter "Windows" weder mehr Plan noch mehr Rechte als jeder andere und kann es daher nicht selbst tun.

Schönes Wochenende
Biber

[Edit] Beitrag wurde von "Windows" nach "Batch & Shell" verschoben inzwischen. [/Edit]