技術ログ

Windowsタスクスケジューラで自動化する人がハマる3つの罠

公開: 2026-05-19 · 著者: Sasaki Ryuji

Windowsタスクスケジューラは便利だが、3つの罠を知らないと半日溶ける

Windowsタスクスケジューラで自動化する人がハマる3つの罠

あなたがWindowsで自動化を組もうとしてタスクスケジューラを使ったとき、最初の数回は必ずどこかで詰まります。私はGramShift + ai-pick + W2 note + バックアップなど、合計20個以上のWindowsタスクを毎日運用していますが、最初の頃は1つのタスクを正常稼働させるのに半日溶けることがありました。この記事では、私が踏み抜いた典型的な3つの罠と、その回避策を実例とともに残します。

罠1: exit code 9009 — コマンドが見つからない

Windowsタスク実行結果でもっとも頻繁に見るエラーが exit code 9009 です。「'XXX' は内部コマンドまたは外部コマンドとして認識されていません」というメッセージが出るパターンで、原因は WorkingDirectory の設定漏れです。

具体例で見せます。タスクスケジューラで node scripts/generate.mjs を実行する設定にした場合、WorkingDirectory が空欄だと C:\Windows\System32 がカレントディレクトリになります。そこには scripts/generate.mjs は存在しないので、ファイルが見つからず exit 9009 になります。

PowerShell でタスクを登録する場合は、New-ScheduledTaskAction-WorkingDirectory を必ず明示します。

# 正しい登録例
$action = New-ScheduledTaskAction \
 -Execute 'node' \
 -Argument 'scripts/generate-articles.mjs --site lab' \
 -WorkingDirectory 'C:\AI_WORK\ai-pick' # 必須

$trigger = New-ScheduledTaskTrigger -Daily -At 10:00
Register-ScheduledTask -TaskName 'Lab_Daily' -Action $action -Trigger $trigger

WorkingDirectory を明示すれば exit 9009 はほぼ起きません。私は最初の頃、この値を空欄のまま登録して何度もハマりました。1ヶ所気づくのに3時間溶かしたことがあります。

罠2: bat ファイルの改行コードが LF だと全タスク落ちる

Windows の bat ファイルは CRLF 改行が必須です。LF (Unix形式) で保存すると、bat 内のコマンドが正しく解釈されず、エラーメッセージが大量に出ます。「'-' は内部コマンドまたは外部コマンドとして認識されていません」というような、一見原因不明のエラーが連鎖的に発生します。

このトラブルは、bat ファイルを Visual Studio Code や WSL で編集していると起きがちです。VS Code はデフォルトで LF 改行を使うため、新規 bat ファイルを保存すると LF で保存されます。WSL でも同様です。回避策はエディタの設定で bat ファイルだけ CRLF にすることです。

VS Code の場合、.gitattributes または settings.json で以下を設定します。

// .vscode/settings.json
{
 "[bat]": { "files.eol": "\r\n" }
}

// または .gitattributes
*.bat eol=crlf

私はこの設定を入れる前、bat ファイルを LF で保存して全タスクが朝に一斉エラーを返す、という事故を起こしました。原因に気づくまで1時間かかり、その日の予定が完全に潰れました。

罠3: 結果コード267011 と 267014 の違い

タスクスケジューラの「結果」欄に表示されるコードは、初心者には意味不明です。よく出る結果コードの意味を理解しておくと、トラブル対応が大きく早くなります。

  • 0: 成功
  • 267009: タスク実行中 (まだ完了していない)
  • 267011: 未実行 (1回も起動していない or 前回成功フラグなし)
  • 267014: ユーザー終了 or タスク自体が異常終了 (子プロセスがハング等)
  • 9009: コマンドが見つからない (WorkingDirectory 設定漏れ等)
  • 3221226505 (0xC000013B): STATUS_LOCAL_DISCONNECT、プロセス強制終了系

朝起きて Dashboard 通知を見て「Result 267014」を見つけたら、おそらくは前夜のタスクがハングして強制終了されたパターンです。ログを確認して、再実行で復旧することがほとんどです。「Result 9009」なら WorkingDirectory 設定を見直します。コードの意味を覚えておくだけで、原因究明の時間が半分以下になります。

これから始めるなら 3つの罠を意識して回避する

Windowsタスクスケジューラは、個人開発の自動化基盤として優れたコスパです。月コストゼロ、設定すれば毎日確実に実行され、エラーログも残ります。しかし「最初に詰まる3つの罠」を知らないと、1つのタスクを動かすのに半日溶かす場面があります。WorkingDirectory を明示する、bat は CRLF で保存する、結果コードの意味を覚える、この3点を意識すれば、運用の立ち上がりが大きく早くなります。

20以上のタスクを並走させて自動化帝国を作るのは、最初の数週間さえ越えれば誰でも到達できる水準です。私の運用記録は技術ログカテゴリ、複数Workerの並走戦略は個人開発カテゴリに追記しています。