PowerShell 指定時間が来たらメッセージ表示

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
指定時間（分）後にメッセージを表示、または指定時刻が来たらメッセージを表示する関数。
[プロファイル](http://qiita.com/Kosen-amai/items/70513b51e9b67a856ff9#-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB "PowerShellメモ　基本：プロファイル - Qiita")に登録しておくのがお勧め。

# <i class="fa fa-cubes" style="font-size:1em;"></i> 使用例

例1）1分後にメッセージを表示
![ps10.png](https://qiita-image-store.s3.amazonaws.com/0/142879/68bd15c6-78f7-fe0d-75ae-f5721a3867d5.png)

待ち中
![ps11.png](https://qiita-image-store.s3.amazonaws.com/0/142879/2d440d62-44b4-dc17-1189-b7c21e8a9425.png)

1分たった
![ps12.png](https://qiita-image-store.s3.amazonaws.com/0/142879/65ced750-fcb3-659f-0583-231e868af5fd.png)

例2）午前8時にメッセージ表示

```Text
zzz 08:00
```

例3）3分後、任意のメッセージを表示

```Text
zzz 3 ラーメンできたよ！
```


例4）15時に任意のメッセージを表示

```Text
zzz 15:00 おやつの時間です
```

# <i class="fa fa-file-text-o" style="font-size:1em;"></i> コード

```PowerShell
Add-Type -AssemblyName Microsoft.VisualBasic

<#
.SYNOPSIS
    時間が来たらメッセージ表示

.DESCRIPTION
    指定時間（分）後 または 指定時刻になったらメッセージを表示する

.PARAMETER time
    分または時刻（HH:mm形式）

.PARAMETER msg
    時間が来たら表示するカスタムメッセージ（省略可）

.NOTES
    時刻指定で現在時刻より前を指定した場合、翌日の時刻とみなす

.EXAMPLE
    zzz 10
    10分待つ

.EXAMPLE
    zzz 08:30
    午前8時半まで待つ

.EXAMPLE
    zzz 23:00 もう寝ましょう
    午後23時まで待つ（任意のメッセージ表示）
#>
function zzz([string]$time, [string]$msg = "")
{
    Clear-Host

    [string]$mode = ""
    # 時刻指定っぽい？
    if ($time -match "^\d+:\d+$")
    {
        # 厳密にチェック
        if ($time -match "^([0-1][0-9])|([2][0-3]):[0-5][0-9]$")
        {
            $mode = "TIME";
        }
        else
        {
            Write-Host "時と分はそれぞれ2桁で、実在する時刻を指定してください"
            Write-Host "例1) 01:00"
            Write-Host "例2) 23:59"
            return
        }
    }
    elseif ($time -match "^[0-9]+$")
    {
        # 数字のみなら「分」指定とみなす
        $mode = "MINUTES";
    }
    
    if ($mode -eq "")
    {
        # パラメータ不正時は使用方法表示
        Write-Host "使用例1) 10分後にメッセージ表示"
        Write-Host "  zzz 10"
        Write-Host ""
        Write-Host "使用例2) 3分後に任意のメッセージ表示"
        Write-Host "  zzz 3 ラーメンできたよ！"
        Write-Host ""
        Write-Host "使用例3) 13時5分にメッセージ表示(時、分はそれぞれ2桁で指定)"
        Write-Host "         ※現在時刻より前を指定した場合、翌日の時刻とみなす"
        Write-Host "  zzz 13:05"
        return
    }
    
    $now = Get-Date
    Write-Host $now.ToString("HH:mm:ss 待ち開始") -ForegroundColor DarkGray
    Write-Host "`n`n`n`n`n`n"
    
    if ($mode -eq "TIME")
    {
        # 「時刻」指定
        
        [string]$nowTime = $now.ToString("HH:mm")
        [string]$msgTime = $time
        [int]$waitSecond = 0
        
        if ($nowTime -eq $time)
        {
            Write-Host "指定した時刻と現在時刻が同じです。"
            return
        }
        elseif ($nowTime -lt $time)
        {
            # 現在時刻 ＜ 指定時刻

            # 現在時刻～指定時刻の差（秒）を求める
            $waitSecond = (New-TimeSpan $now.ToString("HH:mm:ss") "${time}:00").TotalSeconds
        }
        else
        {
            # 現在時刻 ＞ 指定時刻

            # 今日の現在時刻～翌日の指定時刻の差（秒）を求める
            $waitSecond = (New-TimeSpan $now.ToString("yyyy/MM/dd HH:mm:ss") $now.AddDays(1).ToString("yyyy/MM/dd ${time}:00")).TotalSeconds
            
            # 日付をまたぐ場合は時間だけでなく月日も表示
            $msgTime = $now.AddDays(1).ToString("MM/dd ${time}")
        }

        Write-Host "${msgTime}になったらメッセージを表示します。　Zzz…(u_u)"
        foreach ($i in (1..$waitSecond))
        {
            # 進捗表示と待ち
            Write-Progress -Activity "待ち..." -PercentComplete ([int]((100 * $i)/$waitSecond))
            Start-Sleep -Second 1
            if ((Get-Date -Format "HH:mm") -eq $time)
            {
                # 指定した時間が来たので終了
                break
            }
        }
    }
    else
    {
        # 「分」指定
        
        Write-Host "${time}分後にメッセージを表示します。　Zzz…(u_u)"
        [int]$waitSecond = [int]$time * 60

        # 指定した秒数分、繰り返す
        foreach ($i in (1..$waitSecond))
        {
            # 進捗表示と待ち
            Write-Progress -Activity "待ち..." -PercentComplete ([int]((100 * $i)/$waitSecond))
            Start-Sleep -Second 1
        }
    }
    
    # 目覚め
    Write-Host "`n`n(@_@)`n"

    if ($msg -eq "")
    {
        # 引数でメッセージが指定されていない場合はデフォルトのメッセージを使う
        $msg = "`n`n`n`n`n★★★★★★★★　時間です　" + (Get-Date).ToString("HH:mm") + "　★★★★★★★★`n`n`n`n`n"
    }

    # メッセージボックス表示
    [void][Microsoft.VisualBasic.Interaction]::MsgBox($msg,
        ([Microsoft.VisualBasic.MsgBoxStyle]::Yes -bor [Microsoft.VisualBasic.MsgBoxStyle]::SystemModal),"PowerShell")
}
```

# <i class="fa fa-cubes" style="font-size:1em;"></i> 動作確認した環境
* PowerShell V4 (Windows 8.1)
* PowerShell V5 (Windows 10)

# <i class="fa fa-book" style="font-size:1em;"></i> 参考サイト
[Write-Progress - MSDN](https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.utility/Write-Progress)