AutiIt Schleife soll beendet werden, sobald exe beendet ist.

  • Hallo Gemeinde,

    ich habe ein kleines Problem welches mich in den Wahnsinn treibt. Es geht um folgendes:

    Ich will mit einer for Schleife (BAT Datei) mehrere BIK Files bearbeiten, es sollen Audiostreams getauscht werden. Soweit sogut nur leider kapituliert Binkbat mit so etwas so das ich eine *.BAT nutze mit for Schleife. Nun habe ich das Problem, das nach jedem extrahieren ein Fenster aufploppt wo man Done klicken muss (Schande über den Pragrammierer xD). Also dachte ich, mache ich mal n kleines AutoIt Script das den Done click für mich übernimmt, so das alle BIKs fein durchlaufen. Das klappt soweit auch, nur wenn meine BAT durch ist (die mittlerweile eine exe ist), läuft das Script im Taskmanager weiter :(.

    Mein Anliegen:

    Ich möchte ein Script das diese Schleife solange ausführt, bis die exe beendet ist.

    [autoit]

    Run("extractBIKAudio-DEU.exe")
    While 1
    WinWaitActive("Bink Converter - Done!")
    WinActivate("Bink Converter - Done!")
    ControlClick("Bink Converter - Done!", "&Done", "Button3", "left")
    WEnd

    [/autoit]

    Ich bin leider absoluter AutoIt Noob, auch ein komplett anderer Weg wäre mir recht. Wichtig ist nur:

    Bei jedem mal wenn das dusselige Done Schild kommt, soll er da druff klicken.
    Wenn die exe "durchgelaufen" ist und schliesst, soll sich auch das Script schliessen.

    Das ganze ist mit radbatch definitiv nicht möglich, da die Videos sich unterscheiden können in Namensgebung.

    Vielen Dank für Hilfe eurerseits.

    MfG

  • Da hilft die PID :)

    Durch den Run bekommst du eine PID zurück :)


    [autoit]


    $PID = Run("extractBIKAudio-DEU.exe") ;~ PID speichern...
    While ProcessExists ($PID) ;~ Schleife wird solange ausgeführt, wie der Prozess existiert.
    WinWaitActive("Bink Converter - Done!")
    WinActivate("Bink Converter - Done!")
    ControlClick("Bink Converter - Done!", "&Done", "Button3", "left")
    WEnd

    [/autoit]


    Edit:
    Achja, wenn es nur 1 Fenster ist, was dich stört:

    [autoit]

    WinClose() ;~ Klick direkt auf das Schlüsselwort, um die Hilfe zu öffnen.

    [/autoit]


    Dann schau dir mal den Befehl an.

    Einmal editiert, zuletzt von Yjuq (14. Oktober 2012 um 18:32)

  • @Make-Grafik
    WinWaitActive pausiert das Skript bis ein Fenster aktiv ist.
    Solange wird auch die Abfrage von ProcessExists() nicht ausgeführt.
    Wenn das Skript also in der Schleife steckt, gerade das WinWaitActive ausgeführt wird und das Programm in dieser Zeit beendet wird (also kein Fenster "Bink Converter" mehr erscheinen wird) bleibt das Skript in dem WinWaitActive gefangen.

    @YaeroxXO
    Er will ja solange das Programm läuft etwas durchführen.
    Würde man RunWait verwenden wird das Skript erst weitergeführt wenn das Programm beendet wurde.

    Ein paar Kleinigkeiten vielleicht noch:

    • WinWaitActive wartet bis ein bestimmtes Fenster aktiv ist.
      WinActivate aktiviert ein bestimmtes Fenster.
      Das WinActivate ist in diesem Fall daher nicht notwendig da die Bedingung eh ist das das Fenster aktiviert sein muss.
    • Der 2. Parameter von Controlclick bezeichnet nicht den Text des Controls sondern ist ein beliebiger Text des Fensters zur genaueren Unterscheidung.
      Wenn z.B. 2 Fenster mit dem selben Fenstertitel existieren kann man sie voneinander durch bestimmte (selbstgewählte) Teile des Textes aus diesem Fenster unterscheiden.


    Mein Vorschlag für die Problemstellung:

    Spoiler anzeigen
    [autoit]

    $PID = Run("extractBIKAudio-DEU.exe")

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

    While ProcessExists($PID)
    If WinExists("Bink Converter - Done!") Then ControlClick("Bink Converter - Done!", "", "Button3")
    Sleep(250)
    WEnd

    [/autoit]
  • Hi,

    wie wäre es mit:

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

    $id = "id"

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

    Do
    sleep(100)
    Until WinExists("Bink Converter - Done!")

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

    ControlClick("Bink Converter - Done!", "Done", $id, "left",1)

    [/autoit]

    Die "id" kriegst du mit "Au3Info.exe".

    Gruß
    x0r

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Das wäre eine Lösung wenn nur ein einziges dieser Fenster auftaucht. Für mich klang es jedoch so das davon mehrere auftauchen.
    Wenn tatsächlich nur ein Fenster kommt dann braucht man aber auch keine Do-Until-Schleife sondern ein WinWait reicht da auch.