PowerShellで特定の日に実行されるタスクスケジューラのタスクを取得する方法

任意日のscheduled run抽出では、表示名ではなくTaskPathとTaskNameを持つregistered taskを最初の対象キーにします。変更や集計へ進む前に対象日のstart/endと全trigger由来のrun timeを保存し、別対象を同じ結果へ混ぜないことが出発点です。

この手順の合格条件は「指定日の全予定時刻をtask path付きで列挙できた状態」です。Microsoft Learn:RegisteredTask.GetRunTimesの期間列挙とGet-ScheduledTaskInfoの実行履歴が定義するRegisteredTask.GetRunTimesの期間列挙とGet-ScheduledTaskInfoの実行履歴を根拠にし、画面へ値が出たことだけを成功とは判定しません。

停止条件:event・boot triggerをcalendar予定と誤認した。該当するときは操作を進めず、読み取り処理なのでtimezoneと対象日を直して再実行するを実行可能な形で確認してから再計画します。

目次

任意日のscheduled run抽出|完了像を先に言語化する:指定日の全予定時刻をtask path付きで列挙できた状態

特定日に動くタスクの抽出の成果物は変更済み設定ではなく、再現可能な確認結果です。Get-Dateの実行条件、時刻、件数とGet-ScheduledTaskの照合結果を残します。

繰り返し、イベントトリガー、起動時トリガーはNextRunTimeだけで完全判定できない。トリガー定義も確認する。 そのため、特定日に動くタスクの抽出の合格判定にはGet-ScheduledTaskだけでなく、トリガー、実行条件、LastTaskResult、実行プログラムを個別確認する手順を組み合わせます。

判断要素特定日に動くタスクの抽出で記録する内容
対象の識別TaskPath、TaskName、Trigger、実行ユーザー、NextRunTime
最初の確認Get-Date
変更または操作Get-ScheduledTask
再確認Get-ScheduledTask
中止条件同名タスクを上書きするか、無人実行の資格情報と影響が不明

任意日のscheduled run抽出|表示名以外のキーで選ぶ:TaskPathとTaskNameを持つregistered task

特定日に動くタスクの抽出で使うPowerShellの版は $PSVersionTable で、コマンドの提供元は Get-Command Get-Date で確認します。通常ユーザー。システムタスク詳細は管理者。対象候補が複数ならTaskPath、TaskName、Trigger、実行ユーザー、NextRunTimeを使い、表示名の部分一致だけで選びません(特定日に動くタスクの抽出ではGet-ScheduledTaskが同じ対象を返さない場合、読み取りのみなら復旧不要)。

  • 特定日に動くタスクの抽出: 実行端末と現在ユーザーを記録する
  • Get-Date: Source、Version、利用可能なパラメーターを確認する
  • TaskPath、TaskName、Trigger、実行ユーザー、NextRunTime: 変更前の値を日時付きで保存する(特定日に動くタスクの抽出ではGet-Dateの対象件数とGet-ScheduledTaskの再取得値を一致させます)。
  • 同名タスクのXML、実行ユーザー、トリガー、Settings、最終結果: 復旧に使えることを読み取り確認する(特定日に動くタスクの抽出ではGet-ScheduledTaskが同じ対象を返さない場合、読み取りのみなら復旧不要)。
  • 同名タスクを上書きするか、無人実行の資格情報と影響が不明: 該当すれば本番実行を見送る

任意日のscheduled run抽出|再取得できる初期値を控える:対象日のstart/endと全trigger由来のrun time

特定日に動くタスクの抽出の基準値を得るコマンドが次の例です。端末名、パス、ポート、ユーザーは説明用なので、実環境の固有IDを確認してから置き換えます。

$targetDate = [datetime]'2026-08-15'
$start = [datetime]::SpecifyKind($targetDate.Date, [DateTimeKind]::Unspecified)
$end = $start.AddDays(1)
$TASK_ENUM_HIDDEN = 1
[uint32]$maxRunsPerTask = 4096
$service = New-Object -ComObject 'Schedule.Service'
$service.Connect()
function Get-TaskFolderTree($folder) {
  $folder
  foreach ($child in @($folder.GetFolders(0))) { Get-TaskFolderTree $child }
}
$rootFolder = $service.GetFolder('\')
foreach ($folder in @(Get-TaskFolderTree $rootFolder)) {
  foreach ($task in @($folder.GetTasks($TASK_ENUM_HIDDEN))) {
    [uint32]$runCount = $maxRunsPerTask
    [datetime[]]$runTimes = @()
    $null = $task.GetRunTimes($start, $end, [ref]$runCount, [ref]$runTimes)
    $times = @($runTimes)
    if ([uint32]$times.Count -ne $runCount) { throw "GetRunTimes count mismatch for $($task.Path)" }
    if ($runCount -eq $maxRunsPerTask) { throw "Possible GetRunTimes truncation; narrow the interval for $($task.Path)" }
    $disabledTriggerCount = @($task.Definition.Triggers | Where-Object { -not $_.Enabled }).Count
    foreach ($run in $times) {
      [pscustomobject]@{
        TaskPath = $task.Path
        RunTime = $run
        TaskEnabled = [bool]$task.Enabled
        Hidden = $task.Definition.Settings.Hidden
        DisabledTriggerCount = $disabledTriggerCount
        VerifiedSchedule = ([bool]$task.Enabled -and $disabledTriggerCount -eq 0)
      }
    }
  }
}

Get-Dateが返す表示名は人向けで、復旧対象の識別には不足することがあります。TaskPath、TaskName、Trigger、実行ユーザー、NextRunTimeをCSVやJSONへ残します。

任意日のscheduled run抽出|環境差で変わる値を見抜く:NextRunTime一件だけで複数triggerを判定すること

指定日は端末のタイムゾーンで00:00以上、翌日00:00未満の半開区間として固定します。各結果にはTaskPath、TaskName、RunTime、Enabled、hidden taskを含めた列挙条件を残し、NextRunTime一件だけでその日の全予定を代表させません。

タスクスケジューラとはの確認結果は特定日に動くタスクの抽出の変更可否に直結します。同名タスクを上書きするか、無人実行の資格情報と影響が不明なら、タスクスケジューラとはの調査記録を残して実行を見送ります。

特定日の実行候補はRegisteredTask.GetRunTimesへ日付の開始時刻と翌日開始時刻を渡し、繰り返しを含む実際のRunTimeを列挙します。NextRunTime一件だけでは同日内の複数回実行を表せないため、TaskPath、TaskName、RunTime、Enabledを一行にします。

コードではルート配下のTaskFolderを再帰し、対象区間を開始以上・翌日未満として各登録タスクへ問い合わせます。端末のタイムゾーンと夏時間を記録し、RunTimeを文字列比較したりフォルダー階層を捨てたりしません。

応用時は取得したRunTimeをTrigger定義と照合し、無効タスクを別集計にします。イベント、起動時、ログオン時など固定時刻を持たないトリガーはGetRunTimesの結果だけで「実行されない」とせず、TriggerTypeを確認対象へ残します。

日時まで絞る場合はRunTimeをDateTimeのまま開始・終了境界と比較し、秒を丸めず目的の窓に含まれるか判定します。同名タスクが別TaskPathにあるケースを保持し、表示用文字列へ変換するのは抽出完了後にします。

Get-Dateで作る基準日は暗黙の「今日」ではなく、対象日を明示したDateTimeからDateとAddDays(1)を生成します。実行ホストのTimeZone.Idも記録し、UTCで保存された値とローカル境界を混在させません。

特定日に動くタスクの抽出でGet-ScheduledTaskを使う前に、Get-Command Get-ScheduledTaskでSourceとVersionを確認します。別モジュールの同名コマンドを実行しないためです。

Get-ScheduledTaskInfoはLastRunTime、LastTaskResult、NextRunTimeなど運用状態の補足に使います。繰り返し予定の全件列挙を代替できないため、GetRunTimesで得た候補へTaskPathとTaskNameで結合し、情報取得失敗を空予定として扱いません。

Where-Objectは全フォルダーから候補を作成した後、RunTimeの範囲やEnabledを明示条件で絞るために使います。フィルター前後の件数を保存し、表示名の部分一致で予定外のタスクを混ぜないようにします。

Sort-ObjectはRunTime、TaskPath、TaskNameの順で並べ、同じ時刻の結果も毎回同じ順になるようにします。並べ替えは重複除去ではないため、複数Triggerが同時刻を返した行はTrigger情報を確認してから統合します。

Select-ObjectではTaskPathを落とさず、TaskName、RunTime、Enabledとともに出力します。同名タスクを区別できるオブジェクトのままCSVへ渡し、Format-Tableの表示文字列を監査データとして保存しません。

任意日のscheduled run抽出|戻せる材料を先にそろえる:読み取り処理なのでtimezoneと対象日を直して再実行する

特定日に動くタスクの抽出は読み取り中心ですが、出力には端末名、SID、IP、メールアドレスなどが含まれる場合があります。保存先のACLと保管期限を決め、共有時は必要列だけに限定します。

任意日のscheduled run抽出|previewから限定実行へ進む:TaskPathとTaskNameを持つregistered task

特定日に動くタスクの抽出の追加確認例です。システムを変更する命令ではなく、Get-Dateの結果を別の列や範囲で確かめる目的で使います。

Get-ScheduledTask | ForEach-Object {
  $task = $_
  foreach ($trigger in @($task.Triggers)) {
    [pscustomobject]@{ TaskPath=$task.TaskPath; TaskName=$task.TaskName; TriggerType=$trigger.CimClass.CimClassName; Enabled=$trigger.Enabled; StartBoundary=$trigger.StartBoundary }
  }
}

特定日に動くタスクの抽出の操作後は次の変更へ進まず、Get-ScheduledTaskで同じTaskPath、TaskName、Trigger、実行ユーザー、NextRunTimeを再取得します。

任意日のscheduled run抽出|件数と識別値で合否を決める:指定日の全予定時刻をtask path付きで列挙できた状態

「PowerShellで特定の日に実行されるタスクスケジューラのタスクを取得する方法」で特定日に動くタスクの抽出を判断する場面では、Get-ScheduledTaskでは、変更前に保存したTaskPath、TaskName、Trigger、実行ユーザー、NextRunTimeと同じ対象を選びます。トリガー、実行条件、LastTaskResult、実行プログラムを個別確認することで、別スコープの値を成功結果として採用しません(特定日に動くタスクの抽出ではGet-Dateの対象件数とGet-ScheduledTaskの再取得値を一致させます)。

Get-ScheduledTask | ForEach-Object {
  $task = $_
  $info = $task | Get-ScheduledTaskInfo
  [pscustomobject]@{ TaskPath=$task.TaskPath; TaskName=$task.TaskName; LastRunTime=$info.LastRunTime; LastTaskResult=$info.LastTaskResult; NextRunTime=$info.NextRunTime }
}
  • Get-ScheduledTask: 同じ対象IDを再取得できた
  • 特定日に動くタスクの抽出: 意図した値または件数だけが変化した
  • トリガー、実行条件、LastTaskResult、実行プログラムを個別確認する: 関連機能も異常がない(特定日に動くタスクの抽出ではGet-ScheduledTaskが同じ対象を返さない場合、読み取りのみなら復旧不要)。
  • タスクパス違い、無効状態、イベントトリガー、参照権限不足: 取得失敗をゼロ件として扱っていない
  • 繰り返し、イベントトリガー、起動時トリガーはNextRunTimeだけで完全判定できない。トリガー定義も確認する。: 環境固有の制約に反していない

任意日のscheduled run抽出|不明な状態を成功へ丸めない:event・boot triggerをcalendar予定と誤認した

Get-Dateが「見つからない」ときは、Get-CommandとGet-Module -ListAvailableで提供元を確認します。特定日に動くタスクの抽出が非対応のEditionなら、名前が似たコマンドへ置き換えません。

「PowerShellで特定の日に実行されるタスクスケジューラのタスクを取得する方法」の対象を特定日に動くタスクの抽出として検証するときは、Get-ScheduledTaskで別の対象が返った場合、表示名の一致ではなくTaskPath、TaskName、Trigger、実行ユーザー、NextRunTimeで取り直します。誤対象への変更があれば追加操作を止めます。

特定日に動くタスクの抽出で予想外の警告が一件でも出たら、対象数と時刻を記録して停止します。別の設定変更で警告を相殺しようとしません。

任意日のscheduled run抽出|復旧失敗時の停止点を置く:読み取り処理なのでtimezoneと対象日を直して再実行する

読み取りのみなら復旧不要。タスクを変更する場合はExport-ScheduledTaskでXMLを保存し、同名タスクを上書きしない。

特定日に動くタスクの抽出を戻した後はGet-DateとGet-ScheduledTaskを再実行し、TaskPath、TaskName、Trigger、実行ユーザー、NextRunTimeが変更前記録と一致することを確認します。復旧処理にも失敗したら連続操作を止め、保存した同名タスクのXML、実行ユーザー、トリガー、Settings、最終結果とログを担当者へ渡します(特定日に動くタスクの抽出ではGet-Dateの対象件数とGet-ScheduledTaskの再取得値を一致させます)。

任意日のscheduled run抽出|引継ぎに必要な列を残す:対象日のstart/endと全trigger由来のrun time

  • Get-Dateの実行時刻、対象件数、エラー件数を残した
  • TaskPath、TaskName、Trigger、実行ユーザー、NextRunTimeで対象を一意に特定した(特定日に動くタスクの抽出ではGet-ScheduledTaskが同じ対象を返さない場合、読み取りのみなら復旧不要)。
  • 同名タスクのXML、実行ユーザー、トリガー、Settings、最終結果を変更前に保存して読めることを確認した(特定日に動くタスクの抽出ではGet-Dateの対象件数とGet-ScheduledTaskの再取得値を一致させます)。
  • Get-ScheduledTaskの対象を一端末・一ユーザー・一設定に限定した
  • Get-ScheduledTaskと実利用テストの両方を確認した
  • 同名タスクを上書きするか、無人実行の資格情報と影響が不明場合は実行を中止した

断定できません。特定日に動くタスクの抽出ではタスクパス違い、無効状態、イベントトリガー、参照権限不足でも空になります。エラーを表示し、権限とスコープを確認してからGet-ScheduledTaskまたは別の公式な取得方法で照合します(特定日に動くタスクの抽出ではGet-ScheduledTaskが同じ対象を返さない場合、読み取りのみなら復旧不要)。

任意日のscheduled run抽出|運用で生じる疑問を切り分ける:日跨ぎrepetitionをどちらの日へ含めるか

権限だけが原因とは限りません。繰り返し、イベントトリガー、起動時トリガーはNextRunTimeだけで完全判定できない。トリガー定義も確認する。 同名タスクを上書きするか、無人実行の資格情報と影響が不明なら昇格して続行せず、対応Edition、対象ID、ポリシー、復旧経路を確認します(特定日に動くタスクの抽出ではGet-Dateの対象件数とGet-ScheduledTaskの再取得値を一致させます)。

公式情報・参考資料

この記事を書いた人

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

コメント

コメントする

目次