Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Findstr Befehl modifizieren

Frage Entwicklung Batch & Shell

Mitglied: Philosoph

Philosoph (Level 1) - Jetzt verbinden

25.06.2010 um 11:35 Uhr, 3947 Aufrufe, 22 Kommentare

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:
for %%i in ("c:\test\motive\*.*") do findstr /e /c:\test\motive"%%~nxi" c:\test\index.txt>nul || echo put %%i>>C:\test\ergebnis.txt
)
)

Hat jemand eine Idee von euch? Ich bin so langsam wirklich durch mit den Nerven. 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
Mitglied: 60730
25.06.2010 um 12:28 Uhr
moin,

das die Zeile überhaupt was anderes, als einen Fehler auswirft - ist (ungetestet aus dem Bauch aber bemerkenswert)
01.
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
Bitte warten ..
Mitglied: bastla
25.06.2010 um 12:36 Uhr
... 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
Bitte warten ..
Mitglied: Philosoph
25.06.2010 um 13:01 Uhr
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?
Bitte warten ..
Mitglied: MisterExpulso
25.06.2010 um 14:53 Uhr
Hallo Philosoph,
ich bin zwar nicht bastla aber ich kann dir vielleicht trotzdem weiterhelfen:

01.
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 !!!
Bitte warten ..
Mitglied: Philosoph
25.06.2010 um 15:16 Uhr
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
Bitte warten ..
Mitglied: Biber
25.06.2010 um 15:24 Uhr
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
Bitte warten ..
Mitglied: pieh-ejdsch
25.06.2010 um 15:38 Uhr
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

01.
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
Bitte warten ..
Mitglied: bastla
25.06.2010 um 16:01 Uhr
... wobei ich
findstr /b [$]
im Zweifelsfall eher so formuliert hätte:
findstr /v /b "\$"
[Edit] ... aber nur, wenn ich das nachfolgende "||" übersehen hätte - daher: sorry, hatte an die Verwendbarkeit in einer Schleife gedacht und daher leider danebengegriffen ... [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: Philosoph
25.06.2010 um 16:34 Uhr
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...

Nun zu meiner aktuellen Frage, wie Unterverzeichnisse ausgelesen werden:
for %%i in ("C:\Test\Motive\*.*") do findstr /x /c:"%%~nxi" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%i
)
)

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:

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

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


LG
Tommy
Bitte warten ..
Mitglied: bastla
25.06.2010 um 16:44 Uhr
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
Bitte warten ..
Mitglied: Philosoph
25.06.2010 um 17:07 Uhr
Hallo Bastla,

interessant, wieviel Menschen über die guten "alten" DOS-Zeiten noch Wissen bzw. Erfahrungen gesammelt haben.
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
Bitte warten ..
Mitglied: bastla
25.06.2010 um 17:30 Uhr
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" ...
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
Bitte warten ..
Mitglied: Philosoph
25.06.2010 um 18:15 Uhr
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:
for /f "delims=" %%a in ('dir /s /b /ad "C:\Test\Motive" ^|findstr /v /b "\$"') do for %%i in ("%%a\*.*") do findstr /x /c:"%%i" "C:\Test\index.txt" >nul || >>C:\Test\ergebnis.txt echo put %%i

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


LG
Tommy
Bitte warten ..
Mitglied: bastla
25.06.2010 um 18:27 Uhr
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
Bitte warten ..
Mitglied: Philosoph
25.06.2010 um 22:27 Uhr
Hallo Bastla!

Klasse, so läuft es bestens:
01.
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.

LG
Tommy
Bitte warten ..
Mitglied: bastla
25.06.2010 um 23:21 Uhr
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 ...
Bitte warten ..
Mitglied: pieh-ejdsch
26.06.2010 um 13:25 Uhr
@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
Bitte warten ..
Mitglied: Philosoph
28.06.2010 um 08:10 Uhr
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
Bitte warten ..
Mitglied: bastla
28.06.2010 um 22:04 Uhr
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
Bitte warten ..
Mitglied: Biber
02.07.2010 um 08:28 Uhr
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
Bitte warten ..
Mitglied: Philosoph
04.07.2010 um 18:41 Uhr
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
Bitte warten ..
Mitglied: Philosoph
05.07.2010 um 14:42 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Findstr - code für schwieriger Abfrage gesucht (9)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mal eine neue Art von Abfrage mit findstr (8)

Frage von DaTobsn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...