タスクスケジューラでプログラムを自動実行する(トラブル事例②)
引き続き、タスクスケジューラでプログラムを自動実行する方法。
前回は「作業フォルダ」に関するトラブル事例を紹介しました。
onsoku-engineer.hatenablog.com
今回もトラブル事例のお話(二回目)。
自動実行するプログラムについて
自動実行するプログラムは、所謂ファイル転送系のツールで
指定したフォルダ内にあるファイルを、階層構造を保ちながら指定先のフォルダにコピーする
的なやつです。
タスクを作成してテスト実行
前回、前々回の手順を参考に、タスクを作成します。
作成が完了したら、正常に動作するかテスト実行します。
トリガー: 毎日、00:00 プログラム/スクリプト: C:\Users\XXXXX\Documents\Hatena\hoge.exe 開始(オプション): C:\Users\XXXXX\Documents\Hatena セキュリティオプション: ☑ユーザーがログオンしているかどうかにかかわらず実行する
指定したフォルダ内にあるファイルを、夜な夜なNASにバックアップさせます。
NASは、ネットワークドライブとして「Z:\」にマウント済み。
今回このタスクを実行するPCには、複数のユーザーアカウントがあり、「いつ」「どのユーザー」がログオンしているか分かりませんので、セキュリティオプションのユーザーがログオンしているかどうかにかかわらず実行する
にチェックを入れています。
尚、デフォルトはユーザーがログオンしているときのみ実行する
です。
この設定が問題を引き起こすことになろうとは、、、この時点では知る由もない。。。
さて、今回は何がアカンのか、、、
前回の失敗を踏まえて、作業フォルダはちゃんと指定しています。
ファイルの「コピー元」「コピー先」も正しく指定出来ているのに、コピーに失敗してしまいます。
試したこと
前回同様、適当にログ仕込んで、色々試してみる。
- プログラムを直接実行
- タスクスケジューラからテスト実行
- タスクスケジューラから自動実行
またしても期待通り動いたのは「1」だけ。
やはりタスクスケジューラが絡むと期待通り動かない。
コピー先の「Z:\」が無いと言われる。
いや、ちゃんとあるし。
上述した通り、今回はセットアップするPCの都合でセキュリティオプションを変更しているので、これを疑ってみる。
ユーザーがログオンしているときのみ実行
でテスト実行ユーザーがログオンしてるかどうかにかかわらず実行
でテスト実行
お、「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
net use
コマンドで、Z:\
にネットワークドライブ接続カレントディレクトリを
C:\Users\XXXXX\Documents\Hatena
へ移動hoge.exe
を実行
という流れだ。
ほいで、タスクスケジューラには、このバッチファイルを指定実行するようにする。
ほな、タスクを作成してテスト実行
バッチファイルでネットワークドライブ接続する方法で、「1~3」全て期待通り動きました!ふぅ(汗
- プログラムを直接実行
- タスクスケジューラからテスト実行
- タスクスケジューラから自動実行
まとめ
タスクスケジューラから実行するプログラムでネットワークドライブを使用する場合、セキュリティオプションの
ユーザーがログオンしているかどうかにかかわらず実行する
にチェックを入れていると、期待通り動かない。(ネットワークドライブはログオンしているユーザープロファイル毎に作成されるため)
その場合、ネットワークドライブの代わりに、ネットワーク絶対パスを使用する。
- どうしてもネットワークドライブを使用する場合は、タスク実行時にネットワークドライブに接続するような仕組みを入れる。
タスクスケジューラ、もう卒業しよう。