LoginSignup
9
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-23

概要

指定時間(分)後にメッセージを表示、または指定時刻が来たらメッセージを表示する関数。
プロファイルに登録しておくのがお勧め。

使用例

例1)1分後にメッセージを表示
ps10.png

待ち中
ps11.png

1分たった
ps12.png

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

zzz 08:00

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

zzz 3 ラーメンできたよ!

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

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

コード

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")
}

動作確認した環境

  • PowerShell V4 (Windows 8.1)
  • PowerShell V5 (Windows 10)

参考サイト

Write-Progress - MSDN

9
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12