simba
Goto Top

Ausgabe von FOR Schleife umleiten (zB zu more)

Das DO von FOR nimmt immer den gesamten Rest der Zeile als Befehl zB:
FOR /F %i IN ('dir *.extension /b /s') DO find /N "seachString" %i | more
will nicht tun.

Also was ich genau machen möchte ist wie in dem Bspl im Untertitel:

FOR /F %i IN ('dir *.extension /b /s') DO find /N "seachString" %i | more

Suche nach einem String in allen Dateien die mit dem dir Befehl gefunden werden und die Ausgabe dann an more weiterzureichen, da sie ggf. recht lang werden kann und man dann nicht mehr viel damit anfangen kann :D

Wie bekomm ich das hin?

Hab mir Errormessage innerhalb einer FOR Schleife in File umleiten? schon angeguckt, aber irgendiwe ist mir das Licht nicht aufgegangen.

Danke schon mal im voraus.


gruss
simba

Content-ID: 34226

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Dani
Dani 14.06.2006 um 19:18:41 Uhr
Goto Top
Hi,
probier es mal mit diesen Zeilen:
@echo off
FOR /F %%i IN ('dir /s /b "*.txt"') DO find /N "das" %%i | more   


Gruß
Dani
Biber
Biber 15.06.2006 um 09:34:10 Uhr
Goto Top
Moin Simba,

in diesem Fall ist die Lösung über eine FOR..IN..DO..Anweisung aufwändiger (obwohl ich dafür natürlich auch eine Lösung posten könnte).

Mach es in diesem Fall so:
(Beispiel vom CMD-Prompt)
findstr /i /n "searchstr" *.extension
[Output]Beispiel.extension:17:hier ist ein searchstr

Und da ggf. noch ein "|more" dahintersetzen.

Gruß
Biber
simba
simba 16.06.2006 um 05:12:12 Uhr
Goto Top
Hi,
probier es mal mit diesen Zeilen:
> @echo off
> FOR /F %%i IN ('dir /s /b "*.txt"') DO find /N "das" %%i | more   
> 


Gruß
Dani

Moin,
hmm so wie ich das sehe ist das genau meine Verison nur für ein batch file und nicht konsole, aber danke trotzdem. Leider funktioniert es so nicht face-sad For ruft eben das " | more" jedes mal mit auf. Ich würde aber gerne den gesamten output blättern.
Naja ein & pause anstatt | more tut zwar auch was in der Art aber ist nicht wirklich schön ;)
alles vorher mit >> temp.temp.temp in eine Datei zu schrieben und dann type temp.temp.temp | more ginge aber ist (zumindest mir) nicht in einer Zeile in der konsole möglich.
Daher mit (Achtung untestet :D )
@echo off
If EXIST temp.temp.temp GOTO BadEnd
FOR /F %%i IN ('dir /b /s *.extension') Do find /N "searchString" %%i >> temp.temp.temp  
type temp.temp.temp | more
del temp.temp.temp

GOTO End
:BadEnd
echo "temp.temp.temp existiert, ich will nichts ueberschrieben, also verfruehtes Ende"  
echo "temp.temp.temp loeschen und neu ausfuehren, damits geht. Danke"  
:End
pause
würde es gehen, aber nicht von der Konsole.



Moin Simba,

in diesem Fall ist die Lösung über
eine FOR..IN..DO..Anweisung aufwändiger
(obwohl ich dafür natürlich auch
eine Lösung posten könnte).

Mach es in diesem Fall so:
(Beispiel vom CMD-Prompt)
findstr /i /n "searchstr"
*.extension
[Output]Beispiel.extension:17:hier ist ein
searchstr

Und da ggf. noch ein "|more"
dahintersetzen.

Gruß
Biber

Hmmm,
was soll ich dazu sagen, die Lösung ist viel zu schön einfach :D Danke!

btw ich hab den Eindruck, dass findstr nicht rekursiv in Unterordnern sucht.
shame on me, aber bin gerade zu faul zum Testen -.-

Aber da du ja noch eine Lösung parat hast für die andere Version mit FOR über find würde die mich schon interessieren. Will vor allem wissen, ob du es über eine temporäre Datei machen würdest, das ist das einzige was mir dazu noch eingefallen ist.


cheers
gimmegimme
Biber
Biber 16.06.2006 um 09:59:27 Uhr
Goto Top
Moin simba,

1) Findstr sucht auch in Unterverzeichnissen mit Parameter /s
Beispiel:
Findstr /i /n /s "Server" c:\*.txt

2) Meine Variante zum Wort-Finden in Textdateien:
::-- 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 /i %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

Beispiel-Output mit Dateinagabe und Zeilennummer:
wordfind d:\temp\*.txt "biber"
[d:\temp\TEmp-Dokument.txt:015] HTH Biber
[d:\temp\test1.txt:015] HTH Biber
[d:\temp\test2.txt:018] HTH Biber
[d:\temp\test2.txt:050] HTH Biber

Gruß Biber
P.S. In der "IF NOT [..]..." -Zeile kann natürlich auch noch ein "|more" angehängt werden.
Ebenso aber auch beim Aufruf selbst ( WordFind *.txt "bla" |more ).
simba
simba 17.06.2006 um 17:16:18 Uhr
Goto Top
Moin Biber

hab Tomaten auf den Augen gehabt :D

hab mir help findstr angeguckt aber /s überlesen gehabt :D, ansich das standard dazu in Win ~~

dein Wordfind übersteigt meine Batchkenntnisse -.-, sieht aber aber nett aus. Wennde Lust und Zeit hast kannste das ja mal ein wenig kommentieren, was in den Zeilen passiert, aber ich könnte mir natürlich auch einfach ein wenig die Batch language specs angucken.

Danke erstmal für eure Hilfen, werds als gelöst markieren, auch wenn ich immernoch nicht weiß wie ich For find in der Kommandozeile auf more weiterleite, aufgrund der doch recht unständlichen Methoden geh ich einfach mal davon aus, dass es nicht geht (°o°).


Danke nochmal

Gruß
simba


edit verdammt, hab deinen (Biber's) ersten beitrag 5* markiert wollte eigentlich den 2ten, aber was solls.


edit2 Juhuuuuuu

Die Lösung ist viel zu leicht gewesen, kein wunder, dass es keinem eingefallen ist :D

c:\[Path to seach root]\> @echo off & ((For /F %i In ('dir /s /b "[Match]"') Do find /N "seachString" %i) | more) & @echo on  

hehe eine Klammer vor FOR und eine vor dem | Schaeffer Strich schon tut das wie es soll :D