Wird die Schleife nur einmal durchlaufen?

  • Hi,
    hab mal wieder ein kleines Problem. Für euch Profis sicher nur ein Problemchen :rofl:.

    Ich nutze das Datensicherungsprogramm Backer 6.6.
    Mit ihm kann ich Datensicherungen in einen Ordner erstellen. Dieser Ordner wird dann mit dem aktuellen Datum versehen.


    Für dieses Tool habe ich nun ein "Zusatz-Tool" geschrieben.

    Dieses benennt mir einen von mir gewählten Ordner mit älterem Datum in einen Ordner mit heutigem Datum um.

    Ist für das Script nicht unbedingt wichtig, nur damit ihr wisst um was es grob geht.


    Nun zu meinem Problem.

    Ich habe im Backer 3 solcher Sicherungsprofile.
    Mein Script durchläuft eine Schleife und prüft welches dieses 3 Profile gewählt wurde.
    Je nachdem welches gewählt wurde, wird dann der Zielordner anders gewählt.

    Wenn ich ein Profil auswähle, wählt mein Script den richtigen Ordner aus.
    Wenn ich dies wiederhole klappt es auch.
    Wenn ich jedoch ein anderes Profil (also ein anderes Element $i der Schleife) auswähle, bleibt der Ordner bestehen, obwohl sich dieser eigentlich ändern müßte.
    Nun ist meine Frage, warum dies nicht klappt ?(

    Hier mein Script:

    Spoiler anzeigen
    [autoit]

    ;------------------------------------------------------------------------------------------------------------------------------------
    ;Dieses Script ist bei der Anwendung des Backers hilfreich.
    ;Soll einen neue Sicherung angelegt werden, so bietet sich folgende Möglichkeit:
    ;Vor der Anwendung des Backers ein altes Verzeichnis mit Sicherungsdatum umbenennen in ein Verzeichnis mit heutigem Datum.
    ;Damit sichert Backer nicht die geänderten Daten. Dies bringt eine Zeitersparnis.

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

    ;Jedesmal den Ordner im Explorer umzubenennen ist jedoch umständlich. Deshalb dieses Tool.
    ;Einfach über dieses Tool den Backer starten und ganz normal mit dem Backer arbeiten.
    ;Den Rest erledigt dieses Script im Hindergrund.

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

    ;Es gibt drei Buttons
    ;"umbenennen" = Es muß ein Ordner ausgewählt werden. Dieser wird dann in das heutige Datum umbenannt.
    ;"zurueck" = Falls aus Versehen auf das falsche Backer-Profil geklickt wurde, kommt man hier wieder zurück.
    ;"neuer Ordner" = Es wird ein neuer, zusätzlicher Ordner mit dem heutigen Datum erstellt.
    ;------------------------------------------------------------------------------------------------------------------------------------

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

    #Include <Date.au3>
    #include <GuiListView.au3>
    #include <GuiList.au3>
    #include <GUIConstants.au3>
    #Include <Array.au3>
    #Include <File.au3>

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

    Dim $FileList2

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

    Opt("WinTitleMatchMode", 2)

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

    ;Tastenkombination zum Beenden des Backers und dieses Scripts
    HotKeySet("^y", "_beenden")

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

    ;Anzahl der vorhandenen Backer .bac Dateien mit Sicherungsordnung mit Datum
    $start = 0 ;Der Start-Wert ist die Zahl des ersten Ordners (immer 0)
    $ende = 2 ;Der Ende-Wert ist die Zahl des letzten Ordners (siehe unbedingt anpassen) < < < < < < < < < < < < < < < < < < ändern > > > > > > > > > > > > > > > > > > >

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

    Dim $Sicherungsdatei[$ende+1]
    Dim $Pfad[$ende+1]

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

    ;unbedingt anpassen, nicht benötigte Einträge deaktivieren mit ;
    $Sicherungsdatei[0] = "Daten" ;Name des Backer Profils (ohne.bac)
    $Sicherungsdatei[1] = "Internet" ;Name des Backer Profils (ohne.bac)
    $Sicherungsdatei[2] = "Peter" ;Name des Backer Profils (ohne.bac)
    $Pfad[0] = "N:\Datensicherung\Daten\" ;Ordner der Sicherungen
    $Pfad[1] = "N:\Datensicherung\Internet\" ;Ordner der Sicherungen
    $Pfad[2] = "N:\Datensicherung\Peter\" ;Ordner der Sicherungen

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

    ;Startdatei vom Backer
    $backer = "N:\Backer\Backer6.exe"

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

    ;---------------------- A B H I E R K E I N E A N P A S S U N G M E H R N Ö T I G ------------------------------------

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

    ;GUI erstellen
    GUICreate("umbenennen", 230, 450)
    $umbenennen = GUICtrlCreateButton("umbenennen", 15, 390, 50, 50, $BS_ICON)
    $zurueck = GUICtrlCreateButton("zurück", 90, 390, 50, 50, $BS_ICON)
    $ohne = GUICtrlCreateButton("neuer Ordner", 165, 390, 50, 50, $BS_ICON)
    GUICtrlSetImage ($umbenennen, "shell32.dll", 146)
    GUICtrlSetImage ($zurueck, "shell32.dll", 27)
    GUICtrlSetImage ($ohne, "shell32.dll", 205)
    GUICtrlCreateLabel("umbenennen", 8, 365, -1, -1, $SS_CENTERIMAGE)
    GUICtrlCreateLabel("zurück", 99, 365, -1, -1, $SS_CENTERIMAGE)
    GUICtrlCreateLabel("neuer Ordner", 158, 365, -1, -1, $SS_CENTERIMAGE)

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

    $listview = GUICtrlCreateListView("Bild", 75, 60, 80, 300, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_SORTDESCENDING, $LVS_SINGLESEL));$LVS_SORTDESCENDING ;$LVS_SORTASCENDING
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($listview, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    _GUICtrlListViewSetColumnWidth($listview, 0, 75)

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

    Dim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount($listview)]
    _GUICtrlListViewSort($listview, $B_DESCENDING, 1)

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

    ;-------------------------------------------------------------------------------------------------------------------------------------------------

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

    ;Backer starten und warten bis er geladen wurde
    Run($backer)
    WinWait("<unbenannt>.bac - Backer 6")

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

    ;-------------------------------------------------------------------------------------------------------------------------------------------------

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

    ;Aktionen während der Hauptbildschirm vom Backer da ist
    While 1
    For $i = $start to $ende
    Select
    Case WinExists($Sicherungsdatei[$i] & ".bac - Backer 6")
    GUICtrlCreateLabel(" ", 75, 10, 80, -1, $SS_CENTERIMAGE)
    GUICtrlSetBkColor(-1, 0xFFD700)
    GUICtrlSetData (-1, $Sicherungsdatei[$i])
    GUICtrlCreateLabel(" ", 75, 30, 80, -1, $SS_CENTERIMAGE)
    GUICtrlSetBkColor(-1, 0xFFD700)
    GUICtrlSetData (-1, StringReplace(_NowCalcDate(), "/", "."))
    Sleep(50)
    _aendern()

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

    Case NOT WinExists("Backer 6")
    Exit
    EndSelect
    Next
    WEnd

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

    ;Prüfung, ob der heutige Ordner bereits exisitert
    Func _aendern()
    If NOT FileExists($Pfad[$i] & StringReplace(_NowCalcDate(), "/", ".")) Then
    WinWait($Sicherungsdatei[$i] & ".bac - Backer 6", "Abbrechen")
    Send("{ENTER}")
    WinWait("Zusammenfassung - " & $Sicherungsdatei[$i] & ".bac - Backer 6", "&OK")
    Send("{ENTER}")
    _GUICtrlListViewDeleteAllItems ($listview) ;alle Einträge im ListView löschen
    _eintragen()

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $umbenennen ;Button zum umbenennen
    _umbenennen()

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

    Case $msg = $zurueck ;Button zum verlassen der GUI
    _zurueck()
    ExitLoop

    Case $msg = $ohne ;Button: neuer Ordner anlegen und kopieren
    DirCreate($Pfad[$i] & StringReplace(_NowCalcDate(), "/", "."))
    Sleep(50)
    _zurueck()
    ExitLoop

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

    Case $msg = $GUI_EVENT_CLOSE
    _zurueck()
    ExitLoop
    EndSelect
    WEnd
    Else
    EndIf
    EndFunc

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

    ;Vorhandene Ordner in die ListView eintragen
    Func _eintragen()
    GUIsetState(@SW_SHOW)

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

    $FileList2 = _FileListToArray($Pfad[$i], "*", 2)
    _ArraySort($FileList2, 1)
    ;~ _ArrayDisplay($FileList2,"$test1")

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

    For $i = 1 To UBound($FileList2)-1
    GUICtrlCreateListViewItem($FileList2[$i], $listview)
    Next
    EndFunc

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

    ;Ordner ausgewählt, dann diesen in das aktuelle Datum umbenennen
    Func _umbenennen()
    Local $list = _GUICtrlListViewGetSelectedIndices($listview, 1)
    If _GUICtrlListViewGetSelectedCount($listview) = 0 Then ;Prüfung, ob 1 Eintrag ausgewählt ist
    MsgBox(64,"Keine Dateien markiert", "Bitte markieren Sie die zu kopierenden Dateien")
    Else
    If (IsArray($list)) Then
    Local $k
    ;~ _ArrayDisplay($list,"$test")
    For $k = 1 To $list[0]
    DirMove($Pfad[$i] & $FileList2[$list[$k]+1], $Pfad[$i] & StringReplace(_NowCalcDate(), "/", "."), 1)
    Next
    _zurueck()
    EndIf
    EndIf
    EndFunc

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

    ;zum Backer zurückkehren
    Func _zurueck()
    GUIsetState(@SW_HIDE)
    If FileExists($Pfad[$i] & StringReplace(_NowCalcDate(), "/", ".")) Then
    WinWait($Sicherungsdatei[$i] & ".bac - Backer 6")
    Send("{ENTER}")
    EndIf
    EndFunc

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

    ;-------------------------------------------------------------------------------------------------------------------------------------------------

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

    ;Bei drücken der Tastenkombination wird der Backer und dieses Script beendet
    Func _beenden()
    Winclose("Backer 6")
    Exit
    EndFunc

    [/autoit]

    Die "Funktionsweise"
    Ich drücke das Backer-Profil "Daten"
    Nun wird durch die (fehlerhafte ???) Schleife der Eintrag ausgewählt
    Dann kommt die GUI
    Dann wird die Funktion _aendern gestartet
    In _aendern wird u. a. die ListeView geleert
    Ich drücke den Button "zurueck"
    Dadurch wird die Funktion _zurueck gestartet
    Dadurch wird die GUI versteckt und man gelangt zum Backer zurück.

    Achso nochwas: Dies ist kein Problem des Backers. Es muss an meinem Script liegen :tongue:

    Hoffe es wird einigermaßen klar was ich meine

    Danke :D

  • schaut auf den ersten blick ganz gut aus.....wie meger schon gesagt hat....benutz console write oder msgbox(stresst ein wenig) aber hilft auch das prog zu debuggen....

    der snoozer

  • hm, also soweit ich dies sagen kann, stimmt das Script.
    Wenn ich bei der ersten while-Schleife (ab 93) ein ConsoleWrite reinmache, erscheint der Pfad zweimal.
    Einmal ist richtig. Das zweite Mal ist falsch.

    Das Problem ist folgendes:
    Wenn ich ein Baker-Profil starte hat dies den Namen "Daten.bac..."
    Wenn ich anschließend zum Hauptprogramm zurückkehre hat dieses genau den gleichen Titel.

    Da ich nun in der ersten While-Schleife (ab 93) gesagt habe, dass die Schleife durchlaufen werden soll, wenn "Daten.bac..." erscheint, wird die Schleife nochmal durchlaufen. :rolleyes:
    Dies ist aber falsch.

    Ich habe schon probiert den Titel des Hauptprogramm umzubenennen, was auch klappt, aber leider läuft es immer noch nicht.


    Hm, es will einfach nicht,
    habs noch mit der "class" des Titels probiert aber es will nicht

    [autoit]

    Opt("WinTitleMatchMode", 4)
    WinWait("classname=TMainWnd"))

    [/autoit]


    Es will einfach nicht.
    Kann wer mal schauen, ob ich die Schleife bereits verlassen habe?

    Danke :P

  • bastel doch einfach eine globale variable...

    [autoit]

    Global $schleife_durchlaufen

    [/autoit]


    diese ist standartmäßig true (wahr)...sobald jetzt die schleife durchlaufen wurde also der titel des fensters gesetzt wurde wird diese variable false (unwahr) => If $schleife_durchlaufen Then........was simpleres fällt mir grad nicht ein.....nätrürlich kannste titel des fenstern mit einbasteln...damit wenn du ein anderes projekt startest gar nichts mehr passiert da die schleife bereits durchgelaufen ist....


    der snoozer

    PS:schneller als pee...:P

  • verstehs nicht so ganz
    Also dann wird die Schleife nur einmal durchlaufen.

    Und wenn ich dann ein anderes Backer-Profil mit einer anderen [$i] starte.
    Geht dies dann?

  • ...deswegen war auch auch mein vorschlag den titel mit in die abfrage einzubasteln....sprich If $schleife_durchlaufen Or ($title = _ArraySearch ($previos_titles,$current_title))...oder sowas in der art......
    müsste doch eigentlich gehen??ôÔ wo haste denn die abfragen eingebaut??

  • EDIT: So das wird nix, es wird nicht funktionieren, wie ich es vorhabe.
    Muß alles komplett umwerfen und neu schreiben mit einer eigenen GUI.

    Trotzdem DANKE :tongue:


    Kurze Frage noch
    Ich muß ein .bac Datei öffnen. Durch diese .bac öffnet sich dann das Hauptprogramm. Wenn sie geöffnet ist, soll das Script weiterarbeiten.
    Wenn ich diese mit RUN öffne geht es, aber es erscheint das DOS Fenster, welches ich wegklicken lassen

    [autoit]

    Run(@COMSPEC & " /c " & $Dateipfad[$i], "", @SW_SHOW)
    Winwait("C:\WINDOWS\system32\cmd.exe")
    WinClose("C:\WINDOWS\system32\cmd.exe")
    msgbox(0,"", Winexists($Sicherungsdatei[$i] & ".bac - Backer 6"))
    WinWait($Sicherungsdatei[$i] & ".bac - Backer 6")
    WinActivate($Sicherungsdatei[$i] & "bac - Backer 6")

    [/autoit]

    Wenn ich es mit _RUNDOS probiert wird kein DOS Fenster geöffnet, aber es bleibt stehen, bevor die msgbox kommt. Warum?

    [autoit]

    _Rundos(@COMSPEC & " /c " & $Dateipfad[$i])
    msgbox(0,"", Winexists($Sicherungsdatei[$i] & ".bac - Backer 6"))
    WinWait($Sicherungsdatei[$i] & ".bac - Backer 6")
    WinActivate($Sicherungsdatei[$i] & "bac - Backer 6")

    [/autoit]

    EDIT: Hat sich erledigt.
    Hab gesehen, dass es noch ShellExecute gibt. Damit klappts :D