音速のエンジニア

やったことを音速で忘れてしまう?とあるエンジニアの備忘録

タスクスケジューラでプログラムを自動実行する(トラブル事例①)

前回、タスクスケジューラでプログラムを自動実行する方法を紹介しました。

onsoku-engineer.hatenablog.com

今回は、そんなタスクスケジューラ絡みのトラブルのお話。

自動実行するプログラムについて

自動実行するプログラムは、自作した物で

  • 実行ファイル(exe)
  • 設定ファイル(ini)

の組み合わせになっており、
プログラム実行時に実行ファイル(exe)と同じ階層にある設定ファイル(ini)を読み込んでから
動作するようになっています。

タスクを作成してテスト実行

前回の手順を参考に、タスクを作成します。
作成が完了したら、正常に動作するかテスト実行します。

プログラム/スクリプト:
C:\Users\XXXXX\Documents\Hatena\hoge.exe

なんか動かない、、、

なんだろう、なんか変。
プログラムは実行されるんだけど、肝心の処理が動いてないように見える。

起動は出来るのに動かない、、、ナニソレ汗

試したこと

自作のプログラムだし、適当にログ仕込んで、色々試してみる。

  1. プログラムを直接実行
  2. タスクスケジューラからテスト実行
  3. タスクスケジューラから自動実行

期待通り動いたのは「1」だけ。いやまぁ、そりゃ「1」は動くでしょ。そもそも。
タスクスケジューラが絡むと期待通り動かない、、、
うーん、起動はするんだよな。設定ファイル(ini)が読み込めてないとか?

ズズーっ(珈琲飲む音)。。。

カレントディレクトリ!お前か!!

仕込んだログから、設定ファイル(ini)が読み込めていないのは確定。
設定が無いので肝心の処理が行えずにエラー終了。

では、何故設定ファイル(ini)が読み込めていないのか?

プログラム実行時に実行ファイル(exe)と同じ階層にある設定ファイル(ini)を読み込んでから、動作するようになっています。

ここです、タスクスケジューラが絡むと期待通り動かない理由。

カレントディレクトリ!

作業場所、作業フォルダのことですね。

タスクスケジューラから実行したプログラムの作業フォルダは、デフォルトで「Windowsのシステムフォルダ」になるみたいです。

設定ファイル(ini)は、実行ファイル(exe)と同階層にあるので、これでは読み込むことが出来ませんね、、、

実行方法 作業フォルダ
プログラムを直接実行 実行ファイルのあるフォルダ
C:\Users\XXXXX\Documents\Hatena
タスクスケジューラから実行 Windowsのシステムフォルダ
C:\Windows\System32

タスクスケジューラで実行するプログラムの作業フォルダを指定する

では、タスクスケジューラで実行するプログラムの作業フォルダを指定しましょう。

  1. 対象のタスクを選択 > ダブルクリック(または、右クリック > プロパティ) > プロパティを表示
    f:id:suz1955wb:20200412005248j:plain:w300
  2. 「操作」タブ > 開始するプログラムをリストから選択 > ダブルクリック(または、「編集」をクリック)
    f:id:suz1955wb:20200412232340j:plain:w300
  3. 「開始(オプション)」に、作業フォルダを入力
    f:id:suz1955wb:20200412232336j:plain:w300

編集が終わったら「OK」をクリックして画面を閉じます。

プログラム/スクリプト:
C:\Users\XXXXX\Documents\Hatena\hoge.exe

開始(オプション):
C:\Users\XXXXX\Documents\Hatena

タスクを作成してテスト実行(今度こそ)

さぁ、もう一度テスト実行してみましょう。

自分を信じて!

タスクスケジューラを信じて!!

どぉりゃぁぁぁ(・Д・)ノ

はいっ!「1~3」全て期待通り動きました!!

  1. プログラムを直接実行
  2. タスクスケジューラからテスト実行
  3. タスクスケジューラから自動実行

まとめ

  • タスクスケジューラでプログラムを実行するときは、「作業フォルダ」を指定する
  • 指定しない場合、「Windowsのシステムフォルダ」になる

続いてトラブル事例②へ。

タスクスケジューラって罠がいっぱい、、、