2016-08-09 86 views
1

Ich versuche, einen Timer in meinem Meldungsfeld anzuzeigen, das ich mit PS Forms erstellt habe. Ich möchte etwas in der Art:Wie erhalte ich einen Timer in einer Powershell-Messagebox?

"Ihr PC wird in 10 Sek." Nach 1 Sek.

"Ihr PC Shutdown in 9 Sekunden wird"

"Der PC Shutdown in 8 Sekunden sein" und so weiter.

Hoffe, du kannst mir helfen.

Antwort

0

Es gibt PopUp Method von Windows Script Host, mit dem Sie eine time to live für die PopUp festlegen können. Ich glaube nicht, dass es eine Möglichkeit gibt, ein Meldungsfeld von PowerShell zu aktualisieren (zitiere mich nicht dazu). Zwei Zeilen des Codes kamen von here.

nicht sicher, ob es das ist, das Sie wollen, aber das funktioniert (Roh-Lösung):

$timer = New-Object System.Timers.Timer 
$timer.AutoReset = $true #resets itself 
$timer.Interval = 1000 #ms 
$initial_time = Get-Date 
$end_time = $initial_time.AddSeconds(12) ## don't know why, but it needs 2 more seconds to show right 

# create windows script host 
$wshell = New-Object -ComObject Wscript.Shell 
# add end_time variable so it's accessible from within the job 
$wshell | Add-Member -MemberType NoteProperty -Name endTime -Value $end_time 

Register-ObjectEvent -SourceIdentifier "PopUp Timer" -InputObject $timer -EventName Elapsed -Action { 
    $endTime = [DateTime]$event.MessageData.endTime 
    $time_left = $endTime.Subtract((Get-Date)).Seconds 

    if($time_left -le 0){ 
     $timer.Stop() 
     Stop-Job -Name * -ErrorAction SilentlyContinue 
     Remove-Job -Name * -ErrorAction SilentlyContinue 
     #other code 
     # logoff user? 
    } 
    $event.MessageData.Popup("Your PC will be shutdown in $time_left sec",1,"Message Box Title",64) 
} -MessageData $wshell 

$timer.Start() 

EDIT: Die Lösung von @JonDechiro präsentiert ist viel sauberer als meine und mehr apropriate für das, was OP gefragt .

1

Ich sehe keine Möglichkeit, den Text in einem Meldungsfeld zu aktualisieren. Wenn ich dies tun müsste, würde ich wahrscheinlich ein anderes Formular mit einem Label aufklappen und einen Timer verwenden, der den Text des Labels bei jedem Tick aktualisiert.

Hier ist ein Codebeispiel einen potentiellen Ausgangspunkt zu verwenden:

Add-Type -AssemblyName System.Windows.Forms 
Add-Type -AssemblyName System.Drawing 
$Form = New-Object system.Windows.Forms.Form 
$script:Label = New-Object System.Windows.Forms.Label 
$script:Label.AutoSize = $true 
$script:Form.Controls.Add($Label) 
$Timer = New-Object System.Windows.Forms.Timer 
$Timer.Interval = 1000 
$script:CountDown = 60 
$Timer.add_Tick(
    { 
     $script:Label.Text = "Your system will reboot in $CountDown seconds" 
     $script:CountDown-- 
    } 
) 
$script:Timer.Start() 
$script:Form.ShowDialog() 

Sie erweitern müssen, um Ihre Bedürfnisse wie bedingte Logik zu erfüllen, was auch immer Sie die gewünschte Option (zB Neustart), wenn die Zählung zu tun unten erreicht 0, vielleicht fügen Sie eine Schaltfläche für den Abbruch usw.

hinzu