File Renamer - Das Tool, was einem Ärger erspart [v2.0]

  • Halli hallo!

    Ich melde mich auch mal wieder hier :) Seit längerer Zeit bin ich dabei meine Musik auf meinem Computer zu sortieren - Und es nerven mich vor allem zwei Dinge dabei im Dateinamen:

    1. - Unterstriche! Gerade mit Sprachausgabe, die ich benötige, da ich fast nichts sehe, ist es grausam: "001Unterstrich-UnterstrichInterpretUnterstrich-UnterstrichTitel.mp3" zu hören!
    2. - Den Interpretennamen und den Albumname im Dateinamen einer Datei, die in einem Album ist: "Interpret - Album - Titel.mp3" (obwohl der Name des Interpreten in samplern wichtig ist ;) )

    Für dieses Problem habe ich ein Tool geschreiben, mit dem man automatisiert alle Daten in einem Ordner nach einem bestimmten Suchschema umbenennen lassen kann. Es kann/können:
    - ein Teil des Dateinamen ersetzt werden (z.B. "Interpret_Album_Titel.mp3" zu "Interpret Album Titel.mp3")
    - die ersten Zeichen im Dateinamen entfernt werden (z.B. "Interpret Album Titel.mp3" zu "Titel.mp3")
    - die letzten Zeichen im Dateinamen entfernt werden (z.B. "Titel feat. Interpret.mp3" zu "Titel.mp3")
    - die Dateierweiterung mit einbezogen werden oder nicht

    Seit v1.1: 
    - Inhalt von Unterordnern mit umbenennen

    Seit v2.0:
    - Neues Interface und neue Routinen.
    - Umbenennen von einzelnen Dateitypen möglich

    Ich würde mich über Feedback freuen!

    Euer Grimbizo


    Downloads:
    FileRenamer v1.0
    FileRenamer v1.1
    FileRenamer v2.0

    • Offizieller Beitrag

    Mal ein paar Anmerkungen...

    In der Funktion "LoadInternationalStrings":
    Switch-Case unterstützt die Mehrfachauswahl mittels Kommata. Du musst nicht für jeden Eintrag einen Case-Zweig schreiben. Das geht auch so:

    [autoit]

    Case "0409", "0809", "0c09", "1009", "1409", "1809", "1c09", "2009", "2409", "2809", "2c09", "3009", "3409"

    [/autoit]


    das Gleiche dann für die deutsche Sprache. Für alle anderen Sprachen (außer Deutsch und Englisch) kannst Du "Case Else" benutzen.
    Die dann folgenden If...Then Anweisungen kannst Du mit in die Case-Anweisungen schreiben.

    In der Funktion "Rename":
    Warum benutzt Du "_RunDOS( 'REN..."? Das geht doch auch direkt mit AutoIt ("FileMove"). Das würde dann auch das FileGetShortName einsparen.
    Du könntest das Programm auch noch erweitern, indem es die Dateien auch rekursiv (inkl. Unterverzeichnisse) umbenennt.

    Ungewöhnlich ist das benutzen von "ExpandVarStrings". Ich sehe darin nicht so den Vorteil. Man kann zwar die Stringverkettung etwas einfacher halten, aber es erschwert IMHO das lesen des Scripts. Ich bevorzuge für die Anzeige "StringFormat".

  • Danke erst mal für den Kommentar Oscar

    Danke, wegen dem Tipp mit dem Case. Ich habs erst so probiert:

    [autoit]

    Case "0001" Or "0002"...

    [/autoit]


    Das hat aber nicht funktioniert (zumindest nicht so, wie ich es wollte ;) )

    Ich wusste nicht, wie man mit AutoIT Dateien umbenennt, aber ich werde es verändern für die v1.1.

    Das rekursive hatte ich mir auch schon überlegt. Ich hab auch überlegt, ob man einzelne Dateien zu einer Liste hinzufügen bzw. einzelne Dateien aus einem Ordner ausschließen können soll. Das wird sicher mit der v1.1 kommen.

    ExpandVarStrings habe ich mir vor allem dingen wegen der Sprachen ausgesucht, weil es so (ein bischen ;) ) weniger platz braucht (außerdem wusste ich zwar von stringformat in C/C++ aber nicht in AutoIT; man kann ja auch net alles wissen, vor allem wenn man mehr mit C++ zu Tun hat):

    [autoit]

    Opt( "ExpandVarStrings", 1 )
    Global $str_0001 = "Some Text"
    MsgBox( 0, "", "The Text is " & $str_0001 )
    MsgBox( 0, "", "The Text is $str0001$" )

    [/autoit]


    Ich habe mir gerade String Format angesehen. Ich werde mir überlegen das zu benutzen. Aber ich finde die Übersichtlichkeit, gerade bei verschachtelten Funktionen, die jeweils eine andere aufrufen, nicht viel besser. Ich werde es ausprobieren!

    Noch mal danke!
    Grimbizo

    [Edit:] Ach ja, die Zeile

    [autoit]

    $strShortPath = FileGetShortName( "$strDirectory$" & $aFiles[$i] )

    [/autoit]


    habe ich eingefügt, um das Progress Fenster net zu überfüllen, wenn der Pfad lang ist :D

    • Offizieller Beitrag

    Die Funktion "LoadInternationalStrings" könnte doch auch so aussehen:

    Spoiler anzeigen
    [autoit]

    Func LoadInternationalStrings()
    Local $strOSLang = ""
    Switch @OSLang
    Case "0409", "0809", "0c09", "1009", "1409", "1809", "1c09", "2009", "2409", "2809", "2c09", "3009", "3409"
    $strOSLang = "ENG"
    Global _
    $str_0001 = "Browse...", _
    $str_0002 = "Count of start digits to trim", _
    $str_0003 = "Count of end digits to trim", _
    $str_0004 = "Find what", _
    $str_0005 = "Replace with", _
    $str_0006 = "Consider file extentions", _
    $str_0007 = "Open directory after renaming", _
    $str_0008 = "Start renaming", _
    $str_0009 = "Choose a direcory which contains the files that you want to rename.", _
    $str_0010 = "Renaming ", _
    $str_0011 = "", _
    $str_0012 = "Collecting files", _
    $str_0013 = "An error has occurred.", _
    $str_0014 = "Collecting files failed", _
    $str_0015 = "Rename sub-directories"
    Case "0407", "0807", "0c07", "1007", "1407"
    $strOSLang = "GER"
    Global _
    $str_0001 = "Durchsuchen...", _
    $str_0002 = "Anzahl der am Anfang abzuschneidenden Zeichen", _
    $str_0003 = "Anzahl der am Ende abzuschneidenden Zeichen", _
    $str_0004 = "Suchen nach", _
    $str_0005 = "Ersetzen durch", _
    $str_0006 = "Dateierweiterungen mit einbeziehen", _
    $str_0007 = "Ordner nach dem umbenennen anzeigen", _
    $str_0008 = "Starte umbenennen", _
    $str_0009 = "Wählen sie einen Ordner aus, dessen Dateien sie umbenennen möchten.", _
    $str_0010 = "Benenne ", _
    $str_0011 = " um", _
    $str_0012 = "Sammle Dateien", _
    $str_0013 = "Ein Fehler ist aufgetreten.", _
    $str_0014 = "Das sammeln der Daten ist fehlgeschlagen.", _
    $str_0015 = "Benenne Unterordner um"
    Case Else
    $strOSLang = "ENG"
    MsgBox(48, "FileRenamer $FILERENAMER_VERSION$ - Error", "Your system language could not be detected or is not supported.@LF@" & _
    "Laguage has been set to English.@LF@" & _
    "@LF@" & _
    "MS Language code: @OSLang@")
    EndSwitch
    EndFunc ;==>LoadInternationalStrings

    [/autoit]

    BTW: In SciTE gibt es das "Tidy AutoIt Source"-Tool (CTRL+T). Damit kannst Du den Quellcode sauber formatieren/einrücken lassen.

    Nochwas in der Funktion "SelectFolder" solltest Du nicht auf @error testen, sondern mit "FileExists":

    [autoit]


    Local $strDirecory = FileSelectFolder("$str_0009$", "")

    [/autoit][autoit][/autoit][autoit]

    If FileExists($strDirecory) Then...

    [/autoit]


    Das hat den Vorteil, dass Du damit auch "falsche" Pfade ("Desktop", "Heimnetzgruppe", "Netzwerk", etc.) abfangen kannst.

  • Ich schreibe solche Funktionen meistens auf diese Weise:

    Spoiler anzeigen
    [autoit]

    Func LoadInternationalStrings()
    Local $strOSLang = ""
    If StringRight(@OSLang, 2) = "07" Then
    $strOSLang = "GER"
    Global _
    $str_0001 = "Durchsuchen...", _
    $str_0002 = "Anzahl der am Anfang abzuschneidenden Zeichen", _
    $str_0003 = "Anzahl der am Ende abzuschneidenden Zeichen", _
    $str_0004 = "Suchen nach", _
    $str_0005 = "Ersetzen durch", _
    $str_0006 = "Dateierweiterungen mit einbeziehen", _
    $str_0007 = "Ordner nach dem umbenennen anzeigen", _
    $str_0008 = "Starte umbenennen", _
    $str_0009 = "Wählen sie einen Ordner aus, dessen Dateien sie umbenennen möchten.", _
    $str_0010 = "Benenne ", _
    $str_0011 = " um", _
    $str_0012 = "Sammle Dateien", _
    $str_0013 = "Ein Fehler ist aufgetreten.", _
    $str_0014 = "Das sammeln der Daten ist fehlgeschlagen.", _
    $str_0015 = "Benenne Unterordner um"

    [/autoit] [autoit][/autoit] [autoit]

    Else
    $strOSLang = "ENG"
    Global _
    $str_0001 = "Browse...", _
    $str_0002 = "Count of start digits to trim", _
    $str_0003 = "Count of end digits to trim", _
    $str_0004 = "Find what", _
    $str_0005 = "Replace with", _
    $str_0006 = "Consider file extentions", _
    $str_0007 = "Open directory after renaming", _
    $str_0008 = "Start renaming", _
    $str_0009 = "Choose a direcory which contains the files that you want to rename.", _
    $str_0010 = "Renaming ", _
    $str_0011 = "", _
    $str_0012 = "Collecting files", _
    $str_0013 = "An error has occurred.", _
    $str_0014 = "Collecting files failed", _
    $str_0015 = "Rename sub-directories"
    EndIf
    EndFunc ;==>LoadInternationalStrings

    [/autoit]
    • Offizieller Beitrag

    Achso ja, englisch soll Standard sein. Dann könnte man das auch so machen:

    Spoiler anzeigen
    [autoit]


    Func LoadInternationalStrings()
    Global _
    $str_0001 = "Browse...", _
    $str_0002 = "Count of start digits to trim", _
    $str_0003 = "Count of end digits to trim", _
    $str_0004 = "Find what", _
    $str_0005 = "Replace with", _
    $str_0006 = "Consider file extentions", _
    $str_0007 = "Open directory after renaming", _
    $str_0008 = "Start renaming", _
    $str_0009 = "Choose a direcory which contains the files that you want to rename.", _
    $str_0010 = "Renaming ", _
    $str_0011 = "", _
    $str_0012 = "Collecting files", _
    $str_0013 = "An error has occurred.", _
    $str_0014 = "Collecting files failed", _
    $str_0015 = "Rename sub-directories"
    Switch @OSLang
    Case "0407", "0807", "0c07", "1007", "1407"
    Global _
    $str_0001 = "Durchsuchen...", _
    $str_0002 = "Anzahl der am Anfang abzuschneidenden Zeichen", _
    $str_0003 = "Anzahl der am Ende abzuschneidenden Zeichen", _
    $str_0004 = "Suchen nach", _
    $str_0005 = "Ersetzen durch", _
    $str_0006 = "Dateierweiterungen mit einbeziehen", _
    $str_0007 = "Ordner nach dem umbenennen anzeigen", _
    $str_0008 = "Starte umbenennen", _
    $str_0009 = "Wählen sie einen Ordner aus, dessen Dateien sie umbenennen möchten.", _
    $str_0010 = "Benenne ", _
    $str_0011 = " um", _
    $str_0012 = "Sammle Dateien", _
    $str_0013 = "Ein Fehler ist aufgetreten.", _
    $str_0014 = "Das sammeln der Daten ist fehlgeschlagen.", _
    $str_0015 = "Benenne Unterordner um"
    Case Else
    MsgBox(48, "FileRenamer $FILERENAMER_VERSION$ - Error", "Your system language could not be detected or is not supported.@LF@" & _
    "Laguage has been set to English.@LF@" & _
    "@LF@" & _
    "MS Language code: @OSLang@")
    EndSwitch
    EndFunc ;==>LoadInternationalStrings

    [/autoit]

    Wobei Du vielleicht überlegen solltest, statt der 15 Variablen ($str...) lieber ein Array zu benutzen.

    • Offizieller Beitrag

    Mir geht es oft auch so, dass ich eigene Programme schreibe, weil existierende Software nicht das beinhaltet, was ich möchte.
    Jedoch in diesem Fall gibt es doch eine Software, die noch weit umfangreicher ist als hier gezeigt: MP3TAG
    Die Skriptfunktionen dort drin sind super. So kann man gleichzeitig taggen und umbenennen. :thumbup: