Gesucht: Programm, das im Hintergrund automatisiert Dateibezeichnungen auf String prüft und diesen anschließend entfernt

SpezNas2k15

Cadet 3rd Year
Registriert
Aug. 2015
Beiträge
35
Hallo,

entsprechend der Überschrift bin ich seit nunmehr einigen Monaten (erfolglos) auf der Suche nach einem Tool, dass verschiedene Verzeichnisse gleichzeitig in Echtzeit überwacht und prüft, ob die darin enthaltenen Dateibezeichnungen einen (je nach überwachtem Verzeichnis unterschiedlichen) String besitzen. Wird der besagte String in einer oder mehreren Dateien des jeweiligen Verzeichnisses identifiziert, so soll dieser in einem zweiten Schritt aus den fraglichen Dateibezeichnungen entfernt werden. Die Position, an der sich der String in den einzelnen Dateibezeichnungen befindet, kann dabei variieren.
Zwar verwende ich bereits ein Tools, das einerseits automatisiert Dateien umbenennen und offenbar auch eine Batch-Datei erstellen kann, die mit konkreten Vorgaben gespeist wird. Allerdings fehlt mir in diesem Zusammenhang die parallele Echtzeitüberwachung zahlreicher Verzeichnisse, bei welcher, sobald eine oder mehrere neue Dateien in das fragliche Verzeichnis gelangen, umgehend die Prüfung auf den jeweiligen String und ggf. Anpassung des Dateinamens erfolgt.

Was die Kostenfrage anbelangt, so habe ich kein Problem etwas Geld (ich sag mal ca. 50 Euro Einmalzahlung) in die Hand zu nehmen. Sollte die potenzielle Software hervorragend sein, könnte sich der Betrag, den ich zu zahlen bereit wäre, auch noch etwas erhöhen. Selbstverständlich wäre ich auch mit einer kostenneutralen Lösung zufrieden, sofern diese meine o. g. Bedürfnisse adressiert. Was ich hingegen nicht schätze und nach Möglichkeit grundsätzlich vermeiden möchte sind Abo-Modelle. Software, die als Abo-Modell vertrieben wird, ist für mich nur noch der letzte "Strohhalm" an den ich mich im Notfall klammere.

Ich hoffe auf den einen oder anderen heißen Software-Tipp von euch!

Schon einmal vielen Dank für eure Inspiration/Hilfe!

Gruß
SpezNas2k15
 
Zuletzt bearbeitet:
Also du hast bereits ein Tool, das alles tut was du möchtest - nur nicht in "Echtzeit"?
Falls ja wäre eine While ($true) Schleife in Powershell, die das Tool ausführt, nicht dann bereits die Lösung?

Davon ab müsste das in Powershell ziemlich einfach zu realisieren sein.
Keine Ahnung, ob dir das hilft.

PowerShell:
$searchpattern = "Badutschi"
$directory = "C:\test"

$searchpattern = $searchpattern.ToLower()
cd $directory

while ($true) {

$files = dir $directory

    foreach ($file in $files) {
        if ($file.FullName.toLower().Contains($searchpattern)) {
            [string] $tempname = $file.FullName.ToLower()
            $tempname = $tempname.Replace($searchpattern, "")
            Rename-Item -Path $file -NewName $tempname
        }
    }
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Art Vandelay
Vielen Dank für eure informativen Beiträge, DerFahnder und MrStools.

DerFahnder schrieb:
Also du hast bereits ein Tool, das alles tut was du möchtest - nur nicht in "Echtzeit"?
Ich habe vorhin noch einmal mein Vorhaben mit meinem Tool "Rename Expert" getestet und es scheint tatsächlich – bis auf die Echtzeitprüfung und sofern ich nichts übersehen habe – alle sonstigen, von mir gewünschten Aufgaben zu bewältigen.
In der Software für die Umbenennung selbst stelle ich die von mir gewünschten Vorgaben (String auf den zu prüfen ist sowie bei positivem Befund eine abschließende Entfernung der Zeichenkette aus der jeweiligen Dateibezeichnung) ein und speichere die von mir getätigten Einstellungen in einer separaten Profil-Datei. Anschließend lasse ich auf Basis der zuvor erstellten Profil-Datei eine Batch-Datei erstellen, bei welcher ich noch das einzulesende Hauptverzeichnis sowie gegebenenfalls Unterverzeichnisse auswähle. Die gestartete Batch-Datei funktioniert ebenfalls wie von mir gewünscht.

DerFahnder schrieb:
Falls ja wäre eine While ($true) Schleife in Powershell, die das Tool ausführt, nicht dann bereits die Lösung?
Von daher wäre dein im Zitat genannter Vorschlag bzgl. der "While ($true) Schleife in Powershell" sicherlich eine wunderbare Idee. Leider habe ich von Programmierung wohl nahezu keine nennenswerten Kenntnisse und von Powershell überhaupt keine Ahnung. Wäre es für dich daher wohl möglich, das fragliche Powershell-Skript für mich zu schreiben, welches die Funktion der Batch-Datei startet und am Leben erhält? Natürlich nur, sofern es nicht zu viel Aufwand bereitet. Das wäre wirklich großartig, da mein Vorhaben offenbar nur noch an diesem Skript zu scheitern scheint.
Der Ort, an dem sich die Batchdatei beispielhaft befindet könnte dabei "D:\Dateiumbenennung\Profile" sein. Als beispielhaften Dateinamen Schlage ich "Dateiumbenennung_Test.cmd" vor.

Dazu habe ich noch drei Fragen:
  • Protokoll: Ist es auf einfachem Weg möglich eine Protokollierung in das Skript aufzunehmen, die eine Textdatei mit den durchgeführten Dateioperationen an einem bestimmten Ort hinterlegt?
    So könnte ich etwaige Fehler besser nachvollziehen, sofern irgendwann mal Schwierigkeiten bei der Dateiumbenennung auftreten.
  • Automatisiertes Starten des Skripts: Würde man für den automatisierten Start die Windows-Aufgabenplanung nutzen, um das Skript direkt oder kurz nach dem Systemstart zu aktivieren?
  • Unsichtbarkeit des Skripts im Hintergrund: Ist es möglich das Skript und die damit zusammenhängende Batch-Datei unsichtbar im Hintergrund zu öffnen?
    Ein sich immer wieder öffnendes Fenster würde ich wohl als störend empfinden.

DerFahnder schrieb:
Davon ab müsste das in Powershell ziemlich einfach zu realisieren sein.
Keine Ahnung, ob dir das hilft.
"Einfach" ist gut. :D Ich steig bereits bei den "$"-Zeichen in Zeile eins und zwei aus, wobei ich den Rest in den beiden Zeilen wohl zumindest verstanden habe.

Tatsächlich funktioniert das Skript schon einmal wirklich gut. Vielen Dank! Dennoch zeigen sich bei dessen Testbetrieb ein paar Auffälligkeiten, zu denen ich noch ein paar Versändnisfragen habe:
  • Kleinbuchstaben nach Korrektur: Ist es korrekt, dass die Dateinamen nach der Bereinigung nur noch Kleinbuchstaben aufweisen und falls ja, könnte man dies einfach ändern? Die Dateinamen, die nicht den zu prüfenden String beinhaltet haben, besitzen nach wie vor Großbuchstaben.
    (Beispiel: Aus der Dateibezeichnung "ZwischenBadutschiablage.txt" wird nach der Bereinigung "zwischenablage.txt" und nicht "Zwischenablage.txt".)
  • Umbenennung neuer Datei bei identischer Bezeichnung: Kann das Skript gegenüber Dateien, die neu in das/die überwachte/n Verzeichnis/se hinzukommen und die nach Bereinigung eine identische Dateibezeichnung aufweisen wie bereits bestehende Dateien, unkompliziert angewiesen werden, die neuen Dateien umzubenennen (z. B. durch Anhängen eines Zusatz wie "_neu")?
    --> Wenn neue Dateien nach der Bereinigung den gleichen Dateinamen aufweisen, wie bereits dort bestehende, so gerät das Skript derzeit in eine Endlosschleife mit der Fehlermeldung (Ausschnitt): "Rename-Item: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist."
    Die Endlosschleife lässt sich erst durch anpassen der neuen oder alten Datei unterbrechen, so dass das Skript wieder normal weiter läuft.
  • Mehrere Such-Strings vergeben: Ist es einfach möglich mehrere mögliche Strings im Skript zu benennen, nach denen gesucht werden soll (z. B. neben "Badutschi" auch "[ABC]" und "- 123 -")?
  • Unterordner durchsuchen: Kann das Skript einfach angewiesen werden neben dem Hauptordner auch mögliche Unterordner in die Suche nach Dateibezeichnungen, die den/die jeweiligen String/s enthalten, mit einzubeziehen?
MrStools schrieb:
Das hier könnte ein Teil der Lösung sein: https://github.com/facebook/watchman
Vielen Dank für die Benennung dieses zusätzlichen Tools, MrStools. Allerdings erschlägt es einen, wenn man sich die – zumindest für mich – kryptische Dokumentation ansieht. Leider stammt das Werkzeug, auch wenn es quelloffen zu sein scheint, aus dem Meta-Konzern, von dem ich prinzipiell meide, was irgendwie möglich ist.

Gruß
SpezNas2k15
 
Da nichts Näheres zur Umgebung geschrieben wurde, werf ich einfach mal die Lösung in den Raum, die wir für diese Zwecke in der Arbeit zuverlässig schon seit vielen Jahren nutzen:

Inotify
 
Hardkorn schrieb:
Danke für die Software-Empfehlung, Hardkorn.

Tatsächlich nutze ich "File Juggler" bereits aktiv für einen Teil meines obigen Vorhabens (permanentes überwachen von Verzeichnissen und verschieben von dortigen Dateien, sofern sie bestimmten Kriterien entsprechen). :) Was mir bei "File Juggler" leider fehlt respektive ich nicht gefunden habe, ist die Fähigkeit, den Dateinamen nach dem Verschiebevorgang anzupassen (z. B. wieder den String zu entfernen, den ich zuvor als Suchkriterium in den Dateinamen integriert habe).
 
Aus aktuellem Anlass reaktiviere ich dieses Thema noch einmal kurz, da ich eine für mich tragfähige Lösung entwickelt habe. Möglicherweise dienen meine Erkenntnisse auch anderen Anwendern, die vor einer ähnlichen Fragestellung stehen, weshalb ich im Folgenden kurz mein Vorgehen skizzieren möchte:

I. Folgende Anwendungen nutze ich nun für mein obiges Vorhaben:
  • "File Juggler" (Werkzeug zur automatisierten Dateiorganisation sowie mit der Fähigkeit zur Überwachung von Verzeichnissen)
  • "PowerShell"
    --> Die fehlende Fähigkeit in "File Juggler", Dateinamen – etwa auf Basis von Strings – umzubenennen, habe ich in ein "PowerShell"-Skript ausgelagert. Dieses wird bei jeder Dateioperation von "File Juggler" automatisiert im Hintergrund gestartet. Somit wird der zuvor der Datei gegebene String, anhand dem "File Juggler" entscheidet, wohin die Datei zu kopieren ist, bei Eingang im Zielverzeichnis sogleich wieder durch das Skript entfernt.

II. Vorgehen:
1 In "File Juggler":

1.1 Anlegen einer neuen Regel, welche das oder die fraglichen Verzeichnis(se) überwacht, in welche(s) die Dateien zunächst gespeichert werden,
1.2 vergeben von String sowie Dateiendung als Suchkriterien, anhand derer die Dateien später identifiziert werden,
1.3 Zielverzeichnis definieren, in das die identifizierten Dateien verschoben werden,
1.4 übergeben des nachfolgenden Befehls zum öffnen eines Powershell-Skripts an die Windows-Eingabeaufforderung:
Code:
powershell -f "E:\Testordner\Texte\Skript\Untitled1.ps1"


2 In "PowerShell":
Anlegen des Skripts mit folgendem Code, um zwei konkrete Beispielverzeichnisse (Codezeilen können ja offenbar auf eine einfache Art beliebig erweitert werden) automatisiert zu bereinigen:
PowerShell:
get-childitem "E:\Testordner\Texte\Beispieltexttyp1\*.*" | foreach {rename-item $_ $_.name.replace("Test-String1.1","")}
get-childitem "E:\Testordner\Texte\Beispieltexttyp2\*.*" | foreach {rename-item $_ $_.name.replace("Test-String1.2","")}


Gruß
SpezNas2k15
 
  • Gefällt mir
Reaktionen: MrStools, Hardkorn und AB´solut SiD
SpezNas2k15 schrieb:
Wird der besagte String in einer oder mehreren Dateien des jeweiligen Verzeichnisses identifiziert
😮 damit hättest du mich völlig in die Wüste geschickt!
Wenn du klipp und klar von Dateinamen (statt Dateinhalten) gesprochen hättest dann wäre das wohl mit PowerSehll (hasse ich…) oder WSH so live wie möglich zu machen gewesen.

CN8
 
AB´solut SiD schrieb:
Gudn, find ich echt gut das du dich nochmal meldest. thumbs up
Ja, ich bemühe mich Themen inhaltlich mit einem Mehrwert auch für Dritte abzuschließen, sofern mir dies möglich ist. In der Vergangenheit habe ich leider auch bei für mich relevanten Fragestellungen zu oft gesehen, wie Themen mit Aussagen wie "Thema kann geschlossen werden, ich habe die Lösung gefunden" beendet wurden, ohne, dass diese einen wirklichen Nutzen besessen hätten. Da ich aber nicht kritisieren kann, was ich selber nicht besser mache, habe ich mich für den obigen Weg entschieden.
cumulonimbus8 schrieb:
😮 damit hättest du mich völlig in die Wüste geschickt!
Wenn du klipp und klar von Dateinamen (statt Dateinhalten) gesprochen hättest dann wäre das wohl mit PowerSehll (hasse ich…) oder WSH so live wie möglich zu machen gewesen.
Aiaiai, da kommen sie wieder durch, die nahezu nicht vorhandene Programmierkenntnisse bei mir. Hätte ich welche, dann wäre ich wohl eher darauf geeicht präziser zu formulieren. Ich werde die Bedeutung der Präzision gerade bei zukünftigen programmierspezifischen Fragen im Hinterkopf behalten.
Die Lösung mit PowerShell habe ich mir dementsprechend (leider) auch durch intensive Recherche und nicht durch die Fähigkeit zum Programmieren erarbeitet, wobei ich mir in der für Versierte – vermutlich – einfachen Codezeile ein paar Bestandteile durch Logik herleiten konnte. Anders als mit PowerShell habe ich mich jedoch mit WSH ("Windows Script Host"?) noch gar nicht beschäftigt.
 
SpezNas2k15 schrieb:
Anders als mit PowerShell habe ich mich jedoch mit WSH ("Windows Script Host"?) noch gar nicht beschäftigt.
Da ich ja der PowerShell abgeschworen hatte 😉 will ich WSH damit begründen, dass das VBS dort sehr ähnlich zu VBA von Office ist das mir wöchentlich ein paar mal über die Füße läuft. Also Gewohnheit. Auch AutoIt tickt recht ähnlich. JavaScript ist mir da schon eher umständlich.
PowerShell ist unten durch wegen einer Syntax die man sich nicht eben merken kann, und weil sie (die Hochgelobte mit der alles ginge) bei einer für mich lachhaften Aufgabe (Anforderung) kapital versagt hat.

CN8
 
Zurück
Oben