タスクスケジューラでバッチがうまく動作しない原因は?

Windows全般
スポンサーリンク

Windowsのタスクスケジューラは有用なのですが、簡単そうで意外とうまくいかず、ハマることがあります。今回は「単体ではうまく動作するバッチファイルが、タスクスケジューラから実行させると失敗するケース」の対処方法を紹介します。

こんな現象

Windowsのタスクスケジューラで、自作のバッチファイルを定期的に実行しようとしたが、うまく動作しない。でも、そのバッチを普通にダブルクリックして実行させると問題なく動作する

タスクスケジューラ上では、指定日時にバッチの起動自体はできているようだが、正しい実行結果が出ていない。しかも「前回の実行結果」が「0x1」とかになっているし…

結論:バッチのパスを設定してみる

クドクドと解説する前に、この記事の結論です。タスクスケジューラで該当タスクのプロパティを開き、[操作]タブから「操作の編集」画面を開き「開始(オプション)」欄を確認してみて下さい。下の画面のように空になっている場合、バッチがうまく動作しないケースが多いです。

空欄の場合、ここに「バッチファイルがあるフォルダのパス」を設定してみて下さい。下の画面の例のように、バッチファイルのパスが「C:\batch\main.bat」の場合、「開始(オプション)」欄には「C:\batch」を設定すればOKです。

原因と解説

上のように「開始(オプション)」を設定すると、何が変わるのでしょうか。それは、バッチ開始時の「カレントディレクトリ」が次のようになります。

  • 「C:\batch」を設定した場合:カレントディレクトリが「C:\batch」になる
  • 空欄の場合:カレントディレクトリが「C:\Windows\system32」になる(環境次第か)

そして、バッチファイルをエクスプローラーからダブルクリックして実行した場合、カレントディレクトリは「バッチファイルがあるフォルダ」になります(「C:\batch\main.bat」 の場合は「C:\batch」)。

バッチファイルが、カレントディレクトリによって動作が変わるケースは結構ありがちです(作成者が気づいていないケースも多そう)。具体的には次のような場合です。

例えばこんなバッチ構成だと…

メインバッチファイル C:\batch\main.bat の内容:

call sub.bat

サブバッチファイル C:\batch\sub.bat の内容 :

@echo Hello World > success.txt

上記のように、「main.bat」では、同じディレクトリ内の「sub.bat」を呼び出しています。相対パスで呼び出していますので、バッチ開始時のカレントディレクトリが「C:\batch」なら問題なく動作します。しかし、カレントディレクトリが「C:\Windows\system32」の場合、「C:\Windows\system32\sub.bat」を呼び出そうとします。当然呼び出しは失敗し、バッチは正常に動作しません。

上で紹介した現象は、このような原因によって「タスクスケジューラで実行したときだけうまく動作しない」となったわけです。

補足

今回の現象の回避方法として、バッチファイル側で対策することもできます。バッチファイルの最初に以下のコマンド

cd %~dp0

を記述すると、カレントディレクトリが「バッチファイルがあるフォルダ」になります。こうしておくと、タスクスケジューラの「開始(オプション)」を正しく設定してもしなくても、正しく動作します。

終わりに

フィードバック

コメント

タイトルとURLをコピーしました