我正在尝试在我使用PS Forms创建的消息框中显示一个计时器。我想要这样的东西:
“你的电脑将在1秒内关闭,持续10秒”。
“您的电脑将在9秒后关机”
“您的电脑将在8秒后关闭”,依此类推。
希望你能帮助我。
答案 0 :(得分:2)
我没有看到在消息框中刷新文本的方法。如果我必须这样做,我可能会弹出另一个带有标签的表格,并使用一个计时器刷新每个标签上的标签文本。
以下是使用潜在起点的代码示例:
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()
您需要进行扩展以满足您的需求,例如条件逻辑,以便在倒计时达到0时执行您想要的任何操作(例如,重启),或者添加用于中止的按钮等。
答案 1 :(得分:0)
Windows脚本主机中有PopUp Method,可让您为time to live
设置PopUp
。我认为没有办法从PowerShell刷新消息框(不要引用我的话)。两行代码来自here。
不确定这是否是您想要的,但这可行(原始解决方案):
$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()
编辑:@JonDechiro提出的解决方案比我的更清洁,更适合OP的要求。