エンジニアを目指す日常ブログ

日々勉強したことのメモ。独学ですので間違っていたらコメント等で教えてください。

外付けHDDにデータバックアップを取る方法(Windows公式コマンドrobocopy利用)

はじめに

今回の記事の目的

ソースコードや各種ドキュメント、写真などをローカルPCから外付けハードディスクにバックアップする方法を記載します。 ファイル同期ツールは無料のものも出ていますが、どれが怪しいか判断できないので、Microsoftが公式で提供しているWindowsのコマンドを利用することにします。

今回は自分のメモ兼、パソコン初心者にもわかるように丁寧に手順を書いてみます。

利用するのはrobocopyコマンドです。

docs.microsoft.com

前提

目標

今回は、以下の内容をバックアップします。

  • コピー元フォルダ: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

ログファイル名に/が入ってしまうと良くないので、分解するために変数yearmonthdayに分けて最後に結合しています。

set year=%date:~0,4%

この記載で%date%の「0文字目から、4文字分」を取得できることになります。(頭の文字を0文字目と数えます。)

hourminutesecondも同様に取得しています。

最後に各値を結合して、変数logfilenameをログファイル保存先に指定しています。

set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second%

robocopy ~省略~ /log:C:\Users\User\vagrant\ubuntu64_18\robocopy_log\%logfilename%.log

おわりに

Windowsコマンドを利用することで、自分でバックアップ処理を実装することができました。

ここまでできれば、タスクスケジューラを利用した自動実行もできそうです。

ただ私の環境では外付けハードディスクを常に接続しているわけではないので、気づいたときにバックアップするようにします。