How to make a messagebox appear at a specific time

2019-08-05 04:14发布

I want to create an alarm clock that displays a specific event using a messagebox.

Using the code provided:

 [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)

3条回答
仙女界的扛把子
2楼-- · 2019-08-05 04:49

If you were on V3 I would recommend this (from an elevated/admin prompt):

$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

Really folks, PowerShell V4 is out now. It's time to move to at least V3. :-)

Note: the $principal business is required to enable the setting "Run only when user is logged on". This allows the UI to interact with the desktop. Without this, now message box appears.

查看更多
姐就是有狂的资本
3楼-- · 2019-08-05 04:50

Try this:

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!"
查看更多
疯言疯语
4楼-- · 2019-08-05 04:51

I think using an event rather than a loop is a much cooler way to do this.

[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

I'm not really in the mood to write you a complete solution because that would be work, and I'm not at work, but I think between all the answers here you've got everything you need.

I referenced this page for guidance on the above:

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

查看更多
登录 后发表回答