1

我想创建一个使用消息框显示特定事件的闹钟。

使用提供的代码:

 [System.Windows.Forms.MessageBox]::Show("Do this task" , "Alert!")  


Do 
{ 
$waitMinutes = 1 
$startTime = get-date 
$endTime   = $startTime.addMinutes($waitMinutes) 
$timeSpan = new-timespan $startTime $endTime 
Start-Sleep $timeSpan.TotalSeconds 

# Play System Sound 
[system.media.systemsounds]::Exclamation.play() 
# Display Message 
Show-MessageBox Reminder "Do this task." 
} 

# Loop until 11pm 
Until ($startTime.hour -eq 23)
4

3 回答 3

2

我认为使用事件而不是循环是一种更酷的方法。

[datetime]$alarmTime = "November 7, 2013 10:30:00 PM" 
$nowTime = get-date 
$tsSeconds = ($alarmTime - $nowTime).Seconds
$timeSpan = New-TimeSpan -Seconds $tsSeconds

$timer = New-Object System.Timers.Timer
Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action { [System.Windows.Forms.MessageBox]::Show("Brush your Teeth" , "Alert!") }
$timer.Autoreset = $false 
$timer.Interval = $timeSpan.TotalMilliseconds
$timer.Enabled = $true

我真的没有心情给你写一个完整的解决方案,因为那会奏效,而且我不在工作,但我认为在这里的所有答案之间你已经得到了你需要的一切。

我参考了此页面以获取有关上述内容的指导:

http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/16/use-asynchronous-event-handling-in-powershell.aspx

于 2013-11-08T04:52:17.187 回答
0

如果您使用的是 V3,我会推荐这个(来自提升/管理员提示):

$principal = New-ScheduledTaskPrincipal -LogonType Interactive
Register-ScheduledJob -Name BrushTeeth -Trigger @{Frequency='Daily';At="7:30am"} -ScriptBlock {
    Add-Type -assembly System.Windows.Forms 
    [Windows.Forms.MessageBox]::Show('Brush your teeth!')}
Set-ScheduledTask -TaskName "\Microsoft\Windows\PowerShell\ScheduledJobs\BrushTeeth" -Principal $principal

伙计们,PowerShell V4 现已推出。现在是至少升级到 V3 的时候了。:-)

注意:需要 $principal 业务才能启用“仅在用户登录时运行”设置。这允许 UI 与桌面交互。没有这个,现在会出现消息框。

于 2013-11-08T03:23:52.520 回答
0

尝试这个:

function New-Alarm
{
    param(
        [Parameter(Mandatory=$true,HelpMessage="Enter a time in HH:MM format (e.g. 23:00)")]
        [String]
        $time,

        [Parameter(Mandatory=$true,HelpMessage="Enter the alert box title (e.g. Alert!).")]
        [String]
        $alertBoxTitle,

        [Parameter(Mandatory=$true,HelpMessage="Enter the alert message.")]
        [String]
        $alertBoxMessage
    )

    do 
    {
        Start-Sleep -Seconds 1
    }
    until((get-date) -ge (get-date $time))
    # Play system sound:
    [system.media.systemsounds]::Exclamation.play()
    # Display message
    [System.Windows.Forms.MessageBox]::Show($alertBoxMessage,$alertBoxTitle) 
}

New-Alarm -time "22:00" -alertBoxTitle "Alert!" -alertBoxMessage "Time to study PowerShell!"
于 2013-11-07T21:58:51.233 回答