Windowsのファイルを簡単バックアップ:robocopyコマンド

2021/10/24

(最終更新: 2022/9/09

Windowsのファイルを簡単バックアップ:robocopyコマンド

Windowsに保存しているソースコードや各種ドキュメント、写真などをバックアップする方法を紹介します。

今回はローカルPCから外付けハードディスクにバックアップします。

無料のバックアップツール(ファイル同期ツール)もありますが、怪しいソフトはインストールしたくないので、

Microsoftが公式で提供しているWindowsのコマンド

を利用することにします。

今回はできるだけ簡単に、パソコン初心者にもわかるように解説してみます。 外付けハードディスクさえ手元にあれば、無料で実施できます。

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

参考:robocopy | Microsoft Docs

目標

以下の内容でバックアップします。

  • コピー元フォルダ: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等、他の文字コードになっていると、文字化けしてうまく動作しません。

SJIS

前提

  • OSはWindows10またはWindows11です。
  • 外付けハードディスクはI-O DATAの製品「EC-PHU3W1」を利用しています。別のメーカーのモノでも問題ありません。

実際使った製品

I-O DATA HDD ポータブルハードディスク 1TB USB3.0バスパワー対応 日本製 EC-PHU3W1

商品リンクはもしもアフィリエイト様より提供されたものを利用しています。

生産終了しており値段が上がっているように見えます。

後継機種はこちらのようです。私は以下の基準で選びました。

  • HDD
  • 1TB
  • ポータブル
  • IO-DATA製

backup.batファイルの中身を記載する

backup.batファイルを右クリック→編集で中身を記載します。

変更する必要があるのは10行目のみです。 [ ] の中身は自身の状況に合わせて記載します。

  • コピー元、コピー先はファイルのパスではなく、コピー元フォルダの絶対パスを指定することに注意してください。
  • コピーから除外したいフォルダが複数ある場合は、/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:[ログファイルを置くフォルダ名]\%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

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はサブディレクトリを意味します。

このオプションを入れることで、コピー元フォルダ直下のファイルだけでなく、その下にあるフォルダの中身もコピーしてくれます。

/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側であらかじめ用意された変数です。

現在の日付を表示することができます。

%date%の利用例
> echo %date%
2021/10/24

上の例からわかるように、%date%変数は年/月/日の形式で出力されます。

2021/10/24の形式ではなく2021-10-24の形式でファイル名に設定したいため、この文字列を変数yearmonthdayに分けて最後に結合することにします。

以下の記載で、%date%変数の頭4文字を取り出しyear変数に代入することができます。

date変数の設定
set year=%date:~0,4%

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

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

最後に各値を結合して、変数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ファイルを実行することでバックアップを取ることができるようになりました。

原始的な方法ですが、いったん十分です。

参考文献



個別連絡はこちらへ→Twitterお問い合わせ

プロフィール

プロフィールイメージ

はち子

事業会社のシステム部門で働きはじめて5年目の会社員。システム企画/要件定義/システムアーキテクチャ等。

Twitter→@bun_sugi

過去の記事について

はてなブログに掲載の記事(主にプログラミングメモ)についてはこちらに掲載しております。(本ブログに移行中)

タグ一覧

関連記事

Copyright© 2023, エンジニアを目指す日常ブログ

お問い合わせ|プライバシーポリシー