先日、サーバーのバックアップにWindowsでは最速と言われているFastCopyを使用して、毎日のバックアップをサーバーからNASへ同期バックアップさせるようにしました。(その時の記事)
毎日のことなので自動でバックアップできるようにバッチファイルを作成しました。
ログオンしている状態でちゃんと動くことが確認できたので、ログオンしなくても深夜に動作するようにタスクスケジューラに登録しました。
バックアップできていない...。
次の日にちゃんとバックアップが行われているかどうか確認したところ。ファイルが更新された形跡がなく、タスクスケジューラが実行中のままで、タスクマネージャーにプロセス残っている状態でした。バッチファイルは開始されているけど、NASにバックアップが行われていない...。
いろいろ検索してみると、ログオンしていないときはネットワーク上の共有フォルダに接続できていない状態なので、NASに到達できずバックアップに失敗しているとのこと。
net useコマンドを使う
net useコマンドであらかじめネットワーク上の共有フォルダに接続できるようです。
net use \\コンピューター名 /user:ワークグループ\ユーザー名 パスワード
net use \\192.168.1.10 /user:WORKGROUP\hoshiya abcd1234
net use \\NAS\Share /user:WORKGROUP\hoshiya abcd1234
上記のようなコマンドを追加すれば接続を開始できます。接続を切断する場合は以下のようになります。
net use \\192.168.1.10 /delete /Yes
net use * /delete /Yes
/Yesはネットワーク切断の時に切断していいですか?と聞かれて止まらないようにするものです。*はすべてを切断するときに使えるのですが、マイコンピュータに設定しているネットワークドライブまで切断されてしまうので、ネットワークドライブを使っている場合は*を使わずIPアドレスやコンピュータ名で直接指定して切断した方がよさそうです。
試しにタスクを実行
一旦、ログアウト(サインアウト)して、タスクマネージャで以下のバッチファイルを実行させてみました。
Set Path=C:\"Program Files"\FastCopy net use \\NAS /user:WORKGROUP\hoshiya abcd1234 FastCopy.exe /cmd=sync /auto_close /log "D:\" /to="\\NAS\backup\d" FastCopy.exe /cmd=sync /auto_close /log "E:\" /to="\\NAS\backup\e" net use \\NAS /delete /Yes
無事にネットワーク上の共有フォルダにバックアップがでできましたが...。
タスクが終了しない
/auto_closeを指定しているのにバックアップ終了後にタスクが残ったままになっていました。ログオンしていない状態での実行では/auto_closeを指定しても、終了しないようです。
taskkillコマンドを使ってみる
taskkillというコマンドを使えば実行中のタスクを終了させることができるそうです。
taskkill /F /IM FastCopy.exe /T
上記のコマンドをバッチファイルに追記したところ、うまくいきました。自分の場合はうまくいきましたが、タスクによってはタスクの優先順位が上でtaskkillが効かない場合があるそうです。taskkillのコマンドの使い方やパラメーターについては以下を参照してください。
できた!
以下のバッチファイル(backup.bat)でログオン(サインイン)せずにサーバーとNASでフォルダーの同期をすることができました。
Set Path=%PATH%;C:\;C:\"Program Files"\FastCopy net use \\NAS /user:WORKGROUP\hoshiya abcd1234 FastCopy.exe /cmd=sync /auto_close /log "D:\" /to="\\NAS\backup\d" FastCopy.exe /cmd=sync /auto_close /log "E:\" /to="\\NAS\backup\e" net use \\NAS /delete /Yes taskkill /F /IM FastCopy.exe /T