タスクスケジューラでネットワークからのファイルコピーバッチが動かない場合の対処
概要
ネットワーク上のWindows共有フォルダなどから自動でファイルをコピーしたいというようなケースは多々あります。Windows環境でのファイルコピーはrobocopyという優秀なコマンドがあり、これを使用してバッチファイルを作り、タスクスケジューラで実行しよう、というのはすぐに思いつくと思います。
ただ、実際タスクスケジューラに登録してもうまく動いてくれないという場合もありますので良くある原因と対策についてメモしていきます。
あるある
例えばネットワーク共有フォルダをネットワークドライブとして割り当てているとします。
例)[\\192.168.1.1\work] を [Y:] に割り当てる
\\192.168.1.1\work 内の[test.txt]というファイルを定期的にクライアント環境のD:にコピーしたい、という要件があったときに単純にこのようなバッチを作ることがあると思います。
robocopy Y:test.text D: test.text
そして、これをダブルクリックして手動でするとうまく動くと思います。
しかし、タスクスケジューラに登録するとおそらく動かないです。
症状としてはしばらく実行中のままになり、そのうち失敗して(0x1)のエラーで終了すると思います。
原因
原因として、タスクスケジューラとして実行する場合には特定のプロファイルではなく、「ユーザがログオンしているかどうかに関わらず実行する」もしくは「最上位の特権で実行する」を選択している場合が多いかと思います。
そのような場合、ある特定のユーザープロファイルで保持しているネットワークドライブ接続情報とその認証情報が使用できないことになり、バッチファイル内に書かれている割り当て済みのネットワークドライブ Y: が認識できずにエラーが出ます。
対処法
特定プロファイルで手動でネットワークドライブの割り当てをするのではなく、バッチファイル内に、ネットワークドライブの割り当てと削除を記述することで回避できます。
net use Y: \\192.168.1.1\share /user:<ユーザID> <パスワード>
robocopy Y:<コピー元パス> D:<コピー先フォルダ> <ファイル名>
net use Y: /delet
まとめ
バッチが動けばタスクスケジューラでも普通に動くと勘違いしがちですが、思わぬところで引っかかることが沢山あります。とくに権限まわりやパス関連は注意が必要です。