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
を記述すると、カレントディレクトリが「バッチファイルがあるフォルダ」になります。こうしておくと、タスクスケジューラの「開始(オプション)」を正しく設定してもしなくても、正しく動作します。
参考:タスクスケジューラ関連記事
そのほか、タスクスケジューラの使用例や、起こりがちなトラブルの対処方法、その他知っておくと便利なことなどを以下の記事にまとめています。併せてご覧下さい。
おわりに
今回の記事は以上です。
当サイトでは、ITインフラ関連の知識やノウハウをメインに紹介しています。下の関連記事にも役立つ情報があるかもしれませんので、ぜひご覧下さい。
また、知識やノウハウを効率的に学ぶ方法として、Udemy の「ながらセミナー」もおすすめです。三日坊主にならず、普段の生活の中でスキルアップする方法です。これについては下の記事で紹介していますので、良ければご覧下さい。
最後まで読んでいただき、ありがとうございました。
フィードバック
あなたが抱えている疑問や悩みは解決できたでしょうか?当ブログではそれを最重視しています。今後もあなたの役に立つ情報を提供するために、ぜひ教えて下さい。
コメント