PowerShellを用いて特定の日時にタスクをスケジュールする方法

PowerShellを用いて特定の日時にタスクをスケジュールする方法という問いには、当日20時を計算し、現在以下なら翌日へ補正した上でNew-ScheduledTaskTrigger -Onceへ渡すという方法で答えます。DateTime.Today.AddHours(20)は実行日の20時を返すため、現在が20時以降なら過去になる。現在時刻以下ならAddDays(1)して翌日20時へ進める必要がある。この記事ではTaskName、TaskPath、算出したDateTime、現在時刻、Actionの絶対パスを同じ登録票にするを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。

繰り返しスケジュールではなく、今が20時を過ぎていても次の未来の20時へ登録する一回タスクを扱う。完了は「登録タスクのNextRunTimeが算出した未来の20時と一致し、実行後に結果と一回性を確認できる」と定義します。対象が取れない場合は「同名タスクがなければ新規、存在するなら上書きせずAction、Trigger、所有者を比較して承認を取り直す」として切り分け、推測で成功扱いにしません。

目次

過去時刻を登録しない計算

過去時刻を登録しない計算では、当日または翌日20時の一回タスクの対象を「TaskName、TaskPath、算出したDateTime、現在時刻、Actionの絶対パスを同じ登録票にする」という単位で扱います。DateTime.Today.AddHours(20)は実行日の20時を返すため、現在が20時以降なら過去になる。現在時刻以下ならAddDays(1)して翌日20時へ進める必要がある。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。

当日または翌日20時の一回タスクを始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。

現在が20時前か後かを判定

当日20時を計算し、現在以下なら翌日へ補正した上でNew-ScheduledTaskTrigger -Onceへ渡す。当日または翌日20時の一回タスクではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。繰り返しスケジュールではなく、今が20時を過ぎていても次の未来の20時へ登録する一回タスクを扱う。

現在が20時前か後かを判定の合格条件は、登録タスクのNextRunTimeが算出した未来の20時と一致し、実行後に結果と一回性を確認できることです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。

20時後なら翌日へ一日加算

20時後なら翌日へ一日加算は変更前の基準点です。TaskName、TaskPath、算出したDateTime、現在時刻、Actionの絶対パスを同じ登録票にするを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。

$taskName = 'ITtrip-OneTime-20h'
$now = Get-Date
$runAt = [DateTime]::Today.AddHours(20)
if ($runAt -le $now) { $runAt = $runAt.AddDays(1) }
[pscustomobject]@{ Now = $now; RunAt = $runAt; IsFuture = ($runAt -gt $now) }
Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue

DateTime.Today.AddHours(20)は実行日の20時を返すため、現在が20時以降なら過去になる。現在時刻以下ならAddDays(1)して翌日20時へ進める必要がある。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。

Onceトリガーを具体日時で作る

Onceトリガーを具体日時で作るでは同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、登録タスクのNextRunTimeが算出した未来の20時と一致し、実行後に結果と一回性を確認できるかどうかです。

Get-ScheduledTask -TaskName 'ITtrip-OneTime-20h' |
  Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName 'ITtrip-OneTime-20h' |
  Select-Object NextRunTime, LastRunTime, LastTaskResult

同名タスクがなければ新規、存在するなら上書きせずAction、Trigger、所有者を比較して承認を取り直す。当日または翌日20時の一回タスクの期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。

登録前にTaskName衝突を確認

登録前にTaskName衝突を確認では、当日20時を計算し、現在以下なら翌日へ補正した上でNew-ScheduledTaskTrigger -Onceへ渡す。当日または翌日20時の一回タスクの例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。

$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -File "C:\Ops\NightlyReport.ps1"'
$trigger = New-ScheduledTaskTrigger -Once -At $runAt
$params = @{ TaskName = $taskName; Action = $action; Trigger = $trigger; Description = '次の20時に一回実行する承認済み処理' }
Register-ScheduledTask @params -WhatIf
$approval = Read-Host "登録する場合は実行日時 $($runAt.ToString('yyyy-MM-dd HH:mm')) を入力"
if ($approval -ne $runAt.ToString('yyyy-MM-dd HH:mm')) { throw '登録は承認されませんでした。' }
Register-ScheduledTask @params

過去日時、曖昧なローカル時刻、notepad等の対話アプリを無人タスクへ登録しない。DST地域では具体日時のオフセットも確認する。当日または翌日20時の一回タスクでプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。

NextRunTimeが計算値と一致するか

登録前に同名タスクがなければ完了後に解除し、既存ならExportしたXMLから承認手順で戻す。復旧操作にも同じ識別条件を使い、名前が似た別対象へ戻し処理を適用しません。

  • 当日または翌日20時の一回タスクの変更前値と取得時刻
  • 復旧対象: TaskName、TaskPath、算出したDateTime、現在時刻、Actionの絶対パスを同じ登録票にする
  • 復旧後の判定: 登録タスクのNextRunTimeが算出した未来の20時と一致し、実行後に結果と一回性を確認できる
  • 再実行を止める条件: 過去日時、曖昧なローカル時刻、notepad等の対話アプリを無人タスクへ登録しない。DST地域では具体日時のオフセットも確認する

実行後に一回限りだったか確認

過去日時、曖昧なローカル時刻、notepad等の対話アプリを無人タスクへ登録しない。DST地域では具体日時のオフセットも確認する。実行後に一回限りだったか確認に該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。

同名タスクがなければ新規、存在するなら上書きせずAction、Trigger、所有者を比較して承認を取り直す。当日または翌日20時の一回タスクではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。

期限切れタスクを整理する

計算した日時、登録日時、実行結果、解除期限を記録し、毎日トリガーへ意図せず変更しない。当日または翌日20時の一回タスクを繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。

期限切れタスクを整理するの識別軸TaskName、TaskPath、算出したDateTime、現在時刻、Actionの絶対パスを同じ登録票にする
採用する実測登録タスクのNextRunTimeが算出した未来の20時と一致し、実行後に結果と一回性を確認できる
0件時の扱い同名タスクがなければ新規、存在するなら上書きせずAction、Trigger、所有者を比較して承認を取り直す
保留にする兆候過去日時、曖昧なローカル時刻、notepad等の対話アプリを無人タスクへ登録しない。DST地域では具体日時のオフセットも確認する

当日または翌日20時の一回タスクの実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「TaskName、TaskPath、算出したDateTime、現在時刻、Actionの絶対パスを同じ登録票にする」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。

PowerShellを用いて特定の日時にタスクをスケジュールする方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「登録タスクのNextRunTimeが算出した未来の20時と一致し、実行後に結果と一回性を確認できる」、判定不能時は「同名タスクがなければ新規、存在するなら上書きせずAction、Trigger、所有者を比較して承認を取り直す」、中止時は「過去日時、曖昧なローカル時刻、notepad等の対話アプリを無人タスクへ登録しない。DST地域では具体日時のオフセットも確認する」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。

公式情報・参考資料

当日または翌日20時の一回タスクで使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次