複数回発生しうるトリガーを持つタスクを一日一回だけ実行させる

「その日初めてログオン、またはロック解除したらSlackに通知する」
というタスクを設定したいわけですよ
Slackへの通知にはもちろんPowerShellのスクリプトを実行してます
そんでね、ログオンはともかくロック解除は頻繁にやるのでその都度通知飛ばされても困っちゃうわけですね
だので、一回実行したらファイルに記録しといてそれがあったらその日はもう通知は行わない、という風にしといたわけですよ
だがね、問題はps1を実行してるってことでね…あんにゃろシェルを非表示に出来ないという欠点がありましてね!
PowerShellの起動オプションに非表示っぽいのあるんだけど(-WindowStyle Hidden)、効きません!ぐああ!
それにだな、たとえ非表示にしてたとしてもいらんもん毎度実行されてんのもなんかイヤでしょ
タスクスケジューラの設定でどうにかすべし!

てなわけで、トリガーの詳細設定をにらめっこしました
設定項目はだいたい謎めいてるのでひとつひとつググって調べました
するとちょうど良さそうなのが見つかったんですよ、その名も「アクティブ化」!

なんかね、指定した時刻になるまではそのトリガーをアクティブにしないっていう設定らしいのね
これ使えそうだな!

PS> $Task = Get-ScheduledTask -TaskName 対象タスク名
PS> $Task.Triggers

Enabled            : True
EndBoundary        :
ExecutionTimeLimit :
Id                 :
Repetition         : MSFT_TaskRepetitionPattern
StartBoundary      : 2015-09-15T00:00:00  # これっぽい
Delay              : PT3M
UserId             : hogehogestuncloud
PSComputerName     :

Enabled            : True
EndBoundary        :
ExecutionTimeLimit :
Id                 :
Repetition         : MSFT_TaskRepetitionPattern
StartBoundary      : 
Delay              :
StateChange        : 8
UserId             : hogehogestuncloud
PSComputerName     :

とりあえずGUIから適当に設定して、PowerShellで見てみるとStartBoundaryがそれっぽいですよ
タスクを実行した際にここも書き換えちゃえばいいんだろ、簡単だな!
スクリプトに以下を追加しときました

$Task = Get-ScheduledTask -TaskName 対象タスク名
$Task.Triggers | % {
    $_.StartBoundary = $(Get-Date).AddDays(1).ToString('yyyy-MM-ddT00:00:00') # 翌日0時を指定
}
$Task | Set-ScheduledTask

StartBoundaryは文字列型だった上に決まったフォーマットに変換してやる必要があったです、めんどくせ
あと、Set-ScheduledTaskするには昇格している必要があるので、タスクのセキュリティオプションで「最上位の特権で実行する」にチェック入れとけば完璧だ
完璧なはずだ
結果は明日!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中