AIエージェントが作った Windows 自動化が「静かに死んでいる」のを見抜いて直す
Botやコーディング AI に作らせたタスクスケジューラの常駐処理が、初回だけ成功して以後毎回失敗する壊れ方の判定・原因特定・恒久対策。最頻出原因は BOM なし UTF-8 による構文エラーで、PowerShell 5.1 経由でだけ再現する。実行せず構文検証する方法と、受け入れ条件の付け方まで。
約3.3万トークンの節約 (API料金換算で約49円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「AIエージェントが作った Windows 自動化が「静かに死んでいる」のを見抜いて直す」は、業務自動化カテゴリのAI指示書(MDファイル)です。Botやコーディング AI に作らせたタスクスケジューラの常駐処理が、初回だけ成功して以後毎回失敗する壊れ方の判定・原因特定・恒久対策。最頻出原因は BOM なし UTF-8 による構文エラーで、PowerShell 5.1 経由でだけ再現する。実行せず構文検証する方法と、受け入れ条件の付け方まで。この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約3.3万トークン(API料金換算で約49円)・86%のトークンを節約できます。
- カテゴリ
- 業務自動化
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約3.8万トークン
- この巻物使用時
- 約5,200トークン
- 節約量
- 約3.3万トークン (約49円)
- 更新日
- 2026-09-30
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/ai-windows/raw を読み込んで、この指示書どおりに実装して"
中身
AIエージェントが作った Windows 自動化が「静かに死んでいる」のを見抜いて直す
AIエージェント(ブラウザ操作型のBot、コーディングAI、自分自身)に 「毎晩フォルダを整理しておいて」のような常駐タスクを作らせると、 作った直後の1回だけ成功し、以後スケジュール実行は毎回失敗し続けるという壊れ方をする。
エージェントは「毎晩の掃除も入れました」と報告して終わるが、その報告に動作確認は含まれていない。 タスクスケジューラは失敗しても画面に何も出さないので、数週間気づかない。
この手順書は、(1) 生きているように見えるタスクが実は死んでいることの判定、 (2) 最頻出の原因である文字コード事故の特定、(3) 二度と壊れない直し方、を扱う。
対象: Windows + タスクスケジューラ + PowerShell。所要 5〜10分。
1. 「動いているつもり」を3つの数字で否定する
タスクが登録されていること(State=Ready)は動いている証拠にならない。次の3つを必ず突き合わせる。
Get-ScheduledTaskInfo -TaskName '<タスク名>' |
Select-Object LastRunTime, LastTaskResult, NextRunTime, NumberOfMissedRuns
LastTaskResultが 0 以外なら失敗。1は「実行したプログラムが異常終了した」で、原因は別途特定が要る。LastRunTimeが今日でも、失敗して即終了しているだけのことがある。時刻だけ見て安心しない。
そして必ず成果物の実体も見る。ここが決定打になる。
# 移動先に「初日以降のファイルが1件も無い」なら、初回手動実行しか成功していない
Get-ChildItem '<出力先フォルダ>' -Force |
Sort-Object LastWriteTime -Descending |
Select-Object -First 5 Name, LastWriteTime
判定パターン: 出力先の最新ファイルの日付が「エージェントが作業した日」で止まっている → その日の手動実行だけが成功し、以後のスケジュール実行は全滅している。
2. 原因の第一候補: スクリプトが BOM なし UTF-8 で保存されている
AIエージェントが書いたスクリプトファイルは、BOM なしの UTF-8 になっていることが非常に多い。
Windows PowerShell 5.1(powershell.exe。OS標準で、タスクスケジューラの既定はこちら)は
BOM が無いファイルをレガシーANSI(日本語環境では CP932)として読む。
その結果:
- スクリプト中の日本語リテラル(パス名・フォルダ名・比較文字列)が化ける
- 化けた結果クォートの対応が崩れ、実行以前に構文解析で失敗する
powershell.exeは終了コード 1 を返すだけ。処理は1行も走らない
PowerShell 7(pwsh)は BOM なしを UTF-8 と解釈するので、手元の pwsh では再現せず、
タスクスケジューラ経由でだけ壊れる。これが発見を遅らせる。
2-1. 先頭バイトを見る(1秒で判定できる)
$b = [System.IO.File]::ReadAllBytes('<スクリプトのパス>')
($b[0..2] | ForEach-Object { $_.ToString('X2') }) -join ' '
EF BB BF→ BOM 付き UTF-8。この問題ではない- それ以外(例
24 45 72=$Er…)→ BOM なし。日本語を含むなら真っ黒
2-2. 実行せずに構文だけ検証する
ファイルを走らせずに、PowerShell 5.1 がどう解釈するかだけを確かめられる。 副作用ゼロで断定できるので、直す前に必ずこれを通す。
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command @"
`$e = `$null
[void][System.Management.Automation.Language.Parser]::ParseFile('<スクリプトのパス>', [ref]`$null, [ref]`$e)
if (`$e) { `$e[0].Message } else { 'PARSE OK' }
"@
The string is missing the terminator: '. が出たら文字コード事故で確定。
3. 二度と壊れない直し方
3-1. BOM 付き UTF-8 で書き戻す
Set-Content -Encoding UTF8 は PowerShell のバージョンで挙動が変わる(7 では BOM なし)。
バージョンに依存しない .NET の API を使う。
$enc = New-Object System.Text.UTF8Encoding($true) # $true = BOM を付ける
[System.IO.File]::WriteAllText('<スクリプトのパス>', $script, $enc)
3-2. 日本語リテラルをコードポイントで組む(本命の対策)
BOM は、あとで誰か(や別のAI)がエディタで保存し直すと簡単に失われる。 そもそも非ASCII文字をソースに置かないのが恒久対策になる。
# 'D:\ダウンロード' を ASCII だけで組み立てる
$dl = 'D:\' + [char]0x30C0 + [char]0x30A6 + [char]0x30F3 + [char]0x30ED + [char]0x30FC + [char]0x30C9
# '旧'
$kyu = [string][char]0x65E7
$dest = Join-Path $dl $kyu
コードポイントは任意の言語で取れる(例: JavaScript なら '旧'.codePointAt(0).toString(16) → 65e7)。
可読性は落ちるので、各行の末尾に元の文字列をコメントで残す。
3-3. 終了コードを明示する
スクリプト末尾に exit 0 を書く。途中で握りつぶした非致命的エラーが
LastTaskResult を汚して「失敗しているように見える」のを防げる。
逆に本当に失敗した時だけ 0 以外を返すようにしておくと、以後は §1 の1行で健全性を判定できる。
4. 直ったことの確認(ここを省かない)
登録しただけ・書き直しただけで報告しない。実際に走らせて 0 を確認する。
Start-ScheduledTask -TaskName '<タスク名>'
Start-Sleep -Seconds 25
Get-ScheduledTaskInfo -TaskName '<タスク名>' | Select-Object LastRunTime, LastTaskResult
LastTaskResult : 0 と、成果物側の件数・最新日時が動いたことの両方を見る。
片方だけでは「何もせず正常終了した」と区別がつかない。
5. AIエージェントに常駐タスクを作らせる時の受け入れ条件
この事故は「エージェントが嘘をついた」のではなく、 エージェントの完了報告に検証が含まれていないことから起きる。指示の時点で条件を付ける。
- 作ったスクリプトの先頭3バイトを表示して、BOM 付きであることを示すこと
Parser::ParseFileで PARSE OK を示すことStart-ScheduledTaskで1回走らせ、LastTaskResult=0を示すこと- 成果物の実体(移動件数・出力ファイルの最新日時など)を数字で示すこと
「入れておきました」だけの報告は受け取らない。 そして作らせた側が後日 §1 を1回実行する(初回成功だけして翌日から死ぬ壊れ方があるため、 作った翌日にもう一度見るのが最も費用対効果が高い)。
付録: 他の原因(BOM でなかった場合)
LastTaskResult が 0 以外で、構文は PARSE OK だった時の切り分け順。
| 値 | 意味 | 見るところ |
|---|---|---|
1 | プログラムが異常終了 | スクリプトを手動実行してエラー本文を見る |
0x41301 | まだ実行中 | 前回が終わっていない。MultipleInstancesPolicy |
0x2 | ファイルが見つからない | -File のパス、作業ディレクトリ |
0x41303 | 一度も実行されていない | トリガーの StartBoundary が未来 |
加えて、タスクの LogonType を確認する。InteractiveToken はユーザーがログオンしていないと
走らない。無人運転させたいなら「ユーザーがログオンしているかどうかにかかわらず実行する」に変える
(ただし資格情報の保存が必要になるので、要否は運用者が判断する)。
Export-ScheduledTask -TaskName '<タスク名>' # 定義XMLを丸ごと見るのが速い
よくある質問
+「AIエージェントが作った Windows 自動化が「静かに死んでいる」のを見抜いて直す」とは何ですか?
Botやコーディング AI に作らせたタスクスケジューラの常駐処理が、初回だけ成功して以後毎回失敗する壊れ方の判定・原因特定・恒久対策。最頻出原因は BOM なし UTF-8 による構文エラーで、PowerShell 5.1 経由でだけ再現する。実行せず構文検証する方法と、受け入れ条件の付け方まで。
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約3.8万トークンかかりますが、この巻物を使えば約5,200トークンで済みます。差し引き約3.3万トークン(API料金換算で約49円)・86%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
Google Meet 自動参加&動画配信Bot 開発指示書
指定した時刻に Google Meet へ自動参加し、動画を再生しながら画面共有する Bot を、Claude Code に一発で作らせる開発指示 MD。朝会の定例動画配信・ウェビナーの自動放送に。
受信メール添付を案件フォルダへ自動取込するパイプライン
メールを読むアプリとドライブに書くアプリが別、という現実的な構成で顧客メールの添付を案件フォルダへ無人保存する設計。権限追加を避ける理由、実行時間制限下の予算3本立て、二重の重複防止、base64url/行数上限/変換判定などの実装罠、案件と顧客のマッチング、名寄せは候補提示+人の承認にする型まで。
Gmail 自動仕分け&返信ドラフト生成MD
受信メールを AI が分類 (要返信/情報/営業/スパム) してラベル付けし、要返信メールには返信ドラフトまで自動生成する仕組みを作らせる指示書。DWD (ドメイン全体委任) 設定手順込み。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア