ガイド

Python文字化け対策:batのパスに\rが混入し終了コード2で落ちる原因と修正手順

2026-11-07

この記事で切り分けられること

Windows のタスクスケジューラで動かしている bat が、特定のタイミングから終了コード2(LastTaskResult=2)で落ちるようになった場合の切り分け方を書く。本体のスクリプトは動いているのに bat 全体は失敗する、というパターンが対象になる。

症状

営業の定時タスク outreach_daily の LastTaskResult が 2 になっていた。10/27 0:49 の実行も失敗している。タスク本体の処理(run_outreach.py daily)は正常に動いていたため、タスク全体が失敗していることに気づくのが遅れた。

気づけたきっかけは、本人からの「他の作業が止まっていないか」という確認で、同じホストで動いている他の予定タスクも含めて LastTaskResult を全件確認したことだった。

Get-ScheduledTask | Select-Object TaskName, @{N='LastRunTime';E={$_.LastRunTime}}, @{N='LastTaskResult';E={(Get-ScheduledTaskInfo $_.TaskPath$_.TaskName).LastTaskResult}}

原因

scripts/outreach_daily.bat の12行目の中身を調べたところ、py -3 scripts の後に見た目では分からない CR(0x0D)が1文字挟まり、続けて un_ai_gig_watch.py という文字列になっていた。つまり本来 scripts\run_ai_gig_watch.py と書いたつもりの行の、バックスラッシュ(0x5C)の位置が復帰文字(0x0D)に化けていた。

Python 側はそのパスのファイルが存在しないため終了コード2を返し、bat 全体がその終了コードを引き継いで2で終わっていた。営業本体のスクリプトは別行で呼ばれており、そちらは正しく動作していたため、気づくまで時間がかかった。

直し方

  1. 対象の bat の該当行をバイト単位で読み、怪しい位置に 0x0D があるかを確認する。
  2. 見つかった 0x0D を本来のバックスラッシュ 0x5C に置換する。
  3. 置換後、該当の Python スクリプトを単体実行して終了コードが0になることを確認する。
py -3 -c "print([hex(c) for c in open(r'C:/Users/<あなたのユーザー名>/scripts/outreach_daily.bat','rb').read()[i:j]])"

i, j には該当行の先頭と末尾あたりのバイト位置を入れて、範囲を少しずつ狭めながら確認する。0x0D が見つかったら、エディタ(Write や Edit など)でその行を書き直し、再度保存する。

py -3 scripts\run_ai_gig_watch.py

修正後は run_ai_gig_watch.py 単体で終了コード0になることを確認してから、bat 全体をもう一度実行して LastTaskResult が0になることまで見る。

それでも駄目なときに次に見る場所

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

お問い合わせ →