Windowsに保存しているソースコードや各種ドキュメント、写真などをバックアップする方法を紹介します。
今回はローカルPCから外付けハードディスクにバックアップします。
無料のバックアップツール(ファイル同期ツール)もありますが、怪しいソフトはインストールしたくないので、
Microsoftが公式で提供しているWindowsのコマンド
を利用することにします。今回はできるだけ簡単に、パソコン初心者にもわかるように解説してみます。 外付けハードディスクさえ手元にあれば、無料で実施できます。
今回利用するのはrobocopy
コマンドです。
目標
以下の内容でバックアップします。
- コピー元フォルダ:
C:\Users\User\vagrant\ubuntu64_18
- コピー先フォルダ:
E:\vagrant
※外付けHDD - コピー元フォルダの中にはさらにフォルダがある(階層構造になっている)が、中身まですべてコピーする。
- ただし、コピー元フォルダの配下にあるフォルダのうち、以下のフォルダやファイルはバックアップしない。
robocopy_log
(フォルダ).vagrant
(フォルダ)node_modules
(フォルダ)backup.bat
(ファイル)
- ただし、コピー元フォルダの配下にあるフォルダのうち、以下のフォルダやファイルはバックアップしない。
- バックアップの実行は、定期的な自動実行ではなく、気づいたときに手動で実施する。
- 自動でやりたい場合は、タスクスケジューラを併用する必要があるので難しくなります。今回は割愛します。
- バックアップのたびに、バックアップの成功/失敗を示すログファイルを所定のフォルダに保存する。
実施内容(事前準備)
backup.bat
ファイルを作成
コピー元フォルダの配下に新規ファイルを作成します。「メモ帳」を利用すればOKです。
ファイル名はbackup.bat
とします。
コピーするフォルダ名に日本語が含まれる場合は、backup.bat
ファイルの
文字コードは
S-JIS
とします。ファイルを保存する際に、「エンコード」を「ANSI」に設定すると、S-JISで保存できます。UTF-8等、他の文字コードになっていると、文字化けしてうまく動作しません。
前提
- OSはWindows10またはWindows11です。
- 外付けハードディスクはI-O DATAの製品「EC-PHU3W1」を利用しています。別のメーカーのモノでも問題ありません。
実際使った製品
商品リンクはもしもアフィリエイト様より提供されたものを利用しています。
生産終了しており値段が上がっているように見えます。
後継機種はこちらのようです。私は以下の基準で選びました。
- HDD
- 1TB
- ポータブル
- IO-DATA製
商品リンクはもしもアフィリエイト様より提供されたものを利用しています。
backup.bat
ファイルの中身を記載する
backup.bat
ファイルを右クリック→編集で中身を記載します。
変更する必要があるのは10行目のみです。
[ ]
の中身は自身の状況に合わせて記載します。
- コピー元、コピー先はファイルのパスではなく、コピー元フォルダの絶対パスを指定することに注意してください。
- コピーから除外したいフォルダが複数ある場合は、
/xd [コピーから除外したいフォルダ名]
を、半角スペースを空けて複数記載します。
コマンドの内容については次の章で説明します。
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:[ログファイルを置くフォルダ名]\%logfilename%.log
pause
目標に記載した通りの条件では、以下のようになります。
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
11-18行目では、robocopy
コマンドのオプションを設定しています。行頭の半角スペースは必ず必要です。
実施内容(バックアップ実行)
バックアップ実行
作成したbackup.bat
をダブルクリックします。
コマンドプロンプトが開き、バックアップ処理が実行されます。
1度目は時間がかかりますが、2度目以降はWindowsが差分を検知して、差分があるファイルだけをコピーしてくれるので、実行時間は早くなります。
これ以降は、気づいたときにbackup.bat
をダブルクリックするだけで、バックアップを実行できます。
バックアップ結果の確認
コピー先フォルダを確認し、コピーの結果を確認します。
ログの確認
日付と時刻の入ったログファイルが生成されています。
ログファイルを開いてみましょう。
以下のようなログが出ていれば成功です。 今後、「気づいたらバックアップに失敗している!」という事態が起こったときには、ログを確認して原因を探ることができます。
backup.batファイルの解説
バッチファイル(.batファイル)に記載した内容の解説です。
robocopy
今回、ファイルのバックアップ動作を行うのはrobocopy
コマンドです。基本的な構文は以下になります。
robocopy [コピー元フォルダのパス] [コピー先フォルダのパス]
# 例)
robocopy C:\Users\User\vagrant\ubuntu64_18 E:\vagrant
robocopy
以降の記載は引数(オプション)になります。引数は、基本構文の後ろに続けて記載します。引数と引数の間には半角スペースを入れます。
また、引数をたくさん入れるとコマンドが横に伸びて、見にくくなります。
そのような場合に横に伸びるのを防ぐため、Windowsの.bat
ファイルでは、コマンドの途中でも^
を入れれば改行してよいことになっています。
# 横に長いコマンド)
robocopy C:\Users\User\vagrant\ubuntu64_18 E:\vagrant
# ^を入れて、途中で改行する)
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
ファイル名には正規表現も利用できます。
/log:ログ取得のためのオプション
robocopy
コマンドは、以下のオプションをつけることでログをファイルに保存できます。
/log:[ログファイルのパス名]
(例)
/log:C:\Users\User\log\20211024.log
/log
コマンドは、指定されたファイルにログを書き込みますが、既に同じ名前のファイルが存在する場合には上書きします。
今回は、ログのファイル名が「{実行した日時}.log
」になるようにしました。
ログファイル名の作成
robocopy
コマンドとは関係ありませんが、解説します。
以下の処理でログファイル名を作成しています。
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
が表示されているのが確認できます。
# 例)aという変数に4を設定して表示する
set a=4
echo %a%
pause
また、%date%
はWindows側であらかじめ用意された変数です。
現在の日付を表示することができます。
> echo %date%
2021/10/24
上の例からわかるように、%date%
変数は年/月/日
の形式で出力されます。
2021/10/24
の形式ではなく2021-10-24
の形式でファイル名に設定したいため、この文字列を変数year
、month
、day
に分けて最後に結合することにします。
以下の記載で、%date%
変数の頭4文字を取り出しyear
変数に代入することができます。
set year=%date:~0,4%
%date%
の「0文字目から、4文字分」を取得できることになります。(頭の文字を0文字目と数えます。)
hour
、minute
、second
も同様に取得しています。
最後に各値を結合して、変数logfilename
をログファイル保存先に指定しています。各変数の間には、見やすいように-
や_
を挿入します。
set logfilename=%year%-%month%-%day%_%hour%-%minute%-%second%
最期にrobocopy
コマンドに/log
オプションを追加すれば完成です。
log:C:\Users\User\vagrant\ubuntu64_18\robocopy_log\%logfilename%.log
おわりに
Windowsコマンドを利用することで、自分でバックアップ処理を実装することができました。
ここまでできれば、タスクスケジューラを利用した自動実行もできそうです。 外付けHDDを常に接続しておくこと(物理的にでも、無線ネットワークでもOK)ができれば、自動実行が合理的です。
今回はそこまで作成できませんでしたが、たまに外付けHDDをPCに優先接続して、.bat
ファイルを実行することでバックアップを取ることができるようになりました。
原始的な方法ですが、いったん十分です。