この記事で直せること
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つずつ書きます。
- AllowStartIfOnBatteries: バッテリー駆動でも開始する(これが本体)
- DontStopIfGoingOnBatteries: 走っている途中で電源が抜けても止めない。これを入れないと、開始はするのに途中で落ちるという別の不発が起きます
- StartWhenAvailable: 時刻の時点で機械が止まっていた場合に、起動後に取り返して実行する
登録そのものをスクリプトでやっているなら、登録時に同じ設定を渡します。
$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つです。実際に当たった頻度の高い順に並べています。
- 機械が寝ている。時刻が来ても画面が消えてスリープしていれば動きません。時刻の決まったタスクには「タスクの実行時にスリープを解除する」(WakeToRun)を付けます。ただし電源プランの側で許可されていないと効きません。
powercfg /qh SCHEME_CURRENT SUB_SLEEPで RTCWAKE の値を見て、0 なら許可されていません - 実行するユーザーが未ログオン。「ユーザーがログオンしているときのみ実行する」になっていると、ログオフ中は動きません
- 実行ファイルの場所。作業フォルダ(WorkingDirectory)を指定していないと、相対パスで書いたファイルが見つからずに即終了します。このとき LastTaskResult には 0 以外が入るので、区別できます
- 同じタスクがまだ走っている。前回の実行が終わっていないと、既定では新しい実行をスキップします
再発させないために決めたこと
この件で決めたのは1つだけです。タスクを新しく登録したら、押して中身が動くところまで必ず見る。State が Ready になったことと、LastTaskResult が 0 であることを「登録できた」の証拠にしない。ログファイルが1行増えるか、プロセスが立つところまで確認して初めて、登録できたと言うことにしました。
ノートPCに定時の仕事を置くなら、電源の条件は毎回明示します。既定に任せると、机から離した日だけ静かに止まります。

Claude Codeとは何か、実際に投げた依頼文と直し方から説明する
CSVの文字化けと列ずれが止まる場所をPythonのコードで具体的に潰す手順
OpenAI APIキー発行の手順と予算上限を実測の実費から決める方法