Mehrere Windows Programme ausführen

  • Hallo zusammen,


    Mein Ziel:

    11 Windows .exe Programme hintereinander zu starten - Diese benötigen einen Benutzernamen und Passwort welche ich mir im Vorfeld aus den Input-Boxen auslese.


    Mein Problem:

    Nach genau 3 Programmen die er richtig ausführt inkl. Benutzername und Passwort, startet er keine weiteren Programme?

    Woran liegt das? An den Befehlen kann es meiner Meinung nicht liegen da die ja 3 Programme im Vorfeld richtig gestartet haben?


    Leider konnte ich im Forum nichts dergleichen finden.



    Würde mich über eure Tipps freuen :)

  • Tipp 1: Bei MFC hast du schon mal einen Copy Paste Fehler beim letzen winwaitactive, denke ich.

    Tipp 2: Auch fehlt ein Wend und ein Endswitch ein include.

    Tipp 3: Wiederkehrende Aufgaben in eine Funktion auslagern

    Tipp 4: Sleeps nach Möglichkeit durch sinnvolle Schleifen ersetzen

    Tipp 5: Prüfen ob der Aufruf des Programms überhaupt erfolgreich war.


    Ich habe dir mal deinen Code grob umgebaut. Prüfen und verstehen musst du selber und es geht mit Sicherheit noch besser:

  • Code
                ;MFC
                Run("X:\bin\mfc.exe")
                WinWaitActive("Welcome to")
                send($user)
                send("{TAB}")
                Send($pwd)
                Sleep(1000)
                Send("{ENTER}")
                Sleep(1500)
                WinWaitActive("Car Picking System - CPS Administration 2.1.0") 

    Ich kann da jetzt kein Copy+paste Fehler finden.

    Aber soweit kommt das script garnicht. Das hört nach "LBS" auf und startet keine weiteren Programme.

  • Ich habe oben mal etwas geändert im Post aber:


    Der Titel ist bei 2 Fenstern (MFC & CPS) gleich?


    Das wird zu Problemen führen bei deinen Abfragen!

    Dann musst du über RunWait die PID holen und das Handle des Fensters suchen und aktivieren.

  • Ja genau - Die Fenster Namen sind tatsächlich gleich bei den beiden Programmen.


    Also sollte ich lieber über Runwait dann die PID benutzen statt den Fenster Namen.


    Ich werde das mal ausprobieren.



    Vielen Dank schonmal für deine Hilfe :)

  • Und wie gesagt schaue dir meine anderen erwähnten Tipps an.

    Die anderen hier haben sicher noch mehr :)


    Tipp wegen des Handles:


  • Bitte auch die anderen Anmerkungen (Tipps) beachten.

    Meine Funktion müsste dann so aussehen:

  • Aber unabhängig von den Pids.

    Sollte mein Script nicht prinzipiell funktionieren?


    Mir ist aufgefallen dass mein Script maximal 3 Programme startet:


    beispielsweise zum testen:


    run("notepad.exe")

    sleep(500)

    run("calc.exe")

    Sleep(500)

    run("notepad.exe")

    sleep(500)

    run("notepad.exe")


    Dann startet er nur Notepad -> Calc -> Notepad und das 4te Notepad wird nicht gestartet? Liegt hier nicht evtl. ein anderes Problem vor?

    • Offizieller Beitrag

    Sollte mein Script nicht prinzipiell funktionieren?

    Nein. Du musst das Fenster abfragen, das zum gestarteten Prozess gehört. Das hatte doch Moombas hier erklärt.


    So gehts:


    EDIT:

    Die Verwendung von Send() ist suboptimal. Lies, sofern möglich, die Informationen zu den Eingabefeldern für User und PW mit dem WindowInfoTool aus und schreibe deine Daten direkt in diese Felder mit

    ControlSetText() oder

    ControlSend()

  • Mal von den vielen angebrachten Tipps abgesehen hat scheinbar noch niemand den echten Fehler entdeckt:


    AutoIt
                ;PCO-View
                Run("X:\bin\.pcoview")
                WinWaitActive("PCO View Login")
                send($user)
                send("{TAB}")
                Send($pwd)
                Sleep(1000)
                Send("{ENTER}")
                Sleep(1500)
                WinWaitActive("bwms-app")


    Dein run(...) Aufruf von PCO-View ist schlichtweg falsch (Dateiendung fehlt). Daher wird das Programm nicht gestartet und dein Script bleibt sehr wahrscheinlich beim darauffolgenden WinWaitActive(..) hängen.

  • Dein run(...) Aufruf von PCO-View ist schlichtweg falsch (Dateiendung fehlt). Daher wird das Programm nicht gestartet und dein Script bleibt sehr wahrscheinlich beim darauffolgenden WinWaitActive(..) hängen.

    Das ist nicht ganz richtig... "Test.exe" wird mit Run() auch ausgeführt, wenn nur "Test" angegeben wird.


    So auch mit alle anderen (ausführbaren) Erweiterungen, die in PATHEXT enthalten sind.

    C:\>echo %PATHEXT%

    .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

  • So auch mit alle anderen (ausführbaren) Erweiterungen, die in PATHEXT enthalten sind.

    Ich weiß zwar was du meinst, aber... ;)

    ***Klugscheissmodus ON***

    Auch nicht ganz richtig....denn ALLE anderen (Dateien mit entsprechenden) Erweiterungen werden natürlich NICHT(!) ausgeführt!

    Sondern nur die "erste" Datei mit dieser in der PATHEXT gefundenen Erweiterung!

    Gibt es im Pfad bspw. sowohl eine VBS- als auch eine JS-Datei, dann wird die VBS-Datei ausgeführt.

    Daher ist es angeraten, die Dateiendung bei den RUNxxx()-Funktionen mitzugeben....hat mich nämlich aus genau diesem Grund schon Nerven gekostet :rolleyes:

    ***Klugscheissmodus OFF***

  • So auch mit alle anderen (ausführbaren) Erweiterungen, die in PATHEXT enthalten sind.

    Danke, wusste ich in der Tat nicht. Sicherer ist es jedenfalls grundsätzlich vollständige Pfadangaben für Dateien jeder Art zu verwenden und ggf. auch vorab auf deren Existenz und bei Bedarf via Hash auf Authentizität zu prüfen.

  • Zusätzlich war die Dateiendung zwar das Problem aber ich denke dadurch das in dem Teil, wo Misterspeed das Problem angesprochen hat, ein "." vorhanden war, er dies als Dateiendung genommen hat:. Genaugenommen fehlt der Dateiname^^

    Code
    Run("X:\bin\.pcoview")

    Und das er das dann nicht ausführen konnte ist klar :)

    Aber voll mal drüber hinweg gelesen^^

  • Zusätzlich war die Dateiendung zwar das Problem aber ich denke dadurch das in dem Teil, wo Misterspeed das Problem angesprochen hat, ein "." vorhanden war, er dies als Dateiendung genommen hat:. Genaugenommen fehlt der Dateiname^^

    Code
    Run("X:\bin\.pcoview")

    Und das er das dann nicht ausführen konnte ist klar :)

    Aber voll mal drüber hinweg gelesen^^

    Macht sinn ja ;)