ログやバックアップなどでフォルダを定期的に移動したい用事があったので、コマンドとタスクスケジューラでやってたときに気づいたことをご報告です。
robocopyを使おう、という結論に至りました。
移動したいバックアップやログ
ある場所にバックアップを取得すると、上書きしない限りバックアップしたデータは蓄積していきます。
ログファイルなんかも同様、Linuxのlogrotateのような仕組みがなければログが上書きされない限りどんどん蓄積していきます。(ここではツールを使わずにコマンドなどで自作した場合の実行結果をファイルに書き出しているケースなんかが該当します。ツールとかシステムのログファイルなんかは自動的に古いログを整理してくれるようにだいたいなっています。)
あるフォルダに蓄積したサブフォルダをまとめて移動しようと考えたところからスタートします。
moveコマンド
フォルダやファイルの移動には内部コマンドであるmoveコマンドを使用します。Linuxでいうところのmvコマンドと同じです。
そこで今回は、バックアップ取得場所「C:\temp\test」から別の場所へのデータ移動を、日時でmoveコマンドを使ったアーカイブを実行すれば良いと最初は考えました。
こんな感じ。
移動先は今回「C:\temp\Archive\231002」を用意しました。
moveコマンドの基本構文は、
MOVE %移動元ファイルパス% %移動先ファイルパス%
という具合に、copyコマンド同様の構文になります。今回の場合は、
move "C:\temp\test\231002-*" "C:\temp\Archive\231002"
こんな感じ。「231002-」で始まるフォルダ全部を対象とするために「*」ワイルドカード指定で"C:\temp\Archive\231002"配下に移動してしまいます。
実際に実行してみたところ、
ん?
moveコマンドのパスに「*」ワイルドカードを使うと、moveコマンドではエラー「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」となってしまうようです。※ちなみに試した中でファイルの移動なら「*」ワイルドカードが使えることは確認しました。
何回手を変えてやってみてもダメでした。うーん、アスタリスク入れちゃダメなのかなぁ。
robocopyの出番
moveコマンドを諦めて、それならrobocopyを使えるんじゃないかと考えて実施してみました。結論を言ってしまうと移動ならrobocopyの方が使い勝手が良好です。moveコマンドのように「*」ワイルドカードを使ってもきちんと狙い通りの移動が出来ことが確認できました。ただ、注意点は一点あります。
まず、構文から。("robocopy /?"で確認)
ROBOCOPY %移動元ファイルパス% %移動先ファイルパス% %オプション%
ファイルパスはサブディレクトリ全体を対象にするからmoveコマンドのようにサブディレクトリの名前を指定しなくてもデフォルトで「*.*」が対象になるのと、移動の際にはオプションに「/MOVE」を指定する必要があるということのようです。(※ファイルの移動の際にはオプションは「/MOV」になるようです。)
さっそく、やってみたのは
robocopy "C:\temp\test" "C:\temp\Archive\231002" /move
ん?
なんか、スキップされたみたい。
もう一回オプションを読んでみると、
/E :: 空のディレクトリを含むサブディレクトリをコピーします。
これも追加しないとサブディレクトリとその中のファイルを移動できないようです。
もう一回
robocopy "C:\temp\test" "C:\temp\Archive\231002" /move /E
実行してみると、
できました。最後のエラーはたぶんカレントディレクトリC:\temp\testを削除しようとしたけどコマンドプロンプトでカレントディレクトリになっているからエラーになったと言うことだと思います。この辺はバッチファイルとかジョブで使う時にもうちょっとちゃんと調べておこう。
移動されたフォルダの確認
実際のフォルダを確認すると、
移動元フォルダは空っぽになっていて、
移動先フォルダに
ちゃんと狙ったフォルダが移動していることが確認できました。
フォルダ内のテストファイルもちゃんと移動されています。
使ってみたけど、robocopy、高機能でかなり様々な局面でファイル操作に使えそうです。フォルダミラーリングとか簡易なバックアップツールとして使えるという評判を今更ながら実感しました。
今までコマンドやバッチファイルとBunBackupでおおむね間に合っていたからrobocopyに縁がなかったけど、もうちょっと試してみて使いこなせるようになるとバッチファイルに組み込むときにでも役に立つ局面とかもあるかなぁと思いました。