Hilfe benötigt bei der Automatisierung des Dateiumbenennungsskripts in AutoIt

  • Hallo zusammen,

    Ich bin neu bei AutoIt und versuche, ein Skript zu erstellen, um das Umbenennen einer großen Anzahl von Dateien in einem Verzeichnis zu automatisieren. Das Ziel besteht darin, bestimmte Muster in Dateinamen durch neuen Text zu ersetzen. Ich möchte beispielsweise Dateinamen wie folgt ändern:

    • report_2023_final.txtreport_final_2023.txt
    • log_2023_backup.zipbackup_log_2023.zip

    Ich habe mit String-Manipulationsfunktionen wie StringReplace() und StringSplit() experimentiert, aber ich habe Probleme, die Dateien in einem Ordner zu durchlaufen und diese Transformationen konsistent anzuwenden.

    Das habe ich bisher erreicht:

    Das Skript scheint die Dateien korrekt abzurufen, aber meine Transformationen schlagen entweder fehl oder führen beim Umbenennen zu Fehlern. Ich wäre für jede Anleitung dankbar zu:

    1. Strukturierung der Logik für komplexere Namenstransformationen.
    2. Behandlung von Fehlern während des Umbenennungsprozesses (z. B. doppelte Namen).
    3. Best Practices zum Testen solcher Skripte ohne Risiko eines Dateiverlusts.


    Vielen Dank im Voraus für Ihre Hilfe! Ich freue mich darauf, von Ihrem Fachwissen zu lernen.

    Grüße

    Elli

  • Du solltest zuerst die einzelnen Dateibezeichnungen bis zu den _ extrahieren und in Hilfsvariablen speichern, danach diese "Teile" nach Bedarf zusammensetzen. Als "Schutz" vor Dupletten, einen Zähler mitlaufen lassen und in den Dateinamen einbauen.

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Also,

    erstmal:

    Wenn ein Script eingestellt wird, dann bitte als Script in Code Tags und nict als Bild. ;)

    Und in der Signatur auf eine Marketingseite verlinken ist ein "no go"

    Da das auch noch dein erster Post ist, gehe ich nicht davon aus dass du hier Hilfe suchst. ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • Aber Schnuffel...Du solttest, noch dazu in der Weihnachtszeit, nicht immer nur das schlechte unterstellen...

    Frohe Weihnachten


    Peter

    Ps: Zumal der TE ja schon reagiert hat...

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Auch wenn reguläre Ausdrücke gerade für Anfänger schwerer sind, würde ich sie hier verwenden. Sie sind meiner Meinung nach die beste/einfachste Möglichkeit, sicherzustellen, dass ein Input genauso aussieht, wie man das will und im Zweifel ein Fehler geworfen wird.

    Hier bin ich bei dem Ausdruck (?|(report)|(log))(?:_(\d{4}))?(?:_)?((?:(?:_)?[a-zA-Z0-9]+)*)?\.(\S+) davon ausgegangen, dass am Anfang immer der Typ der Datei steht (report/log/...); (optional) gefolgt von einem Jahr; (optional) gefolgt von Zusätzen, wie backup/final/... (mit _ getrennt) und am Ende der Dateiendung.
    Wenn irgendetwas anderes auftaucht, wird ein Fehler ausgegeben und die Datei ignoriert (nicht kopiert/verschoben/gelöscht/...).

    Gerade bei wichtigen Dateien würde ich aber immer auf einer Kopie arbeiten. Sind es zu viele Dateien um alle zu kopieren würde ich erst mit Teilen davon arbeiten und Testen und sicherstellen, dass alle Möglichkeiten abgedeckt sind.

    Falls du noch Fragen hast, stell sie gerne :)

  • ich will ja nicht nur negativ denken, also auch ein Vorschlag von mir ohne RegEx, die ja einen Anfänger doch ein wenig überfordern können.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

  • Ich verstehe das Problem ein wenig anders. Aber das muss der TE entscheiden.

    Er schreibt.. als Beispiel....

    • report_2023_final.txtreport_final_2023.txt
    • log_2023_backup.zipbackup_log_2023.zip

    das bedeutet nicht dass nicht auch xyz_2023_abc.doc existieren könnte.

    Wie ich das verstehe sind nur die _ beständig. Daher würde ich die Position der Unterstriche feststellen und die "Namensteile" davor, dazwischen und danach extrahieren. Diese kann man dann ersetzen umstellen usw.

    Um das Prog flexibel zu halten ---> Trenner in die *.ini dann kann man das anpassen.

    Frohe Weihnachten

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hmm,

    ich finde Kanashius Lösung zwar schön von der herangehensweise, jedoch wären dort aus meiner Sicht 2 Sachen nicht erfüllt:

    1. Die Reihenfolge der Dateinamensbestandteile (Log, backup,...) ändert sich, das lässt sich aber recht leicht im letzen Block neu anordnen.
    2. Eine Prüfung ob der neue Dateiname bereits existiert (und ggf. ergänzen durch fortlaufende Nummer, das wurde nicht weiter erläutert in der Anfrage was gemacht werden soll).
    Hierfür müsste eine weitere Schleife in den letzten Block eingefügt werden, die das entsprechend prüft und hoch zählt und den entsprechenden counter dann im Dateinamen einfügt.