WPI unter Windows 7 - Stop Running this Script?

  • Hallo ihr Profis!

    Es geht um eine Fehlermeldung des WPI, das ich nicht gelöst bekomme.

    [Blockierte Grafik: http://www.abload.de/thumb/fehler8705.png]

    Seit 2 Tagen bin ich am Werkeln und sehe keine Möglichkeiten mehr das Problem zu lösen. Ich habe mich schlau gemacht, das Problem soll am Internet Explorer liegen. Ich habe schon einige Scripte geschrieben und diese an den Anfang des WPI 8.1.0 eingebettet.

    Als erstes lasse ich den Internet Explorer einstellen;

    [Blockierte Grafik: http://www.abload.de/thumb/fehler3w7dl.png]

    [autoit]

    AutoItSetOption ("WinTitleMatchMode", 2)
    ShellExecute ("iexplore.exe", "", @ProgramFilesDir & "\Internet Explorer")
    WinWait ("Windows", "SmartScreen")
    ControlClick ("Windows", "SmartScreen", "Button3")
    ControlClick ("Windows", "SmartScreen", "Button1")
    WinWaitActive ("Internet", "Navigation")
    WinActivate ("Internet", "Navigation")
    Sleep (3000)
    Send ("{ALTDOWN}" & "{ALTUP}", 0)
    Sleep (2000)
    Send ("{t}", 0)
    Sleep (2000)
    Send ("{o}", 0)
    Sleep (2000)
    WinWait ("Options", "General")
    ControlFocus ("Options", "General", "SysTabControl321")
    ControlClick ("Options", "General", "SysTabControl321", "left", 1, 358, 11)
    WinWait ("Internet", "Advanced")
    ControlClick ("Internet", "Advanced", "Button1")
    ControlFocus ("Internet", "Advanced", "SysTreeView321")
    Send ("{DOWN}" & "{SPACE}", 0)
    ControlClick ("Internet", "Advanced", "Button3")
    Sleep (3000)
    Send ("{ALTDOWN}" & "{ALTUP}", 0)
    Sleep (2000)
    Send ("{f}", 0)
    Sleep (2000)
    Send ("{x}", 0)
    Sleep (2000)
    WinWait ("Internet", "close")
    ControlCommand ("Internet", "close", "Button3", "Check", "")
    ControlClick ("Internet", "close", "Button1")

    [/autoit]

    Mit Bezug auf KB175500 habe ich einen Installer erstellt.

    [autoit]

    AutoItSetOption ("WinTitleMatchMode", 2)
    ShellExecute ("MicrosoftFixit50403.msi")
    WinWait ("Microsoft", "LIZENZBESTIMMUNGEN")
    ControlCommand ("Microsoft", "LIZENZBESTIMMUNGEN", "Button1", "Check", "")
    ControlClick ("Microsoft", "LIZENZBESTIMMUNGEN", "Button6")
    Do
    Sleep (50)
    Until WinExists ("Microsoft", "wurde")
    WinActivate ("Microsoft", "wurde")
    ControlClick ("Microsoft", "wurde", "Button1")

    [/autoit]

    Und auch habe ich den Reg eintrag eingebettet;

    [autoit]

    RegWrite ("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Styles", "MaxScriptStatements", "REG_DWORD", "0xFFFFFFFF")

    [/autoit]

    Anschliessend lasse ich den Rechner neu starten. Nach einem Neustart siehts aber so aus:

    [Blockierte Grafik: http://www.abload.de/thumb/fehler297ed.png]

    Selbstverständlich bekomme ich die Fehlermeldung mehrmals. Ich muss auch Nein klicken, dann erst macht WPI weiter. Die Fehlermeldung erscheint auch vollkommen willkürlich. Google hilft mir nicht weiter und auch mein Wissen im AutoIt ist nicht so "Advanced".

    Nun stellt sich die Frage wie ich per AutoIt noch vorgehen kann, um das Problem zu lösen. Im Grunde brauche ich ein Script das im Hintergrund in Schleife läuft und auf Nein klickt, wenn das Fenster erscheint. Nur kann ich diesen "Schleifenscript" nicht als EXE einbinden, da in WPI nicht vorgesehen ist das 2 EXE Dateien gleichzeitig ausgeführt werden. Ich weiss nicht mehr weiter. Ich hoffe ihr habt einige Lösungsvorschläge.

    Danke Euch schonmal im Voraus!

    Einmal editiert, zuletzt von Sentionline (3. Mai 2011 um 05:37)

  • Du könntest mit Adlibregister dein Script Quasi parallel prüfen lassen, ob das WPI Fenster erscheint.

    [autoit]

    Adlibregister("Check", 250)

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

    Func Check()
    If WinActive("WPI Fenstername mit INSTANZ oder CLASS") Then ControlClick("WPI Fenstername mit INSTANZ oder CLASS", "", NEINBUTTONID)
    EndFunc

    [/autoit]
  • Vielen Dank!

    Sehe ich das richtig das ich die Funktion in jedem Installerscript einbetten sollte? Immer oben dran nehme ich an.

  • Müsstest du testen, da ich deinen gesamten Quellcode nicht kenne, aber du könntest es immer vor der Installation eines Programmes starten, und wenn es fertig ist, mit

    [autoit]

    AdlibUnregister(Check)

    [/autoit]


    wieder deaktivieren, um falsche Klicks zu vermeiden

  • Jeder Installer hat einen eigenen Script. Beispielsweise Auto Gordian Knot.

    [autoit]

    AutoItSetOption ("WinTitleMatchMode", 2)
    ShellExecute ("Auto Gordian Knot 2.55.exe")
    WinWait ("Auto", "Welcome")
    ControlClick ("Auto", "Welcome", "Button2")
    WinWait ("Auto", "License")
    ControlClick ("Auto", "License", "Button2")
    WinWait ("Auto", "Components")
    ControlClick ("Auto", "Components", "Button2")
    WinWait ("Auto", "Location")
    ControlClick ("Auto", "Location", "Button2")
    Do
    Sleep (50)
    Until WinExists ("Installer", "select")
    WinActivate ("Installer", "select")
    ControlClick ("Installer", "select", "Button1")
    WinWait ("VobSub", "Welcome")
    ControlClick ("VobSub", "Welcome", "Button1")
    WinWait ("VobSub", "Components")
    ControlClick ("VobSub", "Components", "Button1")
    WinWait ("VobSub", "Location")
    ControlClick ("VobSub", "Location", "Button1")
    Do
    Sleep (50)
    Until WinExists ("VobSub", "Complete")
    WinActivate ("VobSub", "Complete")
    ControlClick ("VobSub", "Complete", "Button1")
    WinWaitActive ("Language", "Please")
    WinActivate ("Language", "Please")
    ControlCommand ("Language", "Please", "ComboBox1", "SelectString", "Deutsch")
    ControlClick ("Language", "Please", "Button1")
    WinWait ("AviSynth", "Lizenzabkommen")
    ControlClick ("AviSynth", "Lizenzabkommen", "Button2")
    WinWait ("AviSynth", "Komponenten")
    ControlClick ("AviSynth", "Komponenten", "Button2")
    WinWait ("AviSynth", "Zielverzeichnis")
    ControlClick ("AviSynth", "Zielverzeichnis", "Button2")
    Do
    Sleep (50)
    Until WinExists ("AviSynth", "vollständig")
    WinActivate ("AviSynth", "vollständig")
    ControlClick ("AviSynth", "vollständig", "Button2")
    WinWait ("AviSynth", "abgeschlossen")
    ControlClick ("AviSynth", "abgeschlossen", "Button2")
    WinWaitActive ("XviD", "Welcome")
    WinActivate ("XviD", "Welcome")
    ControlClick ("XviD", "Welcome", "Button2")
    WinWait ("XviD", "Complete")
    ControlClick ("XviD", "Complete", "Button2")
    WinWaitActive ("Auto", "Completing")
    WinActivate ("Auto", "Completing")
    ControlClick ("Auto", "Completing", "Button2")
    Sleep (2000)

    [/autoit]

    Also müsste es so aussehen?;

    [autoit]

    Adlibregister("Check", 250)
    Func ("Check")
    If WinActive ("Wizard", "causing") Then
    ControlClick ("Wizard", "causing", "Button1")
    EndFunc
    AutoItSetOption ("WinTitleMatchMode", 2)
    ShellExecute ("Auto Gordian Knot 2.55.exe")
    WinWait ("Auto", "Welcome")
    ControlClick ("Auto", "Welcome", "Button2")
    WinWait ("Auto", "License")
    ControlClick ("Auto", "License", "Button2")
    WinWait ("Auto", "Components")
    ControlClick ("Auto", "Components", "Button2")
    WinWait ("Auto", "Location")
    ControlClick ("Auto", "Location", "Button2")
    Do
    Sleep (50)
    Until WinExists ("Installer", "select")
    WinActivate ("Installer", "select")
    ControlClick ("Installer", "select", "Button1")
    WinWait ("VobSub", "Welcome")
    ControlClick ("VobSub", "Welcome", "Button1")
    WinWait ("VobSub", "Components")
    ControlClick ("VobSub", "Components", "Button1")
    WinWait ("VobSub", "Location")
    ControlClick ("VobSub", "Location", "Button1")
    Do
    Sleep (50)
    Until WinExists ("VobSub", "Complete")
    WinActivate ("VobSub", "Complete")
    ControlClick ("VobSub", "Complete", "Button1")
    WinWaitActive ("Language", "Please")
    WinActivate ("Language", "Please")
    ControlCommand ("Language", "Please", "ComboBox1", "SelectString", "Deutsch")
    ControlClick ("Language", "Please", "Button1")
    WinWait ("AviSynth", "Lizenzabkommen")
    ControlClick ("AviSynth", "Lizenzabkommen", "Button2")
    WinWait ("AviSynth", "Komponenten")
    ControlClick ("AviSynth", "Komponenten", "Button2")
    WinWait ("AviSynth", "Zielverzeichnis")
    ControlClick ("AviSynth", "Zielverzeichnis", "Button2")
    Do
    Sleep (50)
    Until WinExists ("AviSynth", "vollständig")
    WinActivate ("AviSynth", "vollständig")
    ControlClick ("AviSynth", "vollständig", "Button2")
    WinWait ("AviSynth", "abgeschlossen")
    ControlClick ("AviSynth", "abgeschlossen", "Button2")
    WinWaitActive ("XviD", "Welcome")
    WinActivate ("XviD", "Welcome")
    ControlClick ("XviD", "Welcome", "Button2")
    WinWait ("XviD", "Complete")
    ControlClick ("XviD", "Complete", "Button2")
    WinWaitActive ("Auto", "Completing")
    WinActivate ("Auto", "Completing")
    ControlClick ("Auto", "Completing", "Button2")
    Sleep (2000)
    AdlibUnregister ("Check")

    [/autoit]
  • Wenn du mit

    [autoit]

    Func (Check)
    If WinActive ("Wizard", "causing") Then
    ControlClick ("Wizard", "causing", "Button1")
    EndIf
    EndFunc

    [/autoit]


    Das Fenster mit dem Problem erreichst und den nein Button klickst, dann klappt es so, ja ;)

  • Mit Func hab ich bisher nicht gearbeitet. Ist das so;

    [autoit]

    Adlibregister("Check", 250)
    Func ("Check")
    If WinActive ("Wizard", "causing") Then
    ControlClick ("Wizard", "causing", "Button1")
    EndFunc

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

    ...

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

    AdlibUnregister ("Check")

    [/autoit]

    Oder so richtig?

    [autoit]

    Adlibregister("Check", 250)
    Func (Check)
    If WinActive ("Wizard", "causing") Then
    ControlClick ("Wizard", "causing", "Button1")
    EndFunc

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

    ...

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

    AdlibUnregister (Check)

    [/autoit]
  • eine Funktion (Func) kann irgendwo im Script stehen, es darf nur nicht verschachtelt werden.

    [autoit]

    Func Test()
    Sleep(100)
    Func Test2()
    Sleep(200)
    EndFunc
    EndFunc

    [/autoit]


    wird nicht funktionieren.

    Am einfachsten ist es, wenn du Funktionen immer ans Ende deines Scripts stellst, der Übersichtlichkeit wegen.
    Eine andere Möglichkeit wäre, du lagerst die Funktionen in ein 2tes Script aus und bindest sie über #include ein

  • #include müsste ich aber per UPX kompilieren, womit die meisten Virenscanner so ihre Probleme haben. Deshalb muss ich UDFs meiden. Ich werde deine Func in meine Scripte einbetten. Melde dann bei Erfolg, ob alles funktioniert hat.

    Danke dir!

  • So, also. Ich kann unmöglich in über 200 Installationsscripte eine Func einbauen, sebst wenn sie funktionieren würde. Dazu müsste ich alle Installer neu erstellen...wochenlange Arbeit. Zu Aufwendig.

    Ich habs nicht geschafft eine Schleife in die Func von dir einzubauen. Also hab ich mal etwas rumprobiert und habe mit erfolg eine Schleife erzeugen können;

    [autoit]

    AutoItSetOption ("WinTitleMatchMode", 2)
    While WinWaitActive ("Windows Post-Install Wizard", "Stop running this")
    If WinActivate ("Windows Post-Install Wizard", "Stop running this") Then
    ControlClick ("Windows Post-Install Wizard", "Stop running this", "Button2")
    ContinueLoop (1)
    EndIf
    WEnd

    [/autoit]

    Diese Schleife als EXE, legt sich in der Taskleiste schlafen und wartet auf das Fenster und beendet sich auch nicht. Wenn WPI die Fehlermeldung anzeigt, wird auf Nein geklickt und fertig. Problematisch war es, diese in WPI einzubauen. Also habe ich 2 Batch Dateien erstellt.

    Die erste Batch mit dem Inhalt;

    Code
    START start.exe /B


    und als Start.cmd abgespeichert. Anschliessend zusammen mit dem AutoIt Script als SFX gepackt;

    [autoit]

    FileCopy ("Start.cmd", @TempDir, 1)
    FileCopy ("Start.exe", @TempDir, 1)
    Sleep (2000)
    Run ("Start.cmd", @TempDir, 1)
    Exit

    [/autoit]

    Die Sfx wird geöffnet, Start.cmd sowie Start.exe (ich nenne es mal Debugschleife) wird ins Temp Verzeichnis kopiert und dort ausgeführt. Die Schleife bettet sich ins Tray ein und die CMD schliesst sich. Danach beginnt WPI mit der Arbeit an, da die Sfx geschlossen wird.

    Am Ende wird dann seine sfx geöffnet mit folgendem Batch;

    Code
    taskkill /f /im Start.exe


    als Ende.cmd und AutoIt Script;

    [autoit]

    FileCopy ("Ende.cmd", @TempDir)
    Run ("Ende.cmd", @TempDir)
    Exit

    [/autoit]

    Also nochmal etwas genauer;

    Start.cmd, Start.exe sowie Startaufgaben.exe wird als Starten.exe in eine sfx verpackt. Diese sfx hat die Anweisung Startaufgaben.exe auszuführen. Startaufgaben.exe hat die Anweisung Start.cmd sowie Start.exe ins Tempverzeichnis zu kopieren und dort Start.cmd auszuführen. Start.cmd öffnet Start.exe im Tempverzeichnis, das Script mit der Schleife wird ausgeführt und bettet sich in die Taskleiste ein. Anschliessend macht WPI weiter, da die sfx komplett abgearbeitet ist.

    Am Ende wird die sfx mit dem Inhalt Ende.cmd sowie Endaufgaben.exe als sfx Archiv zu Ende.exe gepackt. WPI startet die Ende.exe, Ende.cmd sowie Endaufgaben.exe werden ins Tempverzeichnis kopiert und Ende.cmd wird ausgeführt. Das hat zur folge das taskkill startet und Start.exe aus dem Tray verschwindet.

    Start.cmd (startet die Schleife per Batch, die im Quellverzeichnis liegen muss)

    Code
    START start.exe /B

    Start.exe (Das Script mit der Schleife)

    [autoit]

    AutoItSetOption ("WinTitleMatchMode", 2)
    While WinWaitActive ("Windows Post-Install Wizard", "Stop running this")
    If WinActivate ("Windows Post-Install Wizard", "Stop running this") Then
    ControlClick ("Windows Post-Install Wizard", "Stop running this", "Button2")
    ContinueLoop (1)
    EndIf
    WEnd

    [/autoit]

    Startaufgaben.exe (Anweisung die Sachen ins Temp Verzeichnis zu kopieren und dort Start.cmd auszuführen)

    [autoit]

    FileCopy ("Start.cmd", @TempDir, 1)
    FileCopy ("Start.exe", @TempDir, 1)
    Sleep (2000)
    Run ("Start.cmd", @TempDir, 1)
    Exit

    [/autoit]

    Starten.exe als SFX beinhaltet also; Startaufgaben.exe, Start.exe sowie Start.cmd.

    Endaufgaben.exe (Anweisung Ende.cmd ins Tempverzeichnis zu kopieren und dort auszuführen)

    [autoit]

    FileCopy ("Ende.cmd", @TempDir)
    Run ("Ende.cmd", @TempDir)
    Exit

    [/autoit]

    Ende.cmd (Anweisung per Taskkill Start.exe zu beenden)

    Code
    taskkill /f /im Start.exe

    Ende.exe beinhaltet als SFX; Ende.cmd sowie Endaufgaben.exe.

    Alter schwede, was eine Beschreibung... 8| Tut mir leid aber einfacher geht es nicht.

    Wer es brauchen kann, kann sich die beiden SFX auch herunterladen. (FileUpload Starten.zip / Ende.zip )

    In WPI gibt es die Möglichkeit einen Script oder Programm vor sowie nach den Installationen ausführen zu lassen. Diese beiden kann man dort einbetten und sieht diese Dumme "Stop Running this Script?" Meldung nicht mehr.


    Fazit: Computer sind leider dümmer als dumm.