USBメモリというのが世の中には存在します。しかしUSBメモリというのはコントローラが貧弱である場合が多いほか、(衝撃に強いとはいえ)落下などのダメージを強く受ける場合があり、データ消失の可能性が高いデバイスであると言わざるを得ません。
そのため初心者ながらrobocopyを用いて簡単にUSBメモリをバックアップし、7-zipで圧縮するバッチファイルを書きました。参考になれば幸いです。
前提
robocopy
が使用できるWindows- 7-zipが導入されており、パスが通っている(環境変数が適切に設定されている)
バッチファイル
robocopy 保存元 "保存先" /COPYALL /z /j /s /e /R:3 /W:1 /MT:4
attrib cd "保存先のフルパス" /s /d -h -s
timeout /t 5
cd "保存先の一つ上のフォルダ"
7z -t7z -mx9 -mmt=適切なコア数 -r -sdel a 適切な名前.7z "保存先"
軽い解説
一応何も解説がないバッチファイルを実行する勇気はないかと思いますので、それぞれの段階ごとに簡単な解説をしていこうと思います。
robocopy
robocopyコマンドはWindowsに標準で付いているファイルをコピーするコマンドです。似たようなコマンドとしてcopy
やxcopy
などがありますが、robocopy
は「Windows の堅牢性の高いファイル コピー」と名乗っているように、コピーを確実に行おうとするという特徴があります。使い方によってはUNIX系OSに搭載されているrsync
のような使い方が可能です。
今回は「/COPYALL /z /j /s /e /R:3 /W:1 /MT:4
」と多数のオプションをつけたので箇条書き形式でその意図を書いていこうと思います。
- /COPYALL - 全ての属性をコピーします。アーカイブから元に戻すとき何かが欠落されていても困ると思うので。
- /z - 再開可能モードでコピーします。何らかの不具合でコピーが中断したとしても、その場所からコピーを再開できるようにしています。
- /j - IOバッファなしでコピーします。USBメモリに大きなファイルがある場合を考慮したものです。特にないなら消しても問題ないと思います。
- /s・/e - サブディレクトリを含めます。これらを指定しないとコピー元のルートディレクトリしかコピーされず、USBメモリ内のフォルダの中身がコピーされません。sとeの違いは空の(emptyな)ディレクトリを含めるか否からしいのですが、/eが空のディレクトリを含めるだけなのか、/sを包括しているのかが微妙に分からないので両方指定しています。多分/sは要らない気はしていますが…
- /R:3 - コピーに失敗したときの再試行までの待機時間。一応3秒待っています。
- /W:1 - 再試行回数。2回トライしてダメだったら多分3回目もダメだと思うので。
- /MT:4 - スレッド数の指定らしい。でもこの処理に強くマルチスレッド性能が必要だとは思えないので、別にいくつでもいいとは思います。
attrib
attribコマンドは、ファイルやディレクトリに設定されている「属性」を表示・編集するコマンドです。Windowsに「隠しファイル」の概念がありますが、これは隠しファイル属性が付いているか否かで判断されています。
USBメモリはおそらくF:やG:などのドライブ文字を割り当てて使用されるかと思いますが、このようなものから丸ごとコピーした場合コピー先のフォルダが隠しディレクトリとなってしまいます。そのためattrib
を用いて解除することで、状況を把握しやすくします。そのため必須というわけではありませんが、エクスプローラーを見ながら進捗状況を確認できるというのは良い利点ではないでしょうか。
今回は「/s /d -h -s
」というオプションを付けました。この意図について箇条書きで書きます。
- /s - サブディレクトリにも適用します。これは先程のrobocopyと同様にサブディレクトリに漏れがないようにするためです。副作用としてUSBメモリ内に隠しファイルを使うようなソフトウェアをインストールしていた場合、それが隠しファイルでは無くなってしまうという点がありますが、基本的にそういったものに下手に触らなければ問題はないはずなので大きな問題にはならないと思います。
- /d - ディレクトリにこのオプションを適用します。attribコマンドはファイルの属性を変更することを主目的としているので、ディレクトリに対しても属性を変えるよう明言しておきます。
- -h - 隠しファイル属性を削除します。
- -s - システムファイル属性を削除します。多分USBメモリの中にシステムファイル属性があるようなファイルを放り込んでいる人はいないと思うので。UACで面倒になるよりは属性を切っておこうという感じです。
timeoutとcdは説明するまでもないので省略します。
7z
7-zipはGUI経由で使う人が多いかとは思いますが、きちんとCUI経由でも用いることが可能です。オプションの指定方法が若干独特なのを理解する場そこまで難しくはないと思います。ここで用いたオプションは「-t7z -mx9 -mmt=適切なコア数 -r -sdel
」です。簡単に箇条書きで説明します。
- -t7z - 圧縮ファイル形式を7-zip形式にしています。-tzipにすればZIP形式で、-tgzipにすればgzip形式で保存することもできます。
- -mx9 - 圧縮率を最高設定にしています。速度を犠牲にしていますが小さいほうがいいですよね。
- -mmt - 並列スレッド数を指定できます。環境によって異なるので適切な値を入力してください。
- -r - サブディレクトリも圧縮対象にします。
- -sdel - 圧縮が完了したら元のファイルを削除します。消す手間を省けて便利ですね。
関連リンク
- Windowsの「robocopy」コマンドでフォルダをバックアップ/同期させる - ITmedia
- Qiitaで見つかった有用そうな記事
- USBメモリの耐久性をテストした結果とは? - USBメモリがどれくらいで故障するのかという調査を紹介するGIGAZINEの記事