philosoph
Goto Top

Findstr Befehl modifizieren

Hallo alle zusammen,

ich habe leider ein Problem und finde einfach keine Lösung im Internet. Ich bin mal gespannt, ob mir hier jemand weiterhelfen kann.
Inhalt meines Ordners Motive
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt

Datei-Inhalt index.txt
1.txt
2.txt
3.txt

Mein Skript soll folgende Arbeit erledigen:
Nun möchte ich die index.txt mit dem Motive-Ordner abgleichen. -> Wenn eine Datei aus Ordner Motive nicht in der index.txt vorhanden ist, soll diese in ergebnis.txt ausgegeben werden. Ich habe hier im Forum bereits einiges darüber gefunden, aber irgendwie macht mein Skript nicht das was es soll:
Inhalt ergebnis.txt
c:\test\motive\1.txt
c:\test\motive\2.txt
c:\test\motive\3.txt
c:\test\motive\4.txt
c:\test\motive\5.txt
c:\test\motive\6.txt

Richtig wäre:
c:\test\motive\4.txt
c:\test\motive\5.txt
c:\test\motive\6.txt

Das kleine Skript was ich einsetze baut sich wie folgt auf:
)
)

Hat jemand eine Idee von euch? Ich bin so langsam wirklich durch mit den Nerven. face-wink Ich möchte es nur ungern in VB programmieren, wenn es auch mit Boardmittel geht.
Ich bin für jede Anregung oder Hinweise dankbar!!!


LG
Tommy

Content-Key: 145666

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

Printed on: April 25, 2024 at 09:04 o'clock

Mitglied: 60730
60730 Jun 25, 2010 at 10:28:18 (UTC)
Goto Top
moin,

das die Zeile überhaupt was anderes, als einen Fehler auswirft - ist (ungetestet aus dem Bauch aber bemerkenswert)
for %%i in (c:\test\motive\*.*) do findstr "%%i" "c:\test\index.txt"  || echo put %%i>>C:\test\ergebnis.txt  

gruß

ungetestet aus dem Bauch
Member: bastla
bastla Jun 25, 2010 at 10:36:38 (UTC)
Goto Top
... oder (wenn tatsächlich nur die Dateinamen ohne Pfad in der "index.txt" stehen):
for %%i in ("C:\Test\Motive\*.*") do findstr /x /c:"%%~nxi" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%i
Grüße
bastla
Member: Philosoph
Philosoph Jun 25, 2010 at 11:01:33 (UTC)
Goto Top
Hallo bastla!

Perfekt! Genau das wollte ich erreichen, jetzt funktioniert das Skript.
Eine Hürde habe ich noch:

Es gibt Verzeichnisse im Ordner Motive die ausgelassen werden sollen, und zwar alle Ordner die mit $ beginnen.
Diese Ordner brauchen nicht durch das Matching zu laufen.

Hast du eine Idee wie ich das löse?
Eine Möglichkeit wäre doch auch, dass ich diese Ordner erst einmal mit abarbeite und später durch Suchen & Ersetzen in DOS in meiner ergebnis.txt löschen lasse.


Was denkst du?
Mitglied: 86263
86263 Jun 25, 2010 at 12:53:49 (UTC)
Goto Top
Hallo Philosoph,
ich bin zwar nicht bastla aber ich kann dir vielleicht trotzdem weiterhelfen:

for /f "eol=$" %%i in ("C:\Test\Motive\*.*") do findstr /x /c:"%%~nxi" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%i  

ungetestet !!!
Member: Philosoph
Philosoph Jun 25, 2010 at 13:16:32 (UTC)
Goto Top
put C:\Test\Motive\7.txt

Das ist leider das falsche Ergebnis! Mir ist eben aufgefallen, dass das Skript keine Unterordner durchsucht, sondern nur die erste Ebene.
Anscheinend kann findstr keine Verzeichnisstruktur durchsuchen. Sehr schade.
Deshalb ist der Filter mit $ sogut wie ohne Nutzen.

Hat jemand von euch eine Idee wie ich das Problem anders lösen kann? Ich möchte nur ungern auf VB oder C++ zugreifen.


LG
Tommy
Member: Biber
Biber Jun 25, 2010 at 13:24:34 (UTC)
Goto Top
Moin Philosoph,

willkommen im Forum.

Zitat von @Philosoph:
put C:\Test\Motive\7.txt

Das ist leider das falsche Ergebnis!
Mir ist eben aufgefallen, dass das Skript keine Unterordner durchsucht, sondern nur die erste Ebene.
Lies bitte noch mal deine Beschreibung des Problems, für das hier Lösungen gepostet wurden.
Es war nie die Rede von "Unterordner" oder "Verzeichnisstruktur".
Anscheinend kann findstr keine Verzeichnisstruktur durchsuchen. Sehr schade.
Unzulässige Schlussfolgerung. Aber da kann Findstr bei "FindStr /?" selbst antworten.

Deshalb ist der Filter mit $ sogut wie ohne Nutzen.
Okay, wenn du in den Autozubehörhandel gehst und einen Spoiler bestellst, dann kannst du hinterher auch nicht lamentieren
"Öhh.., jetzt hab ich so viel Geld bezahlt und meinen Trabi überholen immer noch alle."

Hat jemand von euch eine Idee wie ich das Problem anders lösen kann?
Jepp. Formuliere die Anforderung genauer.

Grüße
Biber
Member: pieh-ejdsch
pieh-ejdsch Jun 25, 2010 at 13:38:21 (UTC)
Goto Top
Moin Philosoph,

das liegt dann wohl eher an dem was FOR machen soll (zB /R ekursiv . (punkt) für Ordnerstruktur)
das $ im FINDSTR mit [Zeichensatz] suchen lassen

for /r "C:\Test\Motive\" %%i in (.) do @echo %%~nxi|findstr /b [$]||for %%j in ("%%~fi\*.*") do findstr /x /c:"%%~nxj" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%i  

Gruß Phil
Member: bastla
bastla Jun 25, 2010 at 14:01:02 (UTC)
Goto Top
... wobei ich
findstr /b [$]
im Zweifelsfall eher so formuliert hätte:
findstr /v /b "\$"

Grüße
bastla
Member: Philosoph
Philosoph Jun 25, 2010 at 14:34:04 (UTC)
Goto Top
Hallo Biber,

du hast natürlich recht. Ich schrieb jedoch auch:
"Perfekt! Genau das wollte ich erreichen, jetzt funktioniert das Skript. Eine Hürde habe ich noch:"
Die Gedanke, dass auch mal Verzeichnisse zu durchsuchen sind, kam mir erst später. Deshalb habe ich das nicht bereits im ersten Thread gepostet... face-wink

Nun zu meiner aktuellen Frage, wie Unterverzeichnisse ausgelesen werden:
)
)

Damit komme ich recht gut hin. Jedoch werden die Unterverzeichnisse ausgelassen!
Die Beispiele haben leider auch nicht funktioniert. Die Dos-Hilfe zu findstr sagt:
/S Sucht nach entsprechenden Dateien im aktuellen Verzeichnis und allen Unterverzeichnissen.
Damit wäre mir ja gehilfen, dann würde mein Skript wie folgt aussehen:

)
)

Setze ich diese Option hinzu (/S), passiert garnichts mehr. Hat jemand bereits diese Option im Einsatz gehabt?


LG
Tommy
Member: bastla
bastla Jun 25, 2010 at 14:44:52 (UTC)
Goto Top
Hallo Philosoph!

Da Du nicht nach Dateien mit einem bestimmten Inhalt, sondern nach Dateinamen suchtst, wird "/s" nicht helfen ...

Versuche es eher mit dem Ansatz von pieh-ejdsch (unter Berücksichtigung meines Hinweises) oder zB so:
for /f "delims=" %%a in ('dir /s /b /ad "C:\Test\Motive" ^|findstr /v /b "\$"') do for %%i in ("%%a\*.*") do findstr /x /c:"%%~nxi" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%i
Grüße
bastla
Member: Philosoph
Philosoph Jun 25, 2010 at 15:07:55 (UTC)
Goto Top
Hallo Bastla,

interessant, wieviel Menschen über die guten "alten" DOS-Zeiten noch Wissen bzw. Erfahrungen gesammelt haben. face-smile
Leider erstellt dein Code keine Ergebnis.txt, obwohl alle Pfade in deinem Skript richtig gesetzt wurden.

Ich schaue, ob ich den Fehler noch selbst finde.

LG
Tommy
Member: bastla
bastla Jun 25, 2010 at 15:30:43 (UTC)
Goto Top
Hallo Philosoph!

In den guten "alten" DOS-Zeiten hätte das meiste, was Du hier an Batches findest, nicht funktioniert - jetzt sind die guten neuen "CMD-Zeiten" ... face-wink
Vielleicht als Hinweis zur Fehlersuche: Mit "findstr /x" wird eine Übereinstimmung mit der kompletten Zeile verlangt - soferne es jetzt in der "index.txt" auch Pfade gibt, wäre dementstsprechend nicht mehr mit "%%~nxi", sondern mit "%%i" zu vergleichen (oder eben wieder mit "/e" nur das Ende des Pfades).

Grüße
bastla
Member: Philosoph
Philosoph Jun 25, 2010 at 16:15:04 (UTC)
Goto Top
Hallo Bastla,

sicher nerve ich dich schon. Aber auch wenn ich "%%~nxi" durch "%%i" ersetze, wird keine ergebnis.txt mehr erstellt.
Das Skript sieht nun wie folgt aus:

Ich glaube, ich wäre in VB doch schneller gewesen. Aber jetzt wurmt es mich doch, dass ich hier nicht von alleine drauf komme. face-sad
Also diese Skript-Sprache wird nicht mein bester Freund. face-wink


LG
Tommy
Member: bastla
bastla Jun 25, 2010 at 16:27:08 (UTC)
Goto Top
Hallo Tommy!

Wie sieht denn inzwischen Deine "index.txt" aus (davon hängt es ab, ob per "/x" oder per "/e" geprüft werden muss)?
Wenn Du das "/b" aus dem ersten "findstr" entfernst, werden alle Pfade, in denen ein "$" vorkommt, "ausgeblendet" - wenn das so nicht richtig wäre, müsste zusätzlich jeder Ordnername geprüft werden, womit wir wieder beim Vorschlag von pieh-ejdsch wären:
for /r "C:\Test\Motive\" %%i in (.) do echo %%~nxi|findstr /b "\$">nul || for %%j in ("%%~fi\*.*") do findstr /x /c:"%%~j" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%j
Grüße
bastla
Member: Philosoph
Philosoph Jun 25, 2010 at 20:27:28 (UTC)
Goto Top
Hallo Bastla!

Klasse, so läuft es bestens:
for /r "C:\Test\Motive\" %%i in (.) do echo %%~nxi|findstr /b "\$">nul || for %%j in ("%%~fi\*.*") do findstr /x /c:"%%~j" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%j  

Mein Ergebnis sieht nun so aus:
put C:\test\motive\12sdf121-45sdfa5454.txt
put C:\test\motive\12s121-45s54.txt
put C:\test\motive\121-45sdfa54.txt

Wie du siehst, teilt sich der Dateiname in zwei Segmente. Bevor ich nun mit VB weiter mache eine Frage:
Kann ich auch zum Schluss über Batch den Dateinamen so aufteilen, dass ich nur den ersten Teil bis zum "-" Zeichen filter.
Ergebnis in der neuen Ausgabe wären dann:

Ergebnis2.txt:
12sdf121.txt
12s121.txt
121.txt

Ich denke mal, das ist zu komplex, so dass ich das in VB umsetzen werde. Wenn du aber als Batch-Gott aller Götter (musste eben bei deinen vielen beiträgen wirklich staunen) eine Idee hast, dann würde ich mich sehr freuen. face-smile

LG
Tommy
Member: bastla
bastla Jun 25, 2010 at 21:21:38 (UTC)
Goto Top
Hallo Tommy!

Wenn Du tatsächlich nur den ersten Teil des Dateinamens (also auch ohne Pfadangabe) erhalten willst, brauchen wir noch eine kleine Extra-Schleife:
for /r "C:\Test\Motive\" %%i in (.) do echo %%~nxi|findstr /b "\$">nul || for %%j in ("%%~fi\*.*") do findstr /x /c:"%%~j" "C:\Test\index.txt" >nul || for /f "delims=-" %%a in ("%~nj") do >>C:\Test\ergebnis.txt echo put %%a%%~xj
Mit Pfad dann analog:
for /r "C:\Test\Motive\" %%i in (.) do echo %%~nxi|findstr /b "\$">nul || for %%j in ("%%~fi\*.*") do findstr /x /c:"%%~j" "C:\Test\index.txt" >nul || for /f "delims=-" %%a in ("%~nj") do >>C:\Test\ergebnis.txt echo put %%~dpj%%a%%~xj
Grüße
bastla

P.S.: Nur als Anmerkung: Der letztlich funktionierende Code stammt zu nahezu 100 % von @pieh-ejdsch ...
Member: pieh-ejdsch
pieh-ejdsch Jun 26, 2010 at 11:25:21 (UTC)
Goto Top
@bastla

Danke für die Blumen! - Du hast es aber ja erst Richtig gangbar gemacht.

manchmal begreif ich eine Frage sofort; manchmal stehe ich dennoch auf'm Schlauch und in einigen Problembeschreibungen kommen eben zusätzliche Fragen zu der Eigentlichen Aufgabe doch erst innerhalb des Lösungsansatzes auf

Gruß Phil
Member: Philosoph
Philosoph Jun 28, 2010 at 06:10:51 (UTC)
Goto Top
Hallo Phil,
hallo bastla,

ich habe eure Vorschläge heute Vormittag gleich versucht umzusetzen. Leider erhalte ich bei beide Varianten keine Ergebnis.txt Ausgabe.
Ganz egal ob die Textdatei exisitiert oder nicht, es erfolgt dorthin keine Ausgabe. Die Pfade und Dateinamen stimmen.

Habt ihr eine Idee woran das liegen kann?


LG
Tommy
Member: bastla
bastla Jun 28, 2010 at 20:04:58 (UTC)
Goto Top
Hallo Tommy!
Habt ihr eine Idee woran das liegen kann?
Am ehesten liegt es am "findstr"; wie sieht denn der Inhalt der "index.txt" jetzt aus?
Davon abhängig könnte vielleicht
... findstr /x /c:"%%~fj" ...
helfen ...

Grüße
bastla
Member: Biber
Biber Jul 02, 2010 at 06:28:38 (UTC)
Goto Top
Moin Philosoph,

wie ist denn der gefühlte Lösungsstand deiner Frage?

Alles grün oder noch Fragen offen?
Gib bitte mal Feedback.

Grüße
Biber
Member: Philosoph
Philosoph Jul 04, 2010 at 16:41:40 (UTC)
Goto Top
Hallo in die Runde,

ich gehe davon aus, dass ich morgen das gesamte Skript im Projektordner testen kann.
Dann wissen wir alle mehr! Ich werde berichten.

LG
Tommy
Member: Philosoph
Philosoph Jul 05, 2010 at 12:42:04 (UTC)
Goto Top
Vielen Dank nochmal an alle die mir geholfen haben.
Werde mich dem Forum dankbar zeigen und demnächst auch hier und da Hilfestellung in meinem Fachbereich geben.

Es gibt wenige Foren die wirklich weiterhelfen, das hier ist so eines!
Die Aufgabe ist damit gelöst, auch wenn ich weitere Fragen habe die ich aber in einem neuen Theme klären möchte.
Die eigentliche Aufgabenstellung ist aber hier gelöst.

Gruß
Tommy