• neue Version, mit verbessertem Algorithmus und Zählervariable %n.
    Dieses Projekt ist aus aktuellem Anlass für mich entstanden, ich musste 30 .caf-Dateien in .aif-Dateien umbenennen. Deshalb dies:
    Ein Tool zum Umbenennen von Dateien.
    Nicht alle Buttons bzw. Checkboxes/Inputs haben schon die Funktion, aber man kann schon massenhaft Dateien umbenennen, mit Suchen/Ersetzen und Dateiendung ersetzen.

    Todo


    Zählervariable
    Outputusability
    Ext.-anhängen


    Hoffe, es gefällt.
    /edit: Jetzt mit Code ;)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #Region Globals
    Global $oldFILETYPE
    #EndRegion Globals
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("RenamR", 588, 432, 193, 125)
    $Input = GUICtrlCreateGroup("Input", 8, 80, 569, 161)
    $inputINPUT = GUICtrlCreateInput("", 64, 200, 401, 21)
    $inputdirBUTTON = GUICtrlCreateButton("Ordner wählen...", 16, 104, 137, 33, 0)
    $filetypeCHECK = GUICtrlCreateCheckbox("Dateityp:", 216, 96, 160, 17)
    ;~ $Label5 = GUICtrlCreateLabel("Dateityp:", 232, 96, 144, 17)
    $filetypeINPUT=GUICtrlCreateInput("", 384, 96, 180, 21)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Output = GUICtrlCreateGroup("Output", 8, 256, 569, 161)
    ;~ $outputdirBUTTON = GUICtrlCreateButton("Ordner wählen...", 16, 280, 129, 33, 0)
    $outputINPUT = GUICtrlCreateInput("%1", 72, 384, 393, 21)
    $replaceCHECK = GUICtrlCreateCheckbox("", 168, 272, 17, 17)
    $replaceINPUT = GUICtrlCreateInput("", 240, 272, 97, 21)
    $Label1 = GUICtrlCreateLabel("mit", 344, 272, 25, 17)
    $withINPUT = GUICtrlCreateInput("", 384, 272, 145, 21)
    ;~ $countCHECK = GUICtrlCreateCheckbox("", 168, 312, 17, 17)
    $Label2 = GUICtrlCreateLabel("Ersetze", 184, 272, 39, 17)
    $Label3 = GUICtrlCreateLabel("Zählervariable %n; Start:", 186, 314, 122, 17)
    $startINPUT = GUICtrlCreateInput("", 320, 312, 25, 21)
    $Label4 = GUICtrlCreateLabel("Stellen:", 360, 312, 39, 17)
    $stellenINPUT = GUICtrlCreateInput("", 408, 312, 33, 21)
    $Dateiendung = GUICtrlCreateLabel("Dateiendung", 192, 344, 65, 17)
    $postfixreplaceCHECK = GUICtrlCreateRadio("ersetzen", 280, 336, 65, 17)
    $postfixappendCHECK = GUICtrlCreateRadio("anhängen", 280, 352, 65, 17)
    $postfixINPUT = GUICtrlCreateInput("", 360, 344, 49, 21)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $startBUTTON = GUICtrlCreateButton("Umbenennen starten", 392, 16, 177, 49, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    GUIRegisterMsg($WM_COMMAND,"_update")
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $inputINPUT
    Case $inputdirBUTTON
    _SetDir($inputINPUT)
    Case $filetypeCHECK
    If GUICtrlRead($filetypeCHECK) = $GUI_CHECKED Then
    _SetParams()
    Else
    GUICtrlSetData($filetypeINPUT,"")
    _SetParams()
    EndIf
    ;~ Case $outputdirBUTTON
    ;~ _SetDir($outputINPUT)
    Case $outputINPUT
    Case $replaceCHECK
    Case $replaceINPUT
    Case $withINPUT
    ;~ Case $countCHECK
    Case $startINPUT
    Case $stellenINPUT
    Case $Dateiendung
    Case $postfixreplaceCHECK
    Case $postfixappendCHECK
    Case $postfixINPUT
    Case $startBUTTON
    _RenderRename()
    EndSwitch
    WEnd
    Func _SetDir($hHandle)
    Local $params
    $old=GUICtrlRead($hHandle)
    $folder=FileSelectFolder("Ordner auswählen","")
    If not FileExists($folder) Then Return
    If $old <> "" Then
    $bspos=StringInStr($old,"\",Default,-1)
    $params=StringTrimLeft($old,$bspos)
    EndIf
    If StringRight($folder,1) <> "\" Then $folder=$folder & "\"

    Switch $hHandle
    Case $inputINPUT
    If $params="" Then $params="*.*"
    ;~ Case $outputINPUT
    ;~ If $params="" Then $params="%1"
    EndSwitch
    $folder=$folder & $params
    GUICtrlSetData($hHandle,$folder)
    EndFunc
    Func _update()
    ;~ TrayTip("","Command",1)
    If $oldFILETYPE <> GUICtrlRead($filetypeINPUT) And GUICtrlRead($filetypeCHECK) = $GUI_CHECKED Then _SetParams()
    $oldFILETYPE=GUICtrlRead($filetypeINPUT)
    EndFunc
    Func _SetParams()
    $filetype=GUICtrlRead($filetypeINPUT)
    $old=GUICtrlRead($inputINPUT)
    $bspos=StringInStr($old,"\",Default,-1)
    $params=StringTrimLeft($old,$bspos)
    ;~ MsgBox(0,"",$params)
    $prefix=StringLeft($params,StringInStr($params,".",Default,-1)-1);TrimRight
    If $prefix="" Then $prefix=$params
    ;~ MsgBox(0,"",$prefix)
    $folder=StringLeft($old,$bspos)
    If $filetype="" Then $filetype="*"
    ;~ MsgBox(0,"",$prefix & "." & $filetype)
    GUICtrlSetData($inputINPUT,$folder & $prefix & "." & $filetype)
    EndFunc
    Func _RenderRename()
    Local $boolReplace=False, $boolPostfixReplace=False,$boolPostfixAppend=False
    $data=GUICtrlRead($inputINPUT)
    $bspos=StringInStr($data,"\",Default,-1)
    $params=StringTrimLeft($data,$bspos)
    $folder=StringLeft($data,$bspos)
    $FILES_OLD=_FileListToArray($folder,$params,1)
    _ArrayDisplay($FILES_OLD)
    If GUICtrlRead($replaceCHECK) = $GUI_CHECKED Then $boolReplace=True
    If GUICtrlRead($postfixreplaceCHECK) = $GUI_CHECKED Then $boolPostfixReplace=True
    If GUICtrlRead($postfixappendCHECK) = $GUI_CHECKED Then $boolPostfixAppend=True
    $rep=GUICtrlRead($replaceINPUT)
    $with=GUICtrlRead($withINPUT)
    $startCOUNT=GUICtrlRead($startINPUT)-1
    If $startCOUNT = -1 Then $startCOUNT = 0
    $stellenCOUNT=GUICtrlRead($stellenINPUT)
    If $stellenCOUNT = "" Then $stellenCOUNT = "-"
    For $COUNTER=1 To $FILES_OLD[0] Step 1
    $postfixorig=StringTrimLeft($FILES_OLD[$COUNTER],StringInStr($FILES_OLD[$COUNTER],".",Default,-1))
    $newname=GUICtrlRead($outputINPUT)
    $newname=StringReplace($newname,"%1",$FILES_OLD[$COUNTER])
    $newname=StringReplace($newname,"%e",$postfixorig)
    If $boolReplace Then $newname=StringReplace($newname,$rep,$with)
    $newname=StringReplace($newname,"%n",StringFormat("%0" & $stellenCOUNT & "d",$COUNTER+$startCOUNT))
    If $boolPostfixReplace Then $newname=_ReplacePostfix($newname,GUICtrlRead($postfixINPUT))
    If $boolPostfixAppend Then $newname &= GUICtrlRead($postfixINPUT)
    FileMove($folder & $FILES_OLD[$COUNTER],$folder & $newname)
    ;~ MsgBox(64,$folder & $FILES_OLD[$COUNTER],$folder & $newname)
    Next
    MsgBox(0,"RenamR","Alle Dateien wurden umbenannt")
    EndFunc
    Func _toggle($hHandle)
    If $hHandle = $GUI_CHECKED Then
    GUICtrlSetData($hHandle,$GUI_UNCHECKED)
    Else
    GUICtrlSetData($hHandle,$GUI_CHECKED)
    EndIf
    EndFunc
    Func _ReplacePostfix($string,$postfix)
    If not StringinStr($string,".") Then return $string & "." & $postfix
    Return StringLeft($string,StringInStr($string,".",Default,-1)-1) & "." & $postfix
    EndFunc

    [/autoit]

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    3 Mal editiert, zuletzt von L3viathan2142 (11. Mai 2009 um 23:42)

  • Die gleiche frage könnt ich dir mit den Dateien auch fragen - es ist nun mal möglich dass man dass braucht..

  • cooles Tool :thumbup:
    Ich hab auch oft hunderte serien umzubenennen, also avi,mkv usw. da hat ein file schon mal 300mb, und du nennst die files ja quasi mit copy/paste um :S
    Das ist langsam und ziemlich unsicher :D

    Versuchs mal damit:

    [autoit]


    $oShell = ObjCreate("Shell.Application")
    $oFolder = $oShell.NameSpace($folder);<- $folder pfad zum ordner
    $oFolderItems = $oFolder.Items
    $items = $oFolderItems.Count ;<- anzahl der elemente im ordner
    $oFolderItem = $oFolderItems.Item($index)
    $oFolderItem.Name = "NAME"

    [/autoit]

    zwar bisschen mehr code aber viel performanter als FileMove :thumbup:


  • zwar bisschen mehr code aber viel performanter als FileMove :thumbup:


    Ich denkne nicht, dass das schneller ist. FileMove führt eine Verschieben-Aktion aus und nicht Copy/Paste/Delete. Und verschieben ist denkne ich dann gleich wie umbenennen. Es gibt ja auch keine RenameFile-API-Funktion ;)
    //Edit: Es gibt doch was, aber ob das schneller ist?

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _FileRename($File, $NewName, $shell32dll = "shell32.dll")
    ; Prog@ndy
    Local Const $tagSHFILEOPSTRUCT = "HWND hwnd; UINT wFunc; ptr pFrom; ptr pTo; DWORD fFlags; int fAnyOperationsAborted; ptr hNameMappings; ptr lpszProgressTitle;"
    Local Const $FO_RENAME = 0x4
    Local $stFile = DllStructCreate("wchar[" & StringLen($File)+2 & "]")
    Local $stName = DllStructCreate("wchar[" & StringLen($NewName)+2 & "]")
    DllStructSetData($stFile,1,$File)
    DllStructSetData($stName,1,$NewName)
    $stSHFILEOPSTRUCT = DllStructCreate($tagSHFILEOPSTRUCT)
    DllStructSetData($stSHFILEOPSTRUCT, 2, $FO_RENAME); pFrom
    DllStructSetData($stSHFILEOPSTRUCT, 3, DllStructGetPtr($stFile)); pFrom
    DllStructSetData($stSHFILEOPSTRUCT, 4, DllStructGetPtr($stName)); pTo
    Return _SHFileOperation(DllStructGetPtr($stSHFILEOPSTRUCT), $shell32dll)
    EndFunc

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

    Func _SHFileOperation($lpSHFILEOPSTRUCT, $shell32dll = "shell32.dll")
    ; Prog@ndy
    Local $aResult = DllCall($shell32dll, "int", "SHFileOperationW", "ptr", $lpSHFILEOPSTRUCT)
    If @error Then Return SetError(1,0,0)
    Return $aResult[0]
    EndFunc

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

    $shell32dll = DllOpen("shell32.dll")
    _FileRename(@DesktopDir&"\1.htm", @DesktopDir&"\2.htm", $shell32dll)

    [/autoit]

    Einmal editiert, zuletzt von progandy (10. Mai 2009 um 17:45)

  • FileMove ist Ausschneiden also copy,delete,past :D

    ja, das was du da gepostet hast ist nur eine schöner gecodede version von dem was ich oben geschrieben habe, ist auf jeden fall schneller, da es ja direkz über windows shell abläuft :)

  • Neue Version, jetzt geht auch die Zählervariable... (Post #1)
    Das mit dem FileMove lass ich erstmal drin. @ragefire: Beim Umbenennen stört dieses "Cut&Paste"-Prinzip nicht, da die Daten auf der selben Partition liegen, und somit gar kein "physikalischer" Move-Vorgang durchgeführt wird.

    edit: Sorry, dass ich so langsam geantwortet hab, ich muss mir mal das abonnieren sämtlicher Threads von mir automatisieren... ;)

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.