はじめに
今回の記事の目的
ソースコードや各種ドキュメント、写真などをローカルPCから外付けハードディスクにバックアップする方法を記載します。 ファイル同期ツールは無料のものも出ていますが、どれが怪しいか判断できないので、Microsoftが公式で提供しているWindowsのコマンドを利用することにします。
今回は自分のメモ兼、パソコン初心者にもわかるように丁寧に手順を書いてみます。
利用するのはrobocopy
コマンドです。
前提
- OS:Windows
- 外付けハードディスク:I-O DATA www.iodata.jp
目標
今回は、以下の内容をバックアップします。
- コピー元フォルダ:
C:\Users\User\vagrant\ubuntu64_18
フォルダ配下のファイルを、コピー先フォルダ:E:\vagrant
フォルダにバックアップする。 - コピー元フォルダの中にはさらにフォルダがある(階層構造になっている)が、中身まですべてコピーする。
- ただし、コピー元フォルダの配下にあるフォルダのうち、以下のフォルダ配下のものはバックアップしない。(容量が大きい&いつでもインストールできるため)
- バックアップの実行は、定期的ではなく随時手動で実施するものとする。(自動でやりたい場合は、タスクスケジューラを併用する必要がある)
- バックアップのたびにログファイルを所定のフォルダに保存する。
実施内容(事前準備)
.bat
ファイルを作成
コピー元フォルダの配下に新規ファイルを作成します。ファイル名はbackup.bat
とします。
コピーするフォルダ名に日本語が含まれる場合は、backup.bat
ファイルの文字コードは S-JISとします。
S-JISで保存する方法は以下のサイトが参考になります。 genchan.net ※コードに日本語が含まれる場合はS-JISにする必要があることもこのサイトのおかげで知りました。
.bat
ファイルの記載内容
backup.bat
ファイルを右クリック→編集で中身を記載します。
[ ] の中身は自身の状況に合わせて記載します。コピー元はファイルパスではなくフォルダパスを指定することに注意してください。
コピーから除外したいフォルダが複数ある場合は、/xd [コピーから除外したいフォルダ名]
を、半角スペースを空けて複数記載します。
コマンドの内容については次の章で説明します。
backup.bat
set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% set hour=%time:~0,2% set minute=%time:~3,2% set second=%time:~6,2% set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second% robocopy [コピー元フォルダのパス] [コピー先フォルダのパス] /s /xd [コピーから除外したいフォルダ名] /xf [コピーから除外したいファイル名] /log /log:[ログファイルを置くフォルダ名]\%logfilename%.log pause
私の場合は以下のようになります。
backup.bat
set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% set hour=%time:~0,2% set minute=%time:~3,2% set second=%time:~6,2% set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second% robocopy C:\Users\User\vagrant\ubuntu64_18 E:\vagrant /s /xd node_modules /xd .vagrant /xd robocopy_log /xf backup.bat /log:C:\Users\User\vagrant\ubuntu64_18\robocopy_log\%logfilename%.log pause
実施内容(バックアップ実行)
バックアップ実行
作成したbackup.bat
をダブルクリックします。
こんな感じでコマンドプロンプトが開き、バックアップ処理が実行されると思います。
1度目は時間がかかりますが、2度目以降はWindowsが差分を検知して、差分があるファイルだけをコピーしてくれるので、実行時間は早くなります。
これ以降は、気づいたときにbackup.bat
をダブルクリックするだけで、バックアップを実行できます。
バックアップ結果の確認
コピー先フォルダを確認し、コピーの結果を確認します。
ログの確認
こんな形で、日付と時刻の入ったログファイルが生成されています。
ログが出ていれば成功です。
今後、「気づいたらバックアップに失敗している!」という事態が起こったときには、ログを確認して原因を探ることができます。
backup.batファイルの解説
バッチファイル(.batファイル)に記載した内容の解説です。興味が無ければ読まなくてOKです。
robocopy
実際にバックアップしてくれているのは、robocopy
コマンドです。基本的な構文は以下になります。
robocopy [コピー元フォルダのパス] [コピー先フォルダのパス] 例) robocopy C:\Users\User\vagrant\ubuntu64_18 E:\vagrant
以降の記載はオプション(引数)になります。引数は、基本構文の後ろに続けて記載します。引数と引数の間には半角スペースを入れます。
/s
/s
はサブディレクトリもコピーするという意味です。
このオプションを入れることで、コピー元ファイル直下のファイルだけでなく、その下にあるフォルダの中身もコピーしてくれます。
/xd
/xd
は、コピー対象からフォルダを除外するオプションです。
/xd [フォルダ名]
と記載することで、特定のフォルダを除外できます。フォルダ名にはパスを指定する必要はないようです。私は
/xd node_modules
と記載することで、コピー元配下にあるnode_modules
フォルダはすべてコピー対象から除外されていました。
/xf
/xf
は/xd
のファイル版です。
/xf [ファイル名]
と記載することで、特定のファイルを除外できます。正規表現も使えるため、頑張れば器用な指定も可能です。
特定のファイルのみをコピーしたい場合
今回は実施していませんが、特定のファイルのみをバックアップしたい場合は以下のように記載します。
robocopy [コピー元フォルダのパス] [コピー先フォルダのパス] [ファイル名] (例) robocopy C:\Users\User\vagrant\ubuntu64_18 E:\vagrant sample.txt
ファイル名には正規表現も利用できます。
ログ取得のためのコマンド
robocopy
コマンドは、以下のオプションをつけることでログをファイルに保存できます。
/log:[ログファイルのパス名] (例) /log:C:\Users\User\log\20211024.log
/log
コマンドは、指定されたファイルにログを書き込みますが、既に同じ名前のファイルが存在する場合には上書きします。
今回は、上書きされないようにログのファイル名を「実行した日時」にしてみます。
ログファイル名の作成
以下の記載はログファイル名を作成しています。
set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% set hour=%time:~0,2% set minute=%time:~3,2% set second=%time:~6,2% set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second%
以下の資料を参考にしました。
【.bat(バッチ)】ログファイルに日付と時刻を指定し出力してみる!【中級★★★】|SHARE-OB
set
は環境変数を設定するコマンドですが、.bat
ファイルの中で利用した場合は、そのファイル内でのみ利用できる変数となります。また、変数を利用したいときは%
で囲みます。
試しに以下のようなバッチファイルを作成して実行すると、コマンドプロンプトに4
が表示されているのが確認できます。
(例) set a=4 echo %a% pause
また、%date%
はあらかじめ用意されたコマンドで、日付を表示することができます。
>echo %date% 2021/10/24
ログファイル名に/
が入ってしまうと良くないので、分解するために変数year
、month
、day
に分けて最後に結合しています。
set year=%date:~0,4%
この記載で%date%
の「0文字目から、4文字分」を取得できることになります。(頭の文字を0文字目と数えます。)
hour
、minute
、second
も同様に取得しています。
最後に各値を結合して、変数logfilename
をログファイル保存先に指定しています。
set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second% robocopy ~省略~ /log:C:\Users\User\vagrant\ubuntu64_18\robocopy_log\%logfilename%.log
おわりに
Windowsコマンドを利用することで、自分でバックアップ処理を実装することができました。
ここまでできれば、タスクスケジューラを利用した自動実行もできそうです。
ただ私の環境では外付けハードディスクを常に接続しているわけではないので、気づいたときにバックアップするようにします。