Window Abfrage via While

  • Hallo!
    Auch mich hat das AutoIT-Fieber gepackt und ich bin momentan auch fleißig am scripten ;)
    Jetzig bin ich an einer Automatisierten IP-Cop Konfiguration beschäftigt und stieß nun auf folgende Problematik:

    Mein Problem bezieht sich auf die Zeilen 23 - 29. Die While, in der (während des Anmeldevorgangs) überprüft werden soll, ob ein Window mit dem Titel "Passwort - " & "root@" & $dir[6]" auftaucht. Es soll Kompatibel mit auch älteren Rechnern sein (diese würden wahrscheinlich längere Ladezeiten haben, als mein Testrechner) daher kann ich nicht einfach ein sleep() anstatt eine Schleife benutzen.
    Die Frage bzw. das Problem ist folgende:
    Er führt die While zu kurz aus, da ich ja schon $tmp_while_pwdcheck auf 0 setze und somit die While gekillt ist. Sollte es also ein langsamer Rechner sein, setzt er die While zu früh auf 0 und überprüft demnach nichtmehr, ob das Fenster auftaucht. Wie kann ich es (besser) realisieren, dass ich bis zum erfolgreichen Anmelden eine Überprüfung auf das genannte Fenster mache?

    Vielen Dank im Vorraus,
    MfG
    Wiibrew

    Spoiler anzeigen
    [autoit]

    ;WinSCP Konfiguration
    Func WinSCP_Config()
    ;Aufbau/Speicherung des Pfadnamens (zur Identifizierung des StandortConfigs)
    $dir[3] = $dir[0] & GUICtrlRead (3)

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

    ;Auslesen und speicherung sowie entschlüsselung des Passwortes des Standortes
    ;;StringEncrypt(0, ...) Entschlüsselt den IniEintrag aus $dir[3] aus der Sektion "PWD" des Eintrages "WinSCP"
    ;;;StringReverse dreht die Reihenfolge des IniEintrages aus $dir[3] der Sektion "PWD" des Eintrages "WinSCP" wieder um.
    ;;;;;;$dir[5] = FileReadLine($dir[3] & "\login.txt")
    $dir[5] = _StringEncrypt(0, _StringReverse(IniRead($dir[3] & "\" & GUICtrlRead (3) & ".ini", "PWD", "WinSCP", "Fehler beim Lesen der INI")), _StringReverse(IniRead($dir[3] & "\" & GUICtrlRead (3) & ".ini", "PWD", "Key", "Fehler beim Lesen der INI")))

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

    ;Auslesen/Zwischenspeicherung der IP des IPCops
    $dir[6] = IniRead($dir[3] & "\" & GUICtrlRead (3) & ".ini", "IP", "Proxy", "Fehler beim Lesen der INI")

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

    WinWaitActive("WinSCP Anmeldung")
    ;Konfigurieren der Zugansdaten zum IPCop-Datentransfer
    send($dir[6] & "{TAB}" & "root" & "{TAB}" & $dir[5] & "{TAB}" & "222")
    sleep(100)
    ;Verbindungsaufbau zum IP-Cop
    send("{ENTER}")

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

    ;Bei falschem Passwort, Aufforderung zur Überprüfung der Daten
    $tmp_while_pwdcheck = 1
    while $tmp_while_pwdcheck >= 1
    if WinExists("Passwort - " & "root@" & $dir[6]) == 1 Then
    MsgBox(0,"Fehler bei der Anmeldung","Logindaten fehlerhaft. Fehler bei der Anmeldung.")
    EndIf
    $tmp_while_pwdcheck = 0
    WEnd
    WinWaitActive("root - root@" & $dir[6] & " - WinSCP")
    ;MsgBox(0, $tmp_while_pwdcheck & "-" & $dir[6])
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Wiibrew (21. August 2008 um 10:24)

  • Was möchtest du machen? Wenn das Fenster Passwort auftauch (in dem wohl sowas wie Passwort incorrect steht oder so???) möchtest du eine Fehlermeldung rausgeben oder wie?
    Hmm das Problem ist halt, du willst quasi auf ein Fenster solange warten bis es exisiert, andererseits ist es ja sehr wahrscheinlich das es nie existiert da der user das PW ja richtig eingibt. Somit ist eine Schleife mist, du wirst wohl nicht um ein Sleep herumkommen... Die elegantere Lösung zu sleep ist halt WinWait("deinfenster", "enthaltenertext", TIMEOUT)
    durch das timeout kannst du bestimmen wie lange gewartet wird ob das fenster existiert oder nicht ich schätze mal mit 2000 => 2 sec müsstest du ganz gut hinkommen, auch bei älteren rechnern

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    • Offizieller Beitrag

    Erstmal etwas grundsätzliches zur While-Schleife: Es wird am Anfang der Schleife geprüft, dass heißt solange die Bedingung zutrifft, wird die Schleife ausgeführt. Trifft die Bedingung allerdings nicht zu, wird die Schleife kein einziges Mal durchlaufen.
    Auf Dein Script bezogen heißt das, dass die Anweisung "$tmp_while_pwdcheck = 1" die While-Schleife ausschaltet. Andererseits hast Du innerhalb der While-Schleife "$tmp_while_pwdcheck = 0" gesetzt. Das würde (wenn die Schleife durchlaufen würde), nicht zu einem Abbruch der Schleife führen, denn die While-Bedingung lautet ja "größer/gleich Eins". Null ist keins von beiden. ;)

    Ich würde die Schleife allerdings lieber zeitabhängig gestalten:

    [autoit]


    $Timer = TimerInit()
    While TimerDiff($Timer) < 1000 ; die Schleife wird 1000ms lang durchlaufen
    If WinExists("Passwort - " & "root@" & $dir[6]) = 1 Then
    MsgBox(0,"Fehler bei der Anmeldung","Logindaten fehlerhaft. Fehler bei der Anmeldung.")
    EndIf
    Sleep(10) ; Prozessorlast verringern
    WEnd

    [/autoit]
  • FireFlyer
    Genau das ist das Problem, welches ich momentan habe. Danke für die Antwort. Also werde ich es Zeitbasiert machen.

    Oscar

    Zitat

    Auf Dein Script bezogen heißt das, dass die Anweisung "$tmp_while_pwdcheck = 1" die While-Schleife ausschaltet. Andererseits hast Du innerhalb der While-Schleife "$tmp_while_pwdcheck = 0" gesetzt.

    Mit "$tmp_while_pwdcheck = 1" schalte ich die While ja gerade ein, sodass er Prüft, wenn $tmp_while_pwdcheck gleich 1 ist, soll er die While ausführen. Und damit es nicht in einer Endlosschleife endet, habe ich in der While den Wert wieder auf 0 gesetzt, was jedoch, wie beschrieben, zu folge hat, dass die While bei älteren Rechnern zu schnell wieder aus ist.

    Danke für die Antworten!
    Dann werde ich es Zeitbasiert machen, da ich auch keine andere Lösung habe. Super Vorschläge, danke!

    MfG
    Wiibrew