音速のエンジニア

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

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

引き続き、タスクスケジューラでプログラムを自動実行する方法。

前回は「作業フォルダ」に関するトラブル事例を紹介しました。

onsoku-engineer.hatenablog.com

今回もトラブル事例のお話(二回目)。

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

自動実行するプログラムは、所謂ファイル転送系のツールで

指定したフォルダ内にあるファイルを、階層構造を保ちながら指定先のフォルダにコピーする的なやつです。

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

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

f:id:suz1955wb:20200629003912j:plain:w300

トリガー:
毎日、00:00

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

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

セキュリティオプション:
☑ユーザーがログオンしているかどうかにかかわらず実行する

指定したフォルダ内にあるファイルを、夜な夜なNASにバックアップさせます。

NASは、ネットワークドライブとして「Z:\」にマウント済み。

今回このタスクを実行するPCには、複数のユーザーアカウントがあり、「いつ」「どのユーザー」がログオンしているか分かりませんので、セキュリティオプションのユーザーがログオンしているかどうかにかかわらず実行するにチェックを入れています。

尚、デフォルトはユーザーがログオンしているときのみ実行するです。

この設定が問題を引き起こすことになろうとは、、、この時点では知る由もない。。。

さて、今回は何がアカンのか、、、

前回の失敗を踏まえて、作業フォルダはちゃんと指定しています。

ファイルの「コピー元」「コピー先」も正しく指定出来ているのに、コピーに失敗してしまいます。

試したこと

前回同様、適当にログ仕込んで、色々試してみる。

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

またしても期待通り動いたのは「1」だけ。

やはりタスクスケジューラが絡むと期待通り動かない。

コピー先の「Z:\」が無いと言われる。

いや、ちゃんとあるし。

上述した通り、今回はセットアップするPCの都合でセキュリティオプションを変更しているので、これを疑ってみる。

  1. ユーザーがログオンしているときのみ実行でテスト実行
  2. ユーザーがログオンしてるかどうかにかかわらず実行でテスト実行

お、「1」はうまくいったぞ。「2」は相変わらずアカン。

セキュリティオプションで挙動が変わっているのは確定。

しかし何故コピー先の「Z:\」が見えないんだ...?

ネットワークドライブさん、恥ずかしがらないで

原因を調べてみて分かったこと、ネットワークドライブはログオンしているユーザープロファイル毎に作成されるもので、PC全体に作成されるものではないということ。ユーザーがログオンしているかどうかにかかわらず実行するの場合、ネットワークドライブは無効になるそう。

もう、恥ずかしがりやさんっ。。。

そうと分かれば対策や

まず一つは、ネットワークドライブの代わりに「ネットワーク絶対パスを使用する」という方法。

Z:\XXXXXではなく\\192.168.XXX.XXX\XXXXXね。

どうしてもネットワークドライブを使用する場合は、タスク実行時にネットワークドライブ接続する必要がありそうだ。

プログラムに書いてもよし、バッチファイルに書いてもよし。

例えば、こんなバッチファイル。

net use Z:\ \\192.168.XXX.XXX\XXXXX
cd C:\Users\XXXXX\Documents\Hatena
hoge.exe
  1. net useコマンドで、Z:\にネットワークドライブ接続

  2. カレントディレクトリをC:\Users\XXXXX\Documents\Hatenaへ移動

  3. hoge.exeを実行

という流れだ。

ほいで、タスクスケジューラには、このバッチファイルを指定実行するようにする。

f:id:suz1955wb:20200629003916j:plain:w300

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

バッチファイルでネットワークドライブ接続する方法で、「1~3」全て期待通り動きました!ふぅ(汗

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

まとめ

  • タスクスケジューラから実行するプログラムでネットワークドライブを使用する場合、セキュリティオプションのユーザーがログオンしているかどうかにかかわらず実行するにチェックを入れていると、期待通り動かない。

    (ネットワークドライブはログオンしているユーザープロファイル毎に作成されるため)

  • その場合、ネットワークドライブの代わりに、ネットワーク絶対パスを使用する。

  • どうしてもネットワークドライブを使用する場合は、タスク実行時にネットワークドライブに接続するような仕組みを入れる。

タスクスケジューラ、もう卒業しよう。