none
Probleme mit Countdown und Keypress RRS feed

  • Frage

  • Hallo zusammen,

    ich habe Probleme beim Implementieren einer Countdown-Funktion.
    Als Basis habe ich ein Script aus dem WWW genommen und auf meine Anforderungen angepasst.

    Im Prinzip setze ich scriptgesteuert einen Server auf. Dazwischen liegen mehrere Reboots. Vor jedem Reboot möchte ich einen Countdown haben. Wenn der Countdown abgelaufen ist, dann soll der Computer rebooten. Wenn während des Countdowns eine beliebige Taste gedrückt wurde, dann soll das Script pausieren und ein Menü angezeigt werden.

    Das habe ich alles schon und funktioniert auch, aber sehr sehr unzuverlässig.
    Die Funktion kann eigentlich noch viel mehr und deshalb möchte ich nicht auf eine komplett andere Basis umstellen. Ich habe die bestehende Funktion für eure geschätzte Hilfe einmal auf das wesentliche reduziert:

    Function Start-Countdown {
    
        Param(
    
            [Int]$Seconds = 10
    
        )
    
    
        #save beginning value for total seconds
        $TotalSeconds=$Seconds
        
        #define the Escape key
        #$ESCKey = 27
    
        #define a variable indicating if the user aborted the countdown
        $Abort=$False
    
        while ($seconds -ge 1) {
    
            if ($host.ui.RawUi.KeyAvailable) {
    
                $key = $host.ui.RawUI.ReadKey("NoEcho,IncludeKeyUp,IncludeKeyDown")
    
                #if ($key.VirtualKeyCode -eq $ESCkey) {
                if ($key) {
    
                    # Key was pressed so quit the countdown and set abort flag to True
        	        $Seconds = 0
                    $Abort=$True
                    break
    
                }
            }
    
    
            Write-Host "ACHTUNG: Der Computer wird in $Seconds Sekunden neu gestartet.`n`nDrücken Sie eine Taste um den Countdown abzubrechen ..." -foregroundcolor Yellow
            Start-Sleep -Seconds 1
    
            $Seconds--
    
        } #while
    
    
        if (-Not $Abort) {
        
            write-Host "Countdown selbstständig abgelaufen!"
    
        } else { 
    
            write-Host "Countdown vom Benutzer abgebrochen!"
    
        } 
    
    }
    
    Start-Countdown -Seconds 5
    

     

    Ich hoffe, ich habe die Funktion jetzt nicht allzu sehr gestutzt. Beim einfachen Testen hat das vorher immer sauber funktioniert. Im produktiven Einsatz ist mir aufgefallen, dass der Countdown von selbst abgebrochen wurde. Also in etwa so, als wenn eine Taste gedrückt worden wäre. Ich habe dann irgendwo ein Flush Inputbuffer gesetzt, aber dann hat es wieder andere Probleme gegeben.

    Außerdem wird der Keypress unsauber/verzögert abgefangen. Wahrscheinlich weil es nicht direkt in einer Schleife abgefragt wird. (start-sleep)

    Kann mir jemand helfen das zu verbessern?

    Vielen Dank

    • Verschoben Denniver ReiningMVP Sonntag, 8. Mai 2016 21:04 Keine Crossposts der gleichen Frage in verschiedenen Foren bitte!
    Freitag, 6. Mai 2016 06:50

Alle Antworten

  • Function has been rewritten from scratch.
    Seems to work pretty fine now.

    Main changes:

    - rewritten countdown-loop without using "start-sleep"
    - correct Placement of "Flush Inputbuffer"
    - bit different way to get keypress
    - different handling when called from ISE

    Sonntag, 8. Mai 2016 09:56