Variable $n ist immer eine andere Zahl

  • Hallo,

    hab ein Tool geschrieben mit dem man viele Dateien auf einmal umbenennen kann. Funktioniert auch, aber die Zahl Hintendran ist komisch.

    Bei mir ist das immer so. Ich nen jetzt ca. 40 Bilder um, dann fängt das so an:
    Skiurlaub_1, Skiurlaub_10, Skiurlaub_11...
    Wenn ich die dann nochma umnenne steht das da:
    Skiurlaub_100, Skiurlaub_101, Skiurlaub_102...
    Und beim dritten mal das:
    Skiurlaub_1000, Skiurlaub_1001, Skiurlaub_1002

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Rename", 153, 231, 652, 344)
    GUISetBkColor(0x808080)
    $Input1 = GUICtrlCreateInput("", 16, 40, 121, 21)
    $Input2 = GUICtrlCreateInput("", 48, 96, 65, 21)
    $Label1 = GUICtrlCreateLabel("Endung ", 56, 72, 44, 17)
    $Label2 = GUICtrlCreateLabel("Pfad zum Ordner ", 40, 8, 86, 17)
    $Button1 = GUICtrlCreateButton("Umbennen", 40, 192, 75, 25, 0)
    $Input3 = GUICtrlCreateInput("", 16, 160, 121, 21)
    $Label3 = GUICtrlCreateLabel("Neuer Name", 48, 128, 64, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $n=1

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad=GUICtrlRead( $Input1 )
    $endung=GUICtrlRead( $Input2 )
    $name=GUICtrlRead( $Input3 )
    $search = FileFindFirstFile($pfad&"\*."&$endung)
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Datei mit der Endung "&$endung&" in "&$pfad&" gefunden")
    Exit
    EndIf
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    _Umbenennen($file)
    $n+=1
    WEnd
    $n=1
    EndSwitch
    WEnd

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

    Func _Umbenennen($sFile)
    FileMove ($pfad&"\"&$sFile, $pfad&"\"&$name&"_"&$n&"."&$endung, 1)
    EndFunc

    [/autoit]
  • also ich weis ja net was du hast, aber bei mir klappt alles perfekt.

    hab zum test in nem ordner 10 .txt dateien.
    Pfad angegeben, endung (txt) und neuen namen (test). Und es wurde alles in test_1, test_2 u.s.w. umbenannt.

  • Also wenn ich mehr als 10 Dateien z.B *.txt anlege und mit Deinem Tool umbenennen lasse
    und ich lasse das Tool 2-3 mal drüber laufen fehlen auf einmal einige Dateien!!!

    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 ! lauffähiges ! Script, 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. ;)

  • das teste ich gleich mal

    --- Edit ---
    Fazit:

    - Anfangs 16 .txt dateien.
    - 5x Umbenannt
    - Alles da
    - 16 .txt dateien kopiert (dadurch verändert sich ja der name)
    - 5x Umbenannt
    - von 32 waren noch 24 da.

    Weis leider net wo da der fehler is... mhh...

    Einmal editiert, zuletzt von Commander21 (26. Februar 2009 um 20:20)

  • Das die Dateien gelöscht werden liegt daran, dass die Sortierung sich beim Umbenennen verändert.

    Die sieht jetzt z.B. so aus.

    testtest_1.txt
    testtest_10.txt
    testtest_11.txt
    testtest_2.txt

    Wenn jetzt die 2. Datei umbenannt wird, in testtest_2.txt, dann wird testtest_2.txt unten überschrieben. Somit wird die Datei gelöscht...
    Du musst überprüfen, dass der Namen beim Umbenennen anders ist, als der aktuelle. Ich hab auch schon versucht, ein Array sortieren zu lassen, das funktioniert leider auch nicht.

    anno2008

  • Nein, es liegt an dem Flag bei FileMove ...

    liegt es nicht.
    Flag 1 ist wichtig, ansonsten werden die Dateien nicht richtig unbenannt.

    Probiert mal das:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <GUIConstantsEx.au3>

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

    $Form1 = GUICreate("Rename", 153, 231, 652, 344)
    GUISetBkColor(0x808080)
    $Input1 = GUICtrlCreateInput("", 16, 40, 121, 21)
    $Input2 = GUICtrlCreateInput("", 48, 96, 65, 21)
    $Label1 = GUICtrlCreateLabel("Endung ", 56, 72, 44, 17)
    $Label2 = GUICtrlCreateLabel("Pfad zum Ordner ", 40, 8, 86, 17)
    $Button1 = GUICtrlCreateButton("Umbennen", 40, 192, 75, 25, 0)
    $Input3 = GUICtrlCreateInput("", 16, 160, 121, 21)
    $Label3 = GUICtrlCreateLabel("Neuer Name", 48, 128, 64, 17)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad = GUICtrlRead($Input1)
    $endung = GUICtrlRead($Input2)
    $name = GUICtrlRead($Input3)

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

    $search = _FileListToArray($pfad, "*." & $endung, 1)
    If @error Then
    MsgBox(0, "Error", "Keine Datei mit der Endung " & $endung & " in " & $pfad & " gefunden")
    Exit
    Else
    $str = StringSplit($search[1], "_")
    If StringTrimRight($search[1], StringLen($str[UBound($str) - 1]) + 1) = $name Then
    MsgBox(0, "Error", "Bitte wähle einen Namen, der sich vom alten Unterscheidet!")
    Else
    For $i = 1 To UBound($search) - 1
    _Umbenennen($search[$i], $i)
    Next
    EndIf
    EndIf
    EndSwitch
    WEnd

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

    Func _Umbenennen($sFile, $count)
    FileMove($pfad & "\" & $sFile, $pfad & "\" & $name & "_" & $count & "." & $endung, 1)
    EndFunc ;==>_Umbenennen

    [/autoit]
  • Also bei mir wird alles richtig umbenannt und nichts gelöscht oder nicht umbenannt, es sei denn die Datei existiert bereits ...

    [autoit]

    Func _Umbenennen ($sFile)
    Return FileMove ($pfad&"\"&$sFile, $pfad&"\"&$name&"_"&$n&"."&$endung, 0)
    EndFunc

    [/autoit]


  • Hab mal ne ordner auswahl dazu gemacht, so muss man net immer den ordner so hinschreiben oder kopiern und einfügen ^^

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Rename", 153, 231, 652, 344)
    GUISetBkColor(0x6671FF)
    $Input1 = GUICtrlCreateInput("", 16, 25, 121, 21)
    $search1 = GUICtrlCreateButton("Suchen", 16, 47, 121, 20)
    $Input2 = GUICtrlCreateInput("", 45, 100, 65, 21)
    $Label1 = GUICtrlCreateLabel("Endung ", 58, 83, 44, 17)
    $Label2 = GUICtrlCreateLabel("Pfad zum Ordner ", 40, 8, 86, 17)
    $Button1 = GUICtrlCreateButton("Umbennen", 40, 192, 75, 25, 0)
    $Input3 = GUICtrlCreateInput("", 16, 152, 121, 21)
    $Label3 = GUICtrlCreateLabel("Neuer Name", 48, 135, 64, 15)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    Global $n=1
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad=GUICtrlRead( $Input1 )
    $endung=GUICtrlRead( $Input2 )
    $name=GUICtrlRead( $Input3 )
    $search = FileFindFirstFile($pfad&"\*."&$endung)
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Datei mit der Endung "&$endung&" in "&$pfad&" gefunden")
    Exit
    EndIf
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    _Umbenennen($file)
    $n+=1
    WEnd
    $n=1
    Case $search1
    GUICtrlSetData($Input1, FileSelectFolder("Ordner wählen", ""))
    EndSwitch
    WEnd
    Func _Umbenennen($sFile)
    FileMove ($pfad&"\"&$sFile, $pfad&"\"&$name&"_"&$n&"."&$endung, 1)
    EndFunc

    [/autoit]
  • Greek hast du den Ordner mal sortiert? :D
    Einfach mal im Ordner F5 drücken.

    Ansonsten Greenhorn, es geht nicht, glaubs mir.
    Nenn deine Dateien mal so:

    dummy_1.txt
    dummy_2.txt
    dummy_3.txt
    dummy_4.txt
    dummy_80.txt

    Es geht nicht, die erste Datei wird gelöscht...

  • Kann ich nicht bestätigen ..., wird korrekt umbenannt in dummy_1 bis dummy_5.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate ("Rename", 153, 231, 652, 344)
    GUISetBkColor (0x808080)
    $Input1 = GUICtrlCreateInput ("", 16, 40, 121, 21)
    $Input2 = GUICtrlCreateInput ("", 48, 96, 65, 21)
    $Label1 = GUICtrlCreateLabel ("Endung ", 56, 72, 44, 17)
    $Label2 = GUICtrlCreateLabel ("Pfad zum Ordner ", 40, 8, 86, 17)
    $Button1 = GUICtrlCreateButton ("Umbennen", 40, 192, 75, 25, 0)
    $Input3 = GUICtrlCreateInput ("", 16, 160, 121, 21)
    $Label3 = GUICtrlCreateLabel ("Neuer Name", 48, 128, 64, 17)
    GUISetState (@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $n=1

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

    While 1

    Switch GUIGetMsg ()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad = GUICtrlRead ( $Input1 )
    $endung = GUICtrlRead ( $Input2 )
    $name = GUICtrlRead ( $Input3 )
    $search = FileFindFirstFile ($pfad&"\*."&$endung)
    If $search = -1 Then
    MsgBox (0, "Error", "Keine Datei mit der Endung "&$endung&" in "&$pfad&" gefunden")
    Exit
    EndIf
    While 1
    $file = FileFindNextFile ($search)
    If @error Then ExitLoop
    _Umbenennen ($file)
    $n += 1
    WEnd
    $n = 1
    EndSwitch
    WEnd

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

    Func _Umbenennen ($sFile)
    Return FileMove ($pfad&"\"&$sFile, $pfad&"\"&$name&"_"&$n&"."&$endung, 0)
    EndFunc

    [/autoit]


    LG
    Greenhorn


  • Ok danke =)

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Rename", 153, 231, 652, 344)
    GUISetBkColor(0x808080)
    $Input1 = GUICtrlCreateInput("", 16, 40, 121, 21)
    $Input2 = GUICtrlCreateInput("", 48, 96, 65, 21)
    $Label1 = GUICtrlCreateLabel("Endung ", 56, 72, 44, 17)
    $Label2 = GUICtrlCreateLabel("Pfad zum Ordner ", 40, 8, 86, 17)
    $Button1 = GUICtrlCreateButton("Umbennen", 40, 192, 75, 25, 0)
    $Input3 = GUICtrlCreateInput("", 16, 160, 121, 21)
    $Label3 = GUICtrlCreateLabel("Neuer Name", 48, 128, 64, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $n=1

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad=GUICtrlRead( $Input1 )
    $endung=GUICtrlRead( $Input2 )
    $name=GUICtrlRead( $Input3 )
    $search = FileFindFirstFile($pfad&"\*."&$endung)
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Datei mit der Endung "&$endung&" in "&$pfad&" gefunden")
    Exit
    EndIf
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    _Umbenennen($file)
    $n+=1
    WEnd
    $n=1
    EndSwitch
    WEnd

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

    Func _Umbenennen($sFile)
    FileMove ($pfad&"\"&$sFile, $pfad&"\"&$name&"_"&$n&"."&$endung, 0)
    EndFunc

    [/autoit]

    Aber versteht jetzt nicht warum $n am anfang 1-40 macht und beim zweiten durchlauf 101-140 und dann 1001-1040.

    Weis das einer? Ich hab ja $n deklariert und eigentlich sollte es sich wieder auf 1 setzen.

  • Lol nach den paar stunden schon?
    Ich vermute einfach, dass er an den vorhandenen Dateinamen einfach die Zahlen hinhängt. Ich weiß nicht ob du es schon gemacht hast, aber lass doch einfach mal alle Zahlen im Dateinamen entfernen.

    Padmak

    Edit:
    Ja genau machs so. Einfach per _StringBetween($pfad & $file, "_", $endung) oder so ähnlich. Musst halt anpassen

    Padmak

  • Ich habs jetzt raus, wie auch meine Funktion funktioniert:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Rename", 153, 231, 652, 344)
    GUISetBkColor(0x808080)
    $Input1 = GUICtrlCreateInput("", 16, 40, 121, 21)
    $Input2 = GUICtrlCreateInput("", 48, 96, 65, 21)
    $Label1 = GUICtrlCreateLabel("Endung ", 56, 72, 44, 17)
    $Label2 = GUICtrlCreateLabel("Pfad zum Ordner ", 40, 8, 86, 17)
    $Button1 = GUICtrlCreateButton("Umbennen", 40, 192, 75, 25, 0)
    $Input3 = GUICtrlCreateInput("", 16, 160, 121, 21)
    $Label3 = GUICtrlCreateLabel("Neuer Name", 48, 128, 64, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $n=1
    Global Const $j=1

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad=GUICtrlRead( $Input1 )
    $endung=GUICtrlRead( $Input2 )
    $name=GUICtrlRead( $Input3 )
    $search = FileFindFirstFile($pfad&"\*."&$endung)
    If $search = -1 Then
    MsgBox(0, "Error", "Keine Datei mit der Endung "&$endung&" in "&$pfad&" gefunden")
    Exit
    EndIf
    $n=$j
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    _Umbenennen($file)
    $n+=1
    WEnd
    $n=$j
    EndSwitch
    WEnd

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

    Func _Umbenennen($sFile)
    FileMove ($pfad&"\"&$sFile, $pfad&"\"&$name&"_"&$n&"."&$endung, 0)
    EndFunc

    [/autoit]

    Versteh jetzt aber trotzdem nicht, wenn ich $n auf 1 setze müsste es eigentlich auch Funktionieren.

  • Er hängt einfach die Zahl an den Dateinamen an wenn ich das richtig sehe. Du musst als erstes alle Zahlen nach dem _ entfernen...

    Padmak