ガイド

タスクスケジューラが実行されない(手動は動く)。原因がバッテリー駆動だった話と確認手順

2026-10-22

この記事で直せること

Windows のタスクスケジューラに登録した定時タスクが、時間になっても実行されない。けれど「実行する」を押すと動く。この状態の原因を切り分けて、動くところまで戻します。

ここに書くのは、2026年10月21日に実際に詰まって直したときの記録です。登録したタスクが3回続けて不発で、ログもプロセスも残っていませんでした。

まず見るのは State と LastTaskResult の組み合わせ

PowerShell でタスクの状態を見ます。

Get-ScheduledTask -TaskName "your_task" | Select-Object TaskName,State
Get-ScheduledTaskInfo -TaskName "your_task" | Select-Object LastRunTime,LastTaskResult,NextRunTime

ここで State が Queued のまま動かず、LastTaskResult が 0 だったら、この記事の症状です。0 は「成功」ではありません。「前回の実行は正常に完了しました」という意味の定数で、まだ一度も中身が走っていなくても 0 が入ります。ここを成功と読み違えると、原因がタスクの中身(スクリプト側)にあると思い込んで、延々と違う場所を探すことになります。

原因: バッテリー駆動のときは開始しない、が既定

タスクの設定には電源の条件があります。PowerShell から登録したとき、New-ScheduledTaskSettingsSet の既定値は次のようになっています。

(New-ScheduledTaskSettingsSet).DisallowStartIfOnBatteries
# True

DisallowStartIfOnBatteries が True。つまり、ノートPCが電源につながっていない状態では、時刻が来てもタスクは開始せず、待機(Queued)に入ります。バッテリー残量が十分でも関係ありません。AC に挿さっているかどうかだけを見ています。

実際に詰まったときの機械はバッテリー駆動で、残量は60%ありました。同じ機械の他のタスクは動いていたので、なおさら気づきにくい状態でした。先に登録してあったタスクは、別の経路で登録されていてこの値が False になっており、今回の登録スクリプトだけ指定を付け忘れていたのが差でした。

いま登録してあるタスクがどちらなのかは、こう見ます。

Get-ScheduledTask | ForEach-Object {
  [PSCustomObject]@{
    Name = $_.TaskName
    State = $_.State
    OnBattery = -not $_.Settings.DisallowStartIfOnBatteries
  }
} | Where-Object { -not $_.OnBattery }

ここに出てきたタスクは全部、電源が抜けていると動きません。

直し方

既存のタスクなら、設定だけ差し替えます。

$s = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
Set-ScheduledTask -TaskName "your_task" -Settings $s

3つ指定しています。意味が違うので、1つずつ書きます。

登録そのものをスクリプトでやっているなら、登録時に同じ設定を渡します。

$action  = New-ScheduledTaskAction -Execute "py" -Argument "-3 C:/path/to/your.py"
$trigger = New-ScheduledTaskTrigger -Daily -At 06:40
$set     = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
Register-ScheduledTask -TaskName "your_task" -Action $action -Trigger $trigger -Settings $set -Force

直すと State が Ready に戻ります。

これでも動かないときに次に見る場所

電源の条件が原因でない場合、残っている心当たりは次の4つです。実際に当たった頻度の高い順に並べています。

  1. 機械が寝ている。時刻が来ても画面が消えてスリープしていれば動きません。時刻の決まったタスクには「タスクの実行時にスリープを解除する」(WakeToRun)を付けます。ただし電源プランの側で許可されていないと効きません。powercfg /qh SCHEME_CURRENT SUB_SLEEP で RTCWAKE の値を見て、0 なら許可されていません
  2. 実行するユーザーが未ログオン。「ユーザーがログオンしているときのみ実行する」になっていると、ログオフ中は動きません
  3. 実行ファイルの場所。作業フォルダ(WorkingDirectory)を指定していないと、相対パスで書いたファイルが見つからずに即終了します。このとき LastTaskResult には 0 以外が入るので、区別できます
  4. 同じタスクがまだ走っている。前回の実行が終わっていないと、既定では新しい実行をスキップします

再発させないために決めたこと

この件で決めたのは1つだけです。タスクを新しく登録したら、押して中身が動くところまで必ず見る。State が Ready になったことと、LastTaskResult が 0 であることを「登録できた」の証拠にしない。ログファイルが1行増えるか、プロセスが立つところまで確認して初めて、登録できたと言うことにしました。

ノートPCに定時の仕事を置くなら、電源の条件は毎回明示します。既定に任せると、机から離した日だけ静かに止まります。

同じような作業を自動にできるかどうか、無料でお返しします。いまのファイルと手順を見せてください。

お問い合わせ →