Beispiel.exe verhindert einen Neustart, Lösungsansatz?

  • Wenn ein Installer ein Reboot einleitet, ist der ExitCode dann sicher $EXITCLOSE_BYSUTDOWN, also 4?

    Ja. Bevor Windows einen ShutDown einleitet, wird in der Registry vermerkt, ob und wie dieser ausgeführt werden soll. AutoIt liest diesen Wert aus und setzt das Makro @exitCode dann entsprechend.

    Anstelle des externen Befehls Shutdown.exe kannst du auch AutoIt bemühen...

    AutoIt
    Shutdown($SD_Code) ; AutoIt-Hilfe lesen!!!

    ...doch so kannst du kein Timeout mit angeben! Die Timeouts kannst du aber in der Registry setzen bzw. ändern... siehe Anhang. Ist ein Key nicht vorhanden, verwendet Windows den Defaultwert.

    Wenn du doch lieber die Shutdown.exe verwenden willst, weil du das Timeout explizit mit angeben willst, was in dem Fall dann auch zu empfehlen ist, sollte es nicht kleiner als der Defaultwert sein.

    Vor Ausführung des Shutdowns (egal ob mit AutoIT oder externem Befehl) musst du die Funktion OnAutoItExitUnRegister("_Exit") ausführen, anderfalls wird die Funktion _Exit() erneut aufgerufen!

    Process Constants - Auszug aus der Datei ..\Includes\AutoItConstants.au3
    AutoIt
    ; Process Constants
    ; Indicates the type of shutdown
    Global Const $SD_LOGOFF = 0 ; Logoff
    Global Const $SD_SHUTDOWN = 1 ; Shutdown
    Global Const $SD_REBOOT = 2 ; Reboot
    Global Const $SD_FORCE = 4 ; Force
    Global Const $SD_POWERDOWN = 8 ; Power down
    Global Const $SD_FORCEHUNG = 16 ; Force shutdown if hung
    Global Const $SD_STANDBY = 32 ; Standby
    Global Const $SD_HIBERNATE = 64 ; Hibernate

    Ist das mit dem BYSUTDOWN eigentlich ein Typo in der AutoIt Dokumentation und soll BYSHUTDOWN heißen?

    OnAutoItExitRegister Constants - Auszug aus der Datei ..\Includes\AutoItConstants.au3
    AutoIt
    ; OnAutoItExitRegister Constants
    Global Const $EXITCLOSE_NORMAL = 0 ; Natural closing.
    Global Const $EXITCLOSE_BYEXIT = 1 ; close by Exit function.
    Global Const $EXITCLOSE_BYCLICK = 2 ; close by clicking on exit of the systray.
    Global Const $EXITCLOSE_BYLOGOFF = 3 ; close by user logoff.
    Global Const $EXITCLOSE_BYSUTDOWN = 4 ; close by Windows shutdown.


    Alle Klarheiten beseitigt? :D

  • @Bitnugger

    Danke nochmal für die flotte Antwort. Ich habe das jetzt erstmal mit dem shutdown.exe umgesetzt und schaue wie es funktioniert.

    Ob alle Klarheiten beseitigt sind? Tatsächlich ja, seitdem ich das von dir gelesen habe:

    "Vor Ausführung des Shutdowns (egal ob mit AutoIT oder externem Befehl) musst du die Funktion OnAutoItExitUnRegister("_Exit") ausführen, anderfalls wird die Funktion _Exit() erneut aufgerufen!"

    Wie muss ich das jetzt verstehen? Ich hatte einfach wie in deinem Code-Beispiel auf Seite 1 des Threads hier zu Anfang des Scripts

    Code
    OnAutoItExitRegister("_Exit")


    gesetzt, dann den ganzen Inhalt des Scriptes selbst und die Funktion selbst...

    Code
    Func _Exit()
    	; Das Beenden von Windows und dadurch evtl. hängender Prozesse erzwingen
    	If @exitMethod = $EXITCLOSE_BYSUTDOWN Then
    	  FileOpen($logpath)
    	  FileWriteLine($logpath, _NowTime() & "OnAutoItExitRegister Funktion wurde aufgerufen, versuche den eingeleiteten Neustart zu erzwingen." & @CRLF)
    	   Run('shutdown.exe /r /f /t 0') ; 4 = close by Windows shutdown
    	   EndIf
    	EndFunc

    dann unter das Script gepackt. Ich dachte die wird dann einfach automatisch aufgerufen sobald sich AutoIT schließt? Wird das jetzt so nicht klappen ohne UnRegister verwendet zu haben? Das die Func _Exit() Zeilen unten stehen sollte ja egal sein?

  • OnAutoItExitRegister("_Exit")
  • Hier noch eine andere Möglichkeit, um sicherzustellen, dass eine Funktion nur einmal ausgeführt wird...

    RunOnce