Ordner durchsuchen und bestimmten Text Inhalt ausgeben
Hallo,
ich möchte ein Batch programmieren, der mir alle Dateien (*.d01) im Ordner nach "ID und eine fortlaufende Nummer" durchsucht und die "ID+fortlaufende-Nr" in eine Textdatei (datei.txt) ausgibt.
Mein Skript durchsucht bereits Dateien, aber öffnet jede einzelne und die fortlaufende Nummer hab ich mit dem Suchoperator % bestimmt. Das klappt bei mir auch noch nicht.
Der Dateiinhalt der einzelnen Dateien sieht wie folgt aus:
'ID+001'
'ID+002'
'ID+003'
'ID+004'
'ID+005'
'ID+006'
'ID+007'
usw.
Hier mein Skript:
for /F "delims=" %%a in ('dir /b /s *.d01') do (find "'ID+%'" "%%~fa" && "%%~fa">> datei.txt)
Könnt ihr mir sagen wo mein Fehler liegt?
mfg
Matze
ich möchte ein Batch programmieren, der mir alle Dateien (*.d01) im Ordner nach "ID und eine fortlaufende Nummer" durchsucht und die "ID+fortlaufende-Nr" in eine Textdatei (datei.txt) ausgibt.
Mein Skript durchsucht bereits Dateien, aber öffnet jede einzelne und die fortlaufende Nummer hab ich mit dem Suchoperator % bestimmt. Das klappt bei mir auch noch nicht.
Der Dateiinhalt der einzelnen Dateien sieht wie folgt aus:
'ID+001'
'ID+002'
'ID+003'
'ID+004'
'ID+005'
'ID+006'
'ID+007'
usw.
Hier mein Skript:
for /F "delims=" %%a in ('dir /b /s *.d01') do (find "'ID+%'" "%%~fa" && "%%~fa">> datei.txt)
Könnt ihr mir sagen wo mein Fehler liegt?
mfg
Matze
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 126011
Url: https://administrator.de/forum/ordner-durchsuchen-und-bestimmten-text-inhalt-ausgeben-126011.html
Ausgedruckt am: 23.12.2024 um 16:12 Uhr
24 Kommentare
Neuester Kommentar
Moin Matze,
bei dir fehlt in dem ersten Skript nach dem "&&" ein ECHO... deshalb wir die gefundene Textdatei ausgeführt und nicht nur der als Dateiname in der Liste aufgeführt.
Das zweite Sript passt bei dir nicht ganz, weil da der FindStr-Schalter /M verwendet wird... und der ist zwar sehr nützlich, aber nicht für deine Zwecke. Denn /M zeigt <u>nur</i> die Dateinamen an.
du willst, wenn ich es Recht verstanden habe, Dateinamen UND die Fundzeile?
Da wäre mein Tipp
Ggf. den "Findstr "'" c:\G4\*.d01" noch mit ">D.\Einpfad\EinError.log" in einen Datei umleiten.
Grüße
Biber
bei dir fehlt in dem ersten Skript nach dem "&&" ein ECHO... deshalb wir die gefundene Textdatei ausgeführt und nicht nur der als Dateiname in der Liste aufgeführt.
Das zweite Sript passt bei dir nicht ganz, weil da der FindStr-Schalter /M verwendet wird... und der ist zwar sehr nützlich, aber nicht für deine Zwecke. Denn /M zeigt <u>nur</i> die Dateinamen an.
du willst, wenn ich es Recht verstanden habe, Dateinamen UND die Fundzeile?
Da wäre mein Tipp
(=21:22:26 E:\Schnipsel=)
>FindStr "'" d:\temp\*.d01
d:\temp\matze1.d01:'ID+001'
d:\temp\matze2.d01:'ID+002'
d:\temp\matze3.d01:'ID+003'
d:\temp\matze4.d01:'ID+004'
d:\temp\matze5.d01:'ID+005'
Ggf. den "Findstr "'" c:\G4\*.d01" noch mit ">D.\Einpfad\EinError.log" in einen Datei umleiten.
Grüße
Biber
Moin matze-pe,
Und bei der Zeile
... ist das erste ">"-Zeichen nur meine CMD-Prompt-Anzeige.
DIESES ">"- ZEICHEN NICHT MIT EINGEBEN bitte.
Im Batch also nur:
Grüße
Biber
Die Zeilen 3 - 7, sollte das bei dir nur die Ausgabe sein?
Ja, das ist nur die Ausgabe.Und bei der Zeile
>FindStr "'" C:\G4\*.d01
DIESES ">"- ZEICHEN NICHT MIT EINGEBEN bitte.
Im Batch also nur:
...
FindStr "'" C:\G4\*.d01
...
Grüße
Biber
Moin matze-pe,
bitte ändere Deine Zeile
von bisher
in neu
Mehr nicht.
Als Zweites (unabhängig von Variante 1; die sollte alles tun, was ich möchte) kannst Du erwägen
Die Scaalter /i und C: bewirken, wie dir sicherlich die FindStr/?-Ausgabe schon erzählt hat, dass es egal ist, ob Klein/oder Grossbuchstaben und /C: wiederum bedeutet, buchstabengetreuen vollständigen Vergleich.
Nur für den Fall, dass Du in Deinem Suchstring noch exotischere Zeichen als "+" drinhast.
Dass jetzt deine Ergebnisdatei die einfachen Anführungszeichen nicht mehr erhalten soll und die für mich nicht verständliche Frage
Bitte lass uns erst mal einen Schritt machen und etwaige Kommunikationsprobleme ausmerzen.
Grüße
Biber
bitte ändere Deine Zeile
von bisher
for /F "delims=" %%a in ('dir /b /s *.d01') do (FindStr "'SEQ+3+*'" C:\G4\*.d01>> datei.txt)
in neu
FindStr "'SEQ+3+" C:\G4\*.d01>> datei.txt
Als Zweites (unabhängig von Variante 1; die sollte alles tun, was ich möchte) kannst Du erwägen
:: REM Optional -- oder etwas sicherer:
FindStr /i /C:"'SEQ+3+" C:\G4\*.d01>> datei.txt
Die Scaalter /i und C: bewirken, wie dir sicherlich die FindStr/?-Ausgabe schon erzählt hat, dass es egal ist, ob Klein/oder Grossbuchstaben und /C: wiederum bedeutet, buchstabengetreuen vollständigen Vergleich.
Nur für den Fall, dass Du in Deinem Suchstring noch exotischere Zeichen als "+" drinhast.
Dass jetzt deine Ergebnisdatei die einfachen Anführungszeichen nicht mehr erhalten soll und die für mich nicht verständliche Frage
Wie löse ich das am besten mit dem Suchen nach 'SEQ+3+ZAHL'
...habe ich noch nicht berücksichtigt.Bitte lass uns erst mal einen Schritt machen und etwaige Kommunikationsprobleme ausmerzen.
Grüße
Biber
Okay, matze-pe,
ich glaube, jetzt hab ich das Missverständnis eintdeckt.
Ich war davon ausgegangen, dass jede .d01-Datei einen String mit "SEQ+3+LfdNr" enthält.
Es scheint aber so, als würde jede Datei viele Zeilen mit "SEQ+3+diverseLfdNr" enthalten.
In diesem Fall sollte die Zeile lauten
wenn du nach der lfd. Nr 0000004 suchst
-oder, wenn Du es als Batch paramtergesteuert machen willst-
Aufruf mit "MatzesSuchDieID 0000017" sollte eine Liste mit allen Fund-Zeilen aller .d01-Dateien enthalten, in denen
"'SEQ+3+0000017" steht.
Wenn ich die Aufgabe jetzt richtig verstanden habe...
Grüße
Biber
ich glaube, jetzt hab ich das Missverständnis eintdeckt.
Ich war davon ausgegangen, dass jede .d01-Datei einen String mit "SEQ+3+LfdNr" enthält.
Es scheint aber so, als würde jede Datei viele Zeilen mit "SEQ+3+diverseLfdNr" enthalten.
In diesem Fall sollte die Zeile lauten
FindStr /i /C:"'SEQ+3+0000004" C:\G4\*.d01>> datei.txt
-oder, wenn Du es als Batch paramtergesteuert machen willst-
:. MatzesSuchDieID.cmd
:: Rem optionaler parameter 1 ist eine lfd. nummer = der EXAKTE Teil nach "SEQ+3+"
FindStr /i /C:"'SEQ+3+%1" C:\G4\*.d01>> datei.txt
"'SEQ+3+0000017" steht.
Wenn ich die Aufgabe jetzt richtig verstanden habe...
Grüße
Biber
Moin matze-pe,
vielleicht wäre es ein wenig schneller gegangen oder mit ein paar unnötigen Schleifen weniger, wenn sich nicht nach erst nach 10maligem Hin- und Herposten herausstellt, das die ursrüngliche Angabe:
Diese .d01-Dateien scheinen ja, wenn das gepostete Beispiel typisch für dieses Format ist, aus zwei Zeilen zu bestehen.
Wobei die erste Zeile so um die 20 Zeichen lang ist und nie den Suchstring enthält, die zweite Zeile aber über eine Länge von mehr als 2000 Zeichen zigmal den Suchstring enthält.
Entsprechen blieb ja nun weiter oben auch dem FindStr, der die gefundene Zeile durchreichen sollte, auch nichts anderes übrig, als diese zweite Zeile (mit den mehr als 2000 Zeichen) in deine Gesamttreffer-Datei zu schreiben.
Was wiederum zu Deiner 100 MB-Datei führte..
ist also schon recht kompakt...
Anyway, da Zeilen jenseits einer Länge von 2087 Byte vom CMD-Interpreter nicht verarbeitbar sind, wie es von meinem Oneliner-Hobby weiss sehe ich zwei Alternativen:
a) entweder dieses Gelumpe mit VBS abfackeln. Also mit einem 20zeiligen VBSkript mit Fso.Objekt und TextStream und ReadAll rekursiv aus den in dem Ordner XY vorhandenen .d01-Dateien aus den gefundenen Strings "'SEQ+3+" und der danach folgenden nnnnnn-LfdNr diese ID ermitteln.
Wäre sinnvoll, wenn der Nummerkreis nicht näher eingrenzbat ist.
Beispiel: Wenn es nur 100 .d01-Dateien gibt, aber die enthaltenen Nummer vollkommen unbekannt sind, also im Bereich von 000001 bis 999999 versteut wären.
b) Batch-Alternative, falls der Nummernkreis eingrenzbarer ist.
Beispiel. Wenn du "weisst", dass die Nummern z.B. irgendwo im Bereich von 010500 bis 012000 liegen werden, dann tut es ein Oneliner vom CMD-Prompt aus auch
Nur die erst zeile muss eingegeben werden (das ">" am Anfang NICHT).
Die anderen Zeilen sind Ausgabezeilen, die Dateinamen (ohne Endung) anzeigen, in denen ich diese lustigen Suchstrings verstecht habe.
Diese Testdateien entsprechen dem Beispielformat der .d01-Datei, die Du gepostet hast.
Grüße
Biber
vielleicht wäre es ein wenig schneller gegangen oder mit ein paar unnötigen Schleifen weniger, wenn sich nicht nach erst nach 10maligem Hin- und Herposten herausstellt, das die ursrüngliche Angabe:
Der Dateiinhalt der einzelnen Dateien sieht wie folgt aus:
'ID+001'
'ID+002'
'ID+003'
'ID+004'
'ID+005'
'ID+006'
'ID+007'
eigentlich ein bisschen sehr vereinfacht und ein bisschen zu schematisch ist.'ID+001'
'ID+002'
'ID+003'
'ID+004'
'ID+005'
'ID+006'
'ID+007'
Diese .d01-Dateien scheinen ja, wenn das gepostete Beispiel typisch für dieses Format ist, aus zwei Zeilen zu bestehen.
Wobei die erste Zeile so um die 20 Zeichen lang ist und nie den Suchstring enthält, die zweite Zeile aber über eine Länge von mehr als 2000 Zeichen zigmal den Suchstring enthält.
Entsprechen blieb ja nun weiter oben auch dem FindStr, der die gefundene Zeile durchreichen sollte, auch nichts anderes übrig, als diese zweite Zeile (mit den mehr als 2000 Zeichen) in deine Gesamttreffer-Datei zu schreiben.
Was wiederum zu Deiner 100 MB-Datei führte..
C:\G4\dateinamexyz.d01 Und hier hinter steht der komplette Inhalt der Datei.
Na ja, komplett nicht. Die jeweils ersten Zeilen mit den 20 Zeichen sind nicht drin.ist also schon recht kompakt...
Anyway, da Zeilen jenseits einer Länge von 2087 Byte vom CMD-Interpreter nicht verarbeitbar sind, wie es von meinem Oneliner-Hobby weiss sehe ich zwei Alternativen:
a) entweder dieses Gelumpe mit VBS abfackeln. Also mit einem 20zeiligen VBSkript mit Fso.Objekt und TextStream und ReadAll rekursiv aus den in dem Ordner XY vorhandenen .d01-Dateien aus den gefundenen Strings "'SEQ+3+" und der danach folgenden nnnnnn-LfdNr diese ID ermitteln.
Wäre sinnvoll, wenn der Nummerkreis nicht näher eingrenzbat ist.
Beispiel: Wenn es nur 100 .d01-Dateien gibt, aber die enthaltenen Nummer vollkommen unbekannt sind, also im Bereich von 000001 bis 999999 versteut wären.
b) Batch-Alternative, falls der Nummernkreis eingrenzbarer ist.
Beispiel. Wenn du "weisst", dass die Nummern z.B. irgendwo im Bereich von 010500 bis 012000 liegen werden, dann tut es ein Oneliner vom CMD-Prompt aus auch
>For /L %a in (10500,1,11000) do @For /f "delims=" %f in ('findstr /m "'SEQ+3+0%a'" e:\schnipsel\ma*.d01') do @echo %~nf: SEQ+3+0%a
matze01: SEQ+3+010571
matze02: SEQ+3+010575
matze04: SEQ+3+010577
matze117: SEQ+3+010603
Nur die erst zeile muss eingegeben werden (das ">" am Anfang NICHT).
Die anderen Zeilen sind Ausgabezeilen, die Dateinamen (ohne Endung) anzeigen, in denen ich diese lustigen Suchstrings verstecht habe.
Diese Testdateien entsprechen dem Beispielformat der .d01-Datei, die Du gepostet hast.
Grüße
Biber
Moin matze-pe.
in der Musterdatei, die Du oben gepostet hast, sind die Suchstrings, die ich auch in der CMD-Zeile eingebaut habe
Die "matzexx.d01"-Dateien habe ich erzeugt als Kopie deiner geposteten Datei oben und nur den String "SEQ+3+0xxxxx" (der beispielweise in deiner Datei hier auftaucht
Und die Ausgabe habe ich mir nicht etwa aus dem Handgelenk geschüttelt, sondern von meinem Bildschirmboliden kopiert.
Bitte versuche es doch noch mal mit einer Kopie deiner geposteten Beispieldatei.
Grüße
Biber
in der Musterdatei, die Du oben gepostet hast, sind die Suchstrings, die ich auch in der CMD-Zeile eingebaut habe
- erstens als Präfix der String "'SEQ+3+0" wie nach dem FindStr zu sehen
- und durch die FOR/L-Anweisung generieriert der zweite Teil des Suchstrings "10500", 10501",....."11000"
Die "matzexx.d01"-Dateien habe ich erzeugt als Kopie deiner geposteten Datei oben und nur den String "SEQ+3+0xxxxx" (der beispielweise in deiner Datei hier auftaucht
...:IN'QTY+131:1:PCE<b'SEQ+3+010575'</b>DTM+194:20090727 .....
...den habe ich auf den letzten 5 Stellen ersetzt durch "10571", "10577" etc statt "10575".Und die Ausgabe habe ich mir nicht etwa aus dem Handgelenk geschüttelt, sondern von meinem Bildschirmboliden kopiert.
Bitte versuche es doch noch mal mit einer Kopie deiner geposteten Beispieldatei.
Grüße
Biber
Moin matze-pe.
wie "wenn ich das Skript öffne, geht kurz die Konsole auf"?
Wo hab ich denn was von einem Skript erwähnt?
Und von wo "testest" Du??? Per Doppelklick vom Desktop?
Oder schickst Du das gleich vom Fernsehsessel aus via iPhone?
Na, geht mich auch nix an... ich mach mal für heute Schicht.
Grüße
Biber
wie "wenn ich das Skript öffne, geht kurz die Konsole auf"?
Wo hab ich denn was von einem Skript erwähnt?
Und von wo "testest" Du??? Per Doppelklick vom Desktop?
Oder schickst Du das gleich vom Fernsehsessel aus via iPhone?
Na, geht mich auch nix an... ich mach mal für heute Schicht.
Grüße
Biber
Moin matze-pe,
bitte teste am CMD-Prompt, indem Du folgende Zeile
... per Copy & Paste zu einer Befehlszeile für den CMD-Interpreter machst.
Dann ENTER drücken und schauen, ob es das ist, was Du haben wolltest.
Danach kannst Du ein bisschen feintunen/an deine Bedürfnisse anpassen oder gar einen "Batch" daraus machen ("Batch" in Anführungszeichen, weil ein Skript, das aus einer Zeile besteht genau wie ein Science-Fiction-Roman, der aus einer Zeile besteht nicht von jedem anerkannt wird).
Anyway, als "Batch" müssen alle einfachen Prozentzeichen vor den FOR-Laufvariablen verdoppelt werden. d.h. aus einem "%a" wird "%%a" etc.
Steht aber auch in jeder besseren Online/Offline-Hilfe.
Viel Glück
Biber
bitte teste am CMD-Prompt, indem Du folgende Zeile
For /L %a in (10500,1,11000) do @For /f "delims=" %f in ('findstr /m "'SEQ+3+0%a'" C:\G4\*.d01') do @echo %~nf: SEQ+3+0%a
Dann ENTER drücken und schauen, ob es das ist, was Du haben wolltest.
Danach kannst Du ein bisschen feintunen/an deine Bedürfnisse anpassen oder gar einen "Batch" daraus machen ("Batch" in Anführungszeichen, weil ein Skript, das aus einer Zeile besteht genau wie ein Science-Fiction-Roman, der aus einer Zeile besteht nicht von jedem anerkannt wird).
Anyway, als "Batch" müssen alle einfachen Prozentzeichen vor den FOR-Laufvariablen verdoppelt werden. d.h. aus einem "%a" wird "%%a" etc.
Steht aber auch in jeder besseren Online/Offline-Hilfe.
Viel Glück
Biber
Moin matze-pe,
die FOR /L -Zählschleifen lassen sich nicht mit einem Schlüsselwort " AND " verknüpfen.
Die Syntax wäre viel banaler.... beide FOR/L-Anweisungen aneinanderreihen:
Im Batch kannst Du nach jedem ".... DO..." eine Klammer öffnen und eine neue Zeile beginnen, dann wird es unter Umständen übersichtlicher
Zum anderen: Es muss doch, wie und wo auch immer diese .d01-Dateien entstehen irgendwo einen abgreifbaren Zusammenhang zwischen dieser LfdNr [SEQ+...1nnnn] und dem Entstehungs(oder was-auch-immer-)jahr geben??
Ich meine, ich verstehe ja, dass Du (bzw. ein FindStr mit ein wenig Batch drumherum) in jede Datei reingucken muss, um zu "wissen", welche ID da drinsteht.
Aber das kann doch nicht sein, dass das "relevante Datum" von ID 14145 oder ID 17777 nun auch nur aus dem Inhalt dieser Datei zu ermitteln ist...
Bist Du sicher, dass Du es keine einfachere Strategie gibt?
Grüße
Biber
die FOR /L -Zählschleifen lassen sich nicht mit einem Schlüsselwort " AND " verknüpfen.
Die Syntax wäre viel banaler.... beide FOR/L-Anweisungen aneinanderreihen:
For /L %%a in (10000,1,11000) DO FOR /L %%b in (0900000000,1,2000000000) do @for /f "delims=" %%f in....
Im Batch kannst Du nach jedem ".... DO..." eine Klammer öffnen und eine neue Zeile beginnen, dann wird es unter Umständen übersichtlicher
@For /L %%a in (10000,1,11000) DO @(
FOR /L %%b in (0900000000,1,2000000000) do (
For /f "delims=" %%f in ('findstr /m "'SEQ+3+0%%a'" C:\G4\*.d01') DO...
)
)
REM ???? ... den Rest hier durchschaue ich nicht.. ????
REM ???? die beabsichtigte Logik hab ich nicht verstanden. ????
REM
REM AND "delims=" %%g in('findstr /m ":VV+%%b:" C:\G4\*.d01')do @echo %%~nf.d01: SEQ+3+0%%a %%b>>c:\G4\datei.txt
Zum anderen: Es muss doch, wie und wo auch immer diese .d01-Dateien entstehen irgendwo einen abgreifbaren Zusammenhang zwischen dieser LfdNr [SEQ+...1nnnn] und dem Entstehungs(oder was-auch-immer-)jahr geben??
Ich meine, ich verstehe ja, dass Du (bzw. ein FindStr mit ein wenig Batch drumherum) in jede Datei reingucken muss, um zu "wissen", welche ID da drinsteht.
Aber das kann doch nicht sein, dass das "relevante Datum" von ID 14145 oder ID 17777 nun auch nur aus dem Inhalt dieser Datei zu ermitteln ist...
Bist Du sicher, dass Du es keine einfachere Strategie gibt?
Grüße
Biber