Text finden und Folgezeile ausgeben
Hallo zusammen,
ich hab hier eine Ordner mit etwa 15000 Dateien.
Innerhalb der Dateien möchte ich nach einem bestimmten String suchen und die Folgezeile in einer seperaten Textdatei speichern.
Der gesuchte String kann pro Datei einmal aber auch mehrmals vorkommen.
Habe das hier schon gefunden:Text suchen und Folgezeile ausgeben
Leider bin ich damit nicht weit gekommen :P
Hat jemand eine Idee?
ich hab hier eine Ordner mit etwa 15000 Dateien.
Innerhalb der Dateien möchte ich nach einem bestimmten String suchen und die Folgezeile in einer seperaten Textdatei speichern.
Der gesuchte String kann pro Datei einmal aber auch mehrmals vorkommen.
Habe das hier schon gefunden:Text suchen und Folgezeile ausgeben
Leider bin ich damit nicht weit gekommen :P
Hat jemand eine Idee?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148293
Url: https://administrator.de/contentid/148293
Ausgedruckt am: 25.11.2024 um 18:11 Uhr
25 Kommentare
Neuester Kommentar
Hallo hiob08,
versuche folgenden Code:
Die Variablen vor der ersten FOR-Schleife musst Du anpassen. Durch set destfile=con in Zeile 9 ([Edit] Zeile 8) wird alles auf dem Bildschirm ausgegeben, zum Testen.
Falls der String, den Du suchst, nur als eigenständiges Wort vorkommen soll und nicht auch als Bestandteil eines längeren Wortes, muss Zeile 13 folgendermaßen lauten:
Für Diese Zeile gilt: Falls der Suchstring eines der Zeichen .*^$\ oder die Zeichenkombinationen \< oder \> enthält, muss JEDES EINZELNE dieser Zeichen mit \ escaped werden (siehe Hilfe zum FINDSTR-Befehl, erreichbar durch eingabe von findstr /? an der Eingabeaufforderung). Beispiel: Du willst nach 100$ suchen -> Dein Suchstring muss 100\$ lauten.
[Edit]
Wenn Du bei Deiner Suche Groß- und Kleinschreibung berücksichtigen willst, lass das /i weg.
Falls Du Fragen zur Funktionsweise des Codes hast, lass hören.
Dein Suchstring darf in dieser Version keine Anführungszeichen enthalten.
Wenn die Nachfolgerzeile der Zeile, die den Suchstring enthält, leer ist, wird nichts in die Zieldatei geschrieben.
Gruß
Friemler
versuche folgenden Code:
@echo off
setlocal enabledelayedexpansion
set "searchdir=%Userprofile%\Desktop"
set "searchfiles=*.txt"
set "searchstr=test"
set "destfile=con"
del "%destfile%" 2>NUL
for %%a in ("%searchdir%\%searchfiles%") do (
for /f "delims=:" %%b in ('findstr /i /n /c:"%searchstr%" "%%a"') do (
set /a theNextline=%%b+1 > NUL
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%%a" ^| findstr /b "!theNextLine!"') do (
if "%%j" neq "" echo %%j>>"%destfile%"
)
)
)
endlocal
Die Variablen vor der ersten FOR-Schleife musst Du anpassen. Durch set destfile=con in Zeile 9 ([Edit] Zeile 8) wird alles auf dem Bildschirm ausgegeben, zum Testen.
Falls der String, den Du suchst, nur als eigenständiges Wort vorkommen soll und nicht auch als Bestandteil eines längeren Wortes, muss Zeile 13 folgendermaßen lauten:
for /f "delims=:" %%b in ('findstr /i /n /r /c:"\<%searchstr%\>" "%%a"') do (
[Edit]
Wenn Du bei Deiner Suche Groß- und Kleinschreibung berücksichtigen willst, lass das /i weg.
Falls Du Fragen zur Funktionsweise des Codes hast, lass hören.
Dein Suchstring darf in dieser Version keine Anführungszeichen enthalten.
Wenn die Nachfolgerzeile der Zeile, die den Suchstring enthält, leer ist, wird nichts in die Zieldatei geschrieben.
Gruß
Friemler
[OT]
Und das zu Recht.
[/OT]
Zitat von @hiob08:
Hallo Friemler,
danke für die fixe Antwort. Leider funktioniert das Skript nicht bei mir.
Das Fenster schließt sich einfach wieder ....
Das gibt bestimmt gleich passende Antworten....Hallo Friemler,
danke für die fixe Antwort. Leider funktioniert das Skript nicht bei mir.
Das Fenster schließt sich einfach wieder ....
Und das zu Recht.
[/OT]
[OT]
Wenn ich früher zum Onkel Doktor oder auf ein Amt gehen mußte und ich gefragt wurde, was ich beruflich mache
und ich wahrheitsgemäß antwortete- bekam ich immer einen "dummen" Spruch gedrückt und das Gesicht des jeweiligen Gegenüber verzog sich merkwürdig.
Früher konnte ich dieses Verhalten nicht einordnen - heute nenn ich mich dompteur d'ordinateur
[/OT]
Hallo hiob08,
hast Du die Variable destfile in Zeile 8 angepasst (und auch die anderen in Zeile 5-7)? Ich hatte doch geschrieben, das durch set destfile=con die Ausgabe auf dem Bildschirm landet. Da kein PAUSE-Befehl am Ende des Skripts steht und Du es wahrscheinlich per Doppelklick gestartet hast statt von der Eingabeaufforderung, siehst Du auch nichts. Wer lesen kann ist klar im Vorteil.
Gruß
Friemler
hast Du die Variable destfile in Zeile 8 angepasst (und auch die anderen in Zeile 5-7)? Ich hatte doch geschrieben, das durch set destfile=con die Ausgabe auf dem Bildschirm landet. Da kein PAUSE-Befehl am Ende des Skripts steht und Du es wahrscheinlich per Doppelklick gestartet hast statt von der Eingabeaufforderung, siehst Du auch nichts. Wer lesen kann ist klar im Vorteil.
Gruß
Friemler
Hallo hiob08,
das in der Ausgabe des Skripts "!theNextLine!" steht, ist normal. Bei mir (Windows XP SP3) funktioniert es und es steht das gleiche auf dem Schirm.
Das $-Zeichen bei dem einen FINDSTR-Befehl bewirkt, das nach einem Zeilenende gesucht wird, es werden also alle Zeilen gefunden inkl. leere. Der Befehl dient durch /n dazu, alle Dateizeilen mit einer Nummer zu versehen. Die richtige Zeile wird durch findstr /b "!theNextLine!" gefunden. Der sucht durch /b am Anfang einer Zeile (also da, wo die Zeilennummer steht) nach der Nummer in der Variable theNextLine.
Durch delims=: zählt der Doppelpunkt nach der Zeilennummer als Trennzeichen. Durch tokens=1,* wird deshalb der Laufvariablen %%i die Zeilennummer zugewiesen (brauchen wir nicht) und der durch die tokens-Option implizit erzeugten Laufvariablen %%j der eigentliche Zeileninhalt, der durch echo %%j>>%destfile% an die Ergebnisdatei angehängt wird.
Apropos: Vor der äußeren FOR-Schleife, also nach den SET-Befehlen, fehlt eigentlich noch
Sonst steht in der Zieldatei alles, was bei ALL Deinen Testläufen ausgegeben wurde.
Was steht eigentlich in der Ausgabedatei? Garnichts oder Mist oder was? Welches OS benutzt Du? Vista oder Win7?
[Edit]
Wenn Du bei Deiner Suche Groß- und Kleinschreibung berücksichtigen willst, muss die Zeile
so lauten:
Gruß
Friemler
das in der Ausgabe des Skripts "!theNextLine!" steht, ist normal. Bei mir (Windows XP SP3) funktioniert es und es steht das gleiche auf dem Schirm.
Das $-Zeichen bei dem einen FINDSTR-Befehl bewirkt, das nach einem Zeilenende gesucht wird, es werden also alle Zeilen gefunden inkl. leere. Der Befehl dient durch /n dazu, alle Dateizeilen mit einer Nummer zu versehen. Die richtige Zeile wird durch findstr /b "!theNextLine!" gefunden. Der sucht durch /b am Anfang einer Zeile (also da, wo die Zeilennummer steht) nach der Nummer in der Variable theNextLine.
Durch delims=: zählt der Doppelpunkt nach der Zeilennummer als Trennzeichen. Durch tokens=1,* wird deshalb der Laufvariablen %%i die Zeilennummer zugewiesen (brauchen wir nicht) und der durch die tokens-Option implizit erzeugten Laufvariablen %%j der eigentliche Zeileninhalt, der durch echo %%j>>%destfile% an die Ergebnisdatei angehängt wird.
Apropos: Vor der äußeren FOR-Schleife, also nach den SET-Befehlen, fehlt eigentlich noch
del %destfile% 2>NUL
Sonst steht in der Zieldatei alles, was bei ALL Deinen Testläufen ausgegeben wurde.
Was steht eigentlich in der Ausgabedatei? Garnichts oder Mist oder was? Welches OS benutzt Du? Vista oder Win7?
[Edit]
Wenn Du bei Deiner Suche Groß- und Kleinschreibung berücksichtigen willst, muss die Zeile
for /f "delims=:" %%b in ('findstr /i /n /c:"%searchstr%" "%%a"') do (
for /f "delims=:" %%b in ('findstr /n /c:"%searchstr%" "%%a"') do (
Gruß
Friemler
Hallo hiob08,
tja, dann ist Dein Suchstring in der Datei nicht enthalten. Oder Du suchst die Zieldatei im falschen Ordner. Du gibst ja nur ergebnis.txt als Zieldatei an. Die wird dann im aktuellen Verzeichnis angelegt, was bei Start des Skripts gesetzt ist. Eine andere Möglichkeit sehe ich nicht.
Gruß
Friemler
tja, dann ist Dein Suchstring in der Datei nicht enthalten. Oder Du suchst die Zieldatei im falschen Ordner. Du gibst ja nur ergebnis.txt als Zieldatei an. Die wird dann im aktuellen Verzeichnis angelegt, was bei Start des Skripts gesetzt ist. Eine andere Möglichkeit sehe ich nicht.
Gruß
Friemler
Hallo hiob08,
und die zweite Codezeile lautet auch
? Hat nämlich in der Ausgabe des Skript-Laufs gefehlt. Ich gehe bis jetzt davon aus, daß Du sie (in der Ausgabe) weg-editiert hast, da Du weiter oben schreibst
Ansonsten: Was ist der Inhalt von C:\Users\Admin\Desktop\Test\20100804.TXT?
Gruß
Friemler
und die zweite Codezeile lautet auch
setlocal enabledelayedexpansion
Zitat von @hiob08:
Nur scheint - wenn ich das richtig sehe - die Auflösung der Variable theNextline
in Zeile 14 nicht richtig zu klappen, trotz delayedexpansion.
Nur scheint - wenn ich das richtig sehe - die Auflösung der Variable theNextline
in Zeile 14 nicht richtig zu klappen, trotz delayedexpansion.
Ansonsten: Was ist der Inhalt von C:\Users\Admin\Desktop\Test\20100804.TXT?
Gruß
Friemler
Hallo hiob08,
wenn ich
eintippe, kommt was vergleichbares, meine test.txt hat nur einen anderen Inhalt. Du musst das ^-Zeichen weglassen. Im Batch dient das Zeichen dazu, das nachfolgende |-Zeichen (Pipe-Zeichen) zu escapen. Wenn das ^ fehlt, versteht der Interpreter die Befehlszeile nicht. Wenn Du den o.g. Befehl ohne das ^ eintippst, kommt weder zweimal "Mehr?" noch wird der Dateiname vor den Zeilennummern ausgegeben und "FINDSTR: kann nicht geöffnet werden" erscheint auch nicht.
Poste doch bitte mal Deinen Batch-Code.
Gruß
Friemler
wenn ich
findstr /i /n $ test.txt ^
Poste doch bitte mal Deinen Batch-Code.
Gruß
Friemler
Moin hiob,
Ich trau mich jezz' nich'.....
Ich sach ma so: Wieso lautet deine Eingabe jetzt "Friemler /?" und nicht "FindStr /?" ????
Tipp: Du willst doch eigentlich gar nicht allgemein nach "16" suchen, sondern exakt nach ":16:"[Doppelpunkt-16-Doppelpunkt].
Denn so liefert es Findstr doch (sagtest du hier : " test.txt:16:er " ).
Ich brauch Urlaub....
Biber
Zitat von @hiob08:
d.h. wenn !theNextLine!= 16, dann wird Zeile 16 ausgegeben (super!) und zusätzlich jede Zeile, in der eine 16 vorkommt.
Kann ich findstr irgendwie dazu bringen, in dem Beispiel oben nur die Zeile 16 auszugeben?
d.h. wenn !theNextLine!= 16, dann wird Zeile 16 ausgegeben (super!) und zusätzlich jede Zeile, in der eine 16 vorkommt.
Kann ich findstr irgendwie dazu bringen, in dem Beispiel oben nur die Zeile 16 auszugeben?
Ich trau mich jezz' nich'.....
Ich sach ma so: Wieso lautet deine Eingabe jetzt "Friemler /?" und nicht "FindStr /?" ????
Tipp: Du willst doch eigentlich gar nicht allgemein nach "16" suchen, sondern exakt nach ":16:"[Doppelpunkt-16-Doppelpunkt].
Denn so liefert es Findstr doch (sagtest du hier : " test.txt:16:er " ).
Ich brauch Urlaub....
Biber
Hallo,
@Biber
mal den Urlaubsschein von Biber abzeichnet.
und sich solange um die hilfsbedürftigen rothaarigen Praktikantinnen von Biber kümmert
brammer
@Biber
mal den Urlaubsschein von Biber abzeichnet.
und sich solange um die hilfsbedürftigen rothaarigen Praktikantinnen von Biber kümmert
brammer
Hallo hiob08,
es ist ja schonmal löblich, daß Du Dich mit den Parametern des FINDSTR-Befehls beschäftigt hast (Du hast $ durch . ersetzt). Dann hätte Dir aber auch der Parameter /B auffallen müssen, der bewirkt, daß FINDSTR am Anfang einer Zeile sucht. Außerdem hatte ich das in meiner Erklärung weiter oben erwähnt, als Antwort auf Deine Frage, was das $-Zeichen beim FINDSTR-Befehl bewirkt. Mein Code hat dieses /B auch enthalten, Du hast es gelöscht.
Warum das bei Dir statt mit $ nur mit . funktioniert (der Punkt steht ja für EIN beliebiges Zeichen) ist mir sowieso schleierhaft.
Schau Dir auch nochmal mein allererstes Posting an, wo ich das Skript veröffentlicht habe, ich habe am Text nochmal was geändert.
Gruß
Friemler
[Edit]
Und jetzt ist für mich hier Schluss! Start->Ausführen->brain.exe [ENTER]
es ist ja schonmal löblich, daß Du Dich mit den Parametern des FINDSTR-Befehls beschäftigt hast (Du hast $ durch . ersetzt). Dann hätte Dir aber auch der Parameter /B auffallen müssen, der bewirkt, daß FINDSTR am Anfang einer Zeile sucht. Außerdem hatte ich das in meiner Erklärung weiter oben erwähnt, als Antwort auf Deine Frage, was das $-Zeichen beim FINDSTR-Befehl bewirkt. Mein Code hat dieses /B auch enthalten, Du hast es gelöscht.
Warum das bei Dir statt mit $ nur mit . funktioniert (der Punkt steht ja für EIN beliebiges Zeichen) ist mir sowieso schleierhaft.
Schau Dir auch nochmal mein allererstes Posting an, wo ich das Skript veröffentlicht habe, ich habe am Text nochmal was geändert.
Gruß
Friemler
[Edit]
Und jetzt ist für mich hier Schluss! Start->Ausführen->brain.exe [ENTER]
Moin hiob08,
Einen Satz wie den fett hervorgehobenen gefolgt von den darunterstehenden Details... das hat schon westerwellesche Dimensionen.
Der (bzw, EIN wichtiger) Unterschied der beiden FindStr-Varianten ist, dass
--> Das Caret-Zeichen ist hier zum Test/beim Proof-of-Concept vollkommen falsch und auch die "Mehr?... FindStr..Nicht gefunden"-Meldungen kommen daher.
---> Einfach "^" nicht benutzen.... ist nicht zielführend und überhaupt nicht wesentlich.
Die unterschiedlichen Ausgaben kannst du reproduzieren mit
[Zeilen mit führendem ">" OHNE dieses ">" eintippseln]
WENN du denn die zweite Ausgabeform MIT Dateinamen besser brauchen kannst
--> DANN hänge ein Wildcard-? an deinen Dateinamen.
Grüße
Biber
P.S. @brammer:
Wieso sollte ich meine Praktikantinnen denn zurücklassen?
Wir machen Fusskettchentauchen am Roten Meer...
Zitat von @hiob08:
hier nochmal der Beweis :
C:\Users\Admin\Desktop\Test>findstr /n . test.txt
1:asfd
2:safd
C:\Users\Admin\Desktop\Test>findstr /n . test.txt ^
Mehr?
Mehr?
bla.txt:1:asfd
bla.txt:2:safd
hier nochmal der Beweis :
C:\Users\Admin\Desktop\Test>findstr /n . test.txt
1:asfd
2:safd
C:\Users\Admin\Desktop\Test>findstr /n . test.txt ^
Mehr?
Mehr?
bla.txt:1:asfd
bla.txt:2:safd
Einen Satz wie den fett hervorgehobenen gefolgt von den darunterstehenden Details... das hat schon westerwellesche Dimensionen.
Der (bzw, EIN wichtiger) Unterschied der beiden FindStr-Varianten ist, dass
- die erste GENAU EINE DATEI durchflöhen soll.
- die zweite denkt, es könnte mehrere kommen [wegen des "^"-Caret-Zeichens.
--> Das Caret-Zeichen ist hier zum Test/beim Proof-of-Concept vollkommen falsch und auch die "Mehr?... FindStr..Nicht gefunden"-Meldungen kommen daher.
---> Einfach "^" nicht benutzen.... ist nicht zielführend und überhaupt nicht wesentlich.
Die unterschiedlichen Ausgaben kannst du reproduzieren mit
[Zeilen mit führendem ">" OHNE dieses ">" eintippseln]
> echo xx >temp23456.bla
>findstr /n . temp23456.bla
1:xx
>findstr /n . temp23456.bla?
temp23456.bla:1:xx
WENN du denn die zweite Ausgabeform MIT Dateinamen besser brauchen kannst
--> DANN hänge ein Wildcard-? an deinen Dateinamen.
Grüße
Biber
P.S. @brammer:
Wieso sollte ich meine Praktikantinnen denn zurücklassen?
Wir machen Fusskettchentauchen am Roten Meer...
Hallo,
auch wenn dieses Thema schon recht alt ist, möchte ich es noch einmal aufgreifen..
Ich möchte per Batch und mit externen Tools ( PSFile )und (WInput) 1. feststellen welcher User welche Files auf einem bestimmten Server geöffnet hat, und 2. diese Sessions ggf.schließen. Allerdings bekomme ich bei meinem Script leider nicht nur die Files des gesuchten Users, sondern auch noch einige andere (oder manchmal auch KEINE , obwol es geöffnete Dateien gibt). Das darf natürlich nicht passieren... Es soll sowohl das geöffnete File, als auch die "Locks" angezeigt werden.
Bin sehr auf eure Tips gespannt und bedanke mich schon hetzt für eure Hilfe.
Hier mein Script
auch wenn dieses Thema schon recht alt ist, möchte ich es noch einmal aufgreifen..
Ich möchte per Batch und mit externen Tools ( PSFile )und (WInput) 1. feststellen welcher User welche Files auf einem bestimmten Server geöffnet hat, und 2. diese Sessions ggf.schließen. Allerdings bekomme ich bei meinem Script leider nicht nur die Files des gesuchten Users, sondern auch noch einige andere (oder manchmal auch KEINE , obwol es geöffnete Dateien gibt). Das darf natürlich nicht passieren... Es soll sowohl das geöffnete File, als auch die "Locks" angezeigt werden.
Bin sehr auf eure Tips gespannt und bedanke mich schon hetzt für eure Hilfe.
Hier mein Script
@echo off
setlocal enabledelayedexpansion
:start
cls
REM ----------- Variablen setzen --------------
Set "fname=%temp%\openfiles.txt"
Set "destfile=con"
Set /P "Servername=Servername: "
Set /P "Username=Username: "
del %destfile% 2>NUL
REM ----------- PSFile starten und Ausgabe in Txtdatei schreiben --------------
psfile \\%Servername% -nobanner >%fname%
REM ----------- Txtdatei auslesen, Usernamen suchen und geöffnete Files anzeigen --------------
for %%a in ("%fname%") do (
for /f "delims=:" %%b in ('findstr /i /n /r /c:"\<%Username%\>" "%%a"') do (
set /a theNextline=%%b-1 > NUL
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%%a" ^| findstr /b "!theNextLine!"') do (
if "%%j" neq "" echo %%j>>"%destfile%"
set /a theNextline=%%b+1 > NUL
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%%a" ^| findstr /b "!theNextLine!"') do (
if "%%j" neq "" echo %%j>>"%destfile%"
)
)
)
)
echo.
REM ----------- Auswähren ob File geschlossen werden soll --------------
CHOICE /C JNX /M "Soll der Zugriff beendet werden? [J]a | [N]ein [X] - Abbruch"
echo.
if errorlevel = 3 goto end
if errorlevel = 2 goto start
if errorlevel = 1 goto close
:close
REM ----------- File soll geschlossen werden --------------
REM ----------- Adminname & Passwort abfragebn --------------
winput "set admin=$input" "Admin Name" >NUL
winput "set pw=$input" "Admin PW" /pass >NUL
REM ----------- FileID angeben --------------
Set /P fid=File id :
REM ----------- File schließen --------------
psfile \\%Servername% -u %admin% -p %pw% %fid% -c -nobanner
:noname
cls
Echo FEHLER: Kein Adminname angegeben
Timeout 10
goto start
:nopw
cls
Echo FEHLER: Kein Passwort angegeben
Timeout 10
goto start
:end
:eof
Hallo @cced-de,
in diesem Forum ist es unüblich, sich an einen bestehenden Thread anzuhängen. Öffne bitte einen neuen Thread für Dein Problem, damit erzielst Du mehr Aufmerksamkeit und erhältst evtl. auch schneller Hilfe.
Grüße
Friemler
in diesem Forum ist es unüblich, sich an einen bestehenden Thread anzuhängen. Öffne bitte einen neuen Thread für Dein Problem, damit erzielst Du mehr Aufmerksamkeit und erhältst evtl. auch schneller Hilfe.
Grüße
Friemler