こんにちは。
動かないのだが。
只野です。
動かないんだが!
Windowsコマンドバッチを作ってタスクスケジューラで定期的にネットワークドライブのファイルをコピーしようとしたら
できないのだが!
はい。パソコンは気分屋。とかで話を終わらせらる事ができればよいのですが、仕事でやっているならば諦めることは許されません。
IT関連で何が原因でなぜ動かないのかを解決するのが、システムエンジニアとして仕事をしているプロ意識というものです。
ちなみにWindowsコマンドは下記の内容が含まれています。
・PC内に設定されているネットワークドライブの特定フォルダからローカルへファイルコピー
そんでまず原因は何なのかを調べるためにタスクスケジューラを利用しないで直接バッチファイルを起動する訳です。
動くんですよ。
そうなると次はタスクスケジューラを疑う訳です。
そんでタスクスケジューラで動かない原因の大体は上記画像で囲っているバッチを実行するユーザー関連です。
Windowsのタスクスケジューラを設定するときは上記画像の「ユーザーがログオンしているかどうかにかかわらず実行する」、「最上位の特権で実行する」の設定にして作成します。なぜならいつでも動いて欲しい事がほとんどだからです。
ネットワークドライブに接続するタイプのバッチを登録した時も上記設定にして実行しました。
そこで試しに設定を「ユーザーがログオンしている時のみ実行する」にして実行してみました。
動くんですよ。
これで原因は実行するユーザーの権限問題だと判明しました。それで権限系で考えられる原因は下記だと考えます。
- バッチ実行ユーザーがコピー先フォルダに書き込み権限がない。
- バッチ実行ユーザーがネットワークドライブへの接続情報を持っていない。
そして今回の場合は2個目である「バッチ実行ユーザーがネットワークドライブへの接続情報を持っていない。」が原因でした。
冷静に考えてみれば確かにそうだのお話です。ネットワークドライブへの接続情報を保持しているユーザーは作成したユーザーのみアクセスできるようにしている事がほとんどです。今回の場合もそうです。
ではバッチユーザーがネットワークドライブを参照するためにはどうすればよいか。
簡単に考えると実行時にコマンドで毎回接続するほうが良いと考えます。
はい。そんなわけで下記コマンドをバッチファイル内の先頭に記載します。このコマンドはネットワークドライブに接続してローカル内のドライブに割り当てる命令です。
net use ドライブレター: \フォルダパス パスワード /user:ユーザアカウント
使い方の例はこうなります。
net use S: \\192.168.0.1\hoge passw0rd /user:user1
例は対象のネットワークドライブパスをSドライブとしてマウントしています。この命令をバッチファイル先頭で実行すればバッチ実行ユーザーでも対象のネットワークドライブの接続ができるようになります。
はい。これで原因の解決ができたと考えられるので、タスクスケジューラでユーザー実行設定を「ユーザーがログオンしているかどうかにかかわらず実行する」、「最上位の特権で実行する」の設定をして再度タスクスケジューラから実行してみました。
無事に動くようになりました。めでたしめでたし。
今回の原因はわかれば大したことがない問題です。ですがこういった小さい問題が一番はまったりする問題でもあります。
とりあえずタスクスケジューラからbatファイルが実行できない場合、今回のようにネットワークドライブを利用してないか一度確認してみてください。
ちなみにタスクスケジューラの設定でユーザーを上記設定にするとタスク実行時にコマンド画面が起動しない場合もありますので、コマンド画面が起動しなくても動いていないと認識せずに、自身が実行しようとした命令が動作しているかで結果確認をする事も大切です。
タスクスケジューラ画面で再表示ボタンを押し、タスクが正常終了していたらあとは自身の実行しようとした命令通り動作している結果確認の流れです。
本日はこの辺で