Batch Zeilennummer in der "find" erfolgreich war in doppelter For-Schleife ausgeben

Mirumoto

Cadet 1st Year
Registriert
März 2011
Beiträge
11
Hallo zusammen,

ich möchte einigt txt-Dateien auf ihren Inhalt hin prüfen und mir dann die Zeile, in der die Suche fündig geworden ist, ausgeben lassen.
Bei mir sieht das bisher so aus

Code:
for %%f in (
C:\Users\Alex\Downloads\*.txt) do (
for /F "delims=" %%a in ('findstr /n /c:"Konjunktur und Politik" %%f') do set var=%%a
echo %var:~0,1%
pause
)

Mit %var:~0,1% will ich die Zeilennummer erhalten. Das funktioniert auch wenn ich es außerhalb der ersten Schleife mit einer Test-Datei versuche, aber die Variable %%f wird in meiner zweiten for-Schleife nicht mehr erkannt..
Hat jemand vielleicht eine Idee wie ich das lösen könnte?

Vielen Dank schonmal,
Gruß Alex
 
Das Setzen und Verwenden von Variablen innerhalb einer Schleife funktioniert so wie Du es machst nicht korrekt.
Damit es so klappt, wie man es meist erwartet, musst Du vorher ein "setlocal enabledelayedexpansion" machen.
Zusätzlich benutzt Du dann ! statt %

Die innere Schleife und dein Echo habe ich angepasst, damit es auch mit Zeilennummern größer 9 klappt.
Zudem das echo in die innere Schleife verlegt, damit alle Treffer ausgeben werden, und nicht nur der letzte.
Der Rest dient dazu die Treffer aus mehreren Dateien auseinander zu halten (dafür war bei Dir wohl das Pause).

Code:
@echo off
setlocal enabledelayedexpansion

for %%f in (C:\Users\Alex\Downloads\*.txt) do (
    echo Datei: %%f
    echo -------------------
    for /F "tokens=1 delims=:" %%a in ('findstr /n /c:"Konjunktur und Politik" %%f') do (
        set var=%%a
        echo !var!
    )
    echo.
    rem pause
)

echo on

oder
Code:
@echo off
setlocal enabledelayedexpansion

for %%f in (C:\Users\Alex\Downloads\*.txt) do (
    for /F "tokens=1 delims=:" %%a in ('findstr /n /c:"Konjunktur und Politik" %%f') do (
        set var=%%a
        echo !var! - %%f
    )
    rem pause
)

echo on
 
Du brauchst dafür doch gar keine Schleife. Ich hab eben mal kurz gegoogelt und getestet und findstr bringt doch alles mit was du benötigst.

Code:
findstr /n /c:"Konjunktur und Politik" C:\Users\Alex\Downloads\*.txt

Das gibt die Zeilennummer, die entsprechende Datei und die Zeile aus. Oder hab ich dich falsch verstanden?
 
Kurz aus der Schleife springen dürfte auch gehen.
Etwa so:

Code:
for %%i in (%UserProfile%\Downloads\*.txt) do (
	for /f "delims=" %%j in ('type "%%i" ^| find /i /n "Konjunktur und Politik"') do (

  set "a=%%j"
  call :output

))

:output
echo ^> Zeile: %a:~1,1%

@Freezedevil
Ich glaube es geht darum das nur die Zeilennummer ausgegeben wird.
 
Wow, das ging schnell, danke!
findstr bringt aber in der Tat schon alles mit was ich mir wünschte.. Ich konnte nur nicht richtig damit umgehen... :(

Hab auch mit Hilfe eines anderen Forums jetzt folgenden Code:
Code:
pushd "C:\Users\Alex\Downloads"
for /f "tokens=1,2* delims=:" %%i in ('findstr /n /c:"Konjunktur und Politik" "*.txt"') do (
  echo gefundener String: "%%k"
  echo in Zeile: %%j
  echo der Datei: "%%~fi"
  echo ~~~~~~~~~~~~~~~~~~~~~~~~
)
popd

VIELEN DANK!!!
 
Sneedlewoodz schrieb:
Ich glaube es geht darum das nur die Zeilennummer ausgegeben wird.

Das halte ich zwar irgendwie für sinnlos, wenn man nicht weiß aus welcher Datei das ist, aber bitte:

Code:
@echo off
for /f "tokens=2 delims=:" %%a in ('findstr /n /c:"Konjunktur und Politik" C:\Users\Alex\Downloads\*.txt') do echo %%a

Edit: Ok, hat sich ja dann erledigt.
 
Na eine Frage hätte ich gleich noch im Anschluss wenn hier schon so reger Verkehr herrscht :)

Ich möchte noch die letzten 4 Stellen des Dateinamens abschneiden, leider klappt das aber nicht so wirklich..

Code:
for /f "tokens=1,2* delims=:" %%i in ('findstr /n /c:"Unternehmen und Branchen" "%vortag%%date:~3,2%%date:~8,2%s*.txt"') do (
  echo gefundener String: "%%k"
  echo in Zeile: %%j
  echo der Datei: "%%~fi"
set test=%%i
If %%j LEQ 5 echo %test:~0,-4% >> ausgewaehlte.txt

Also die letzten beiden Zeilen machen mir hier Probleme..

Bin dankbar für jeden Hinweis!
 
das klappt bei mir leider nicht, im CMD Fenster steht dann "echo ~-0,4 1>>" ..?
 
Das ist dann wieder die Problematik die oben schon besprochen wurde.
Du musst aus der Schleife springen oder delayedexpansion benutzen, da die Test variable sonst noch nicht gültig ist.
 
Oder wenn Die Variable test nur im darauf folgendem IF verwendet wird, darauf verzichten und das %%i verwenden (ähnlich Zeile 4)

hier ein paar Beispiele:
Code:
rem schreibt nur den Dateinamen, ohne Pfad und Dateiendung
If %%j LEQ 5 echo %%~ni>> ausgewaehlte.txt

rem schreibt kompletten Pfad und Dateinamen mit Dateiendung
If %%j LEQ 5 echo %%~fi>> ausgewaehlte.txt
rem oder
If %%j LEQ 5 echo %%~dpnxi>> ausgewaehlte.txt

rem schreibt kompletten Pfad und Dateinamen ohne Dateiendung
If %%j LEQ 5 echo %%~dpni>> ausgewaehlte.txt

f : vollständiger Dateiname
d : Laufwerksbuchstabe
p : Pfad (ohne Laufwerksbuchstabe)
n : Dateiname
x : Erweiterung
 
Ja, danke! Das ist natürlich eine Nummer einfacher..
Mit dem delayedexpansion und dem herausspringen hat bei mir leider nicht geklappt, wird wohl an meinem rudimentären Wissen liegen..

Vielen Dank! Bin erstmal glücklich :)
 
ja, genau so hatte ich es auch, funktioniert bei mir leider nicht! im Command-Fenster wird dann nur "!test:~-0,4! ausgegeben"
.....
aber in der txt steht es korrekt.. mein Fehler! Ist das normal das im Command-Fenster nur der Variablenname und nicht deren Inhalt ausgegebne wird? Das hat mich verwirrt, deswegen bin ich von "setlocal enabledelayedexpansion" weggekommen..
Danke!
 
Zurück
Oben