2022年04月01日
カテゴリ:batファイル
タグ:#batファイル #robocopy #シェルスクリプト

更新ファイルだけを上書きする一括バックアップ.batの作り方

PCを使ったお仕事では、バックアップが必要不可欠です。
PCが突然動かなくなるかもしれませんし、メインPCとサブPCで同期したいことも多々あります。

ファイルのバックアップ方法は

  • Git等のバージョン管理システムを使う
  • GoogleDrive等のクラウドストレージサービスを使う
  • 外部ストレージにファイルをコピーする

など様々ですが、今回は一番シンプルかつ確実な、外部ストレージにファイルをコピーする方式について解説します。

さらに、コピーの方法も

  • ひとつひとつ更新されたファイルを確認しコピーしていく→手間がかかりすぎる
  • 保存対象の親フォルダを丸ごと全部コピーする→コピー量が膨大になり、毎回長時間を要する

などの課題がありますが、これら全てを解決する方法が
「robocopyコマンドを用いたbat(バッチ)ファイルを使う」方法です。

完成形の実例

今回もさっそく完成形を掲載して解説します。

まずはバックアップを取りたいファイル群の親フォルダと同じ階層で、右クリック→新規作成→テキストドキュメントを選択し、テキストファイルを新規作成します。

作成したファイルの名前を「backup.bat」に変更します。

「backup.bat」を任意のテキストエディタ(メモ帳でも可)で開き、下記のように記入します。

ソースコードのまま掲載が出来なかったので、キャプチャ画像で掲載します

これで、batファイルをコマンドプロンプトから実行するだけで、

  • 所定のフォルダの中身をすべて確認し
  • 更新されていなければスキップする
  • 更新されていれば上書きコピーする

という、かゆいところに手が届く機能を自動でやってくれます。

実行方法

batファイルと保存対象のフォルダの場所をエクスプローラで開きます。

フォルダのパスが表示されているテキストボックスをクリックし、「cmd」と入力してエンターキーを押します。

図のような黒い画面「コマンドプロンプト」が起動しますので、そこで「backup.bat (保存先ドライブのアルファベット)」と入力し、エンターキーを押します。(例ではFドライブ)

これで自動バックアップが実行されます。
コピー量が多い場合、しばらく画面が何も更新されず止まっているように見えますが、心配ありません。
数分で、もう一度コマンド入力待ちの行が表示されれば、バックアップ処理は完了です。

事項から順番に解説をしていきましょう。

@echo off

これは実行時のログを画面に表示させないようにするコマンドです。

「%1」と「NOT EXIST」

%(数字)は、コマンド実行時の引数を表します。
%1=第一引数、%2=第二引数という具合です。
backup.batの後ろに半角スペースを空けて入力したテキストを引数と言い、今回であれば保存先ドライブのアルファベットです。
つまりここでは、batファイル名の後ろにきちんと保存先ドライブを指定しているかを確認しているわけです。
もし引数が空であれば:PARAM_ERRORラベルに飛び、警告文を表示して動作終了します。
指定されたドライブが存在しない場合は:NOT_FOUND_ERRORラベルに飛び、警告文を表示して動作終了します。

「robocopy」コマンド

今回の主役になるコマンドです。
このrobocopyコマンドは、変更のあったファイルを判断して上書きファイルを自動選別してくれるだけでなく、
「保存元/先にだけ存在するファイルは消す」等のオプションも存在し、単純なファイルの保存だけでなく、完全なミラーコピー状態を保持するような用途にも使えます。

第一引数=保存元フォルダ
第二引数=保存先フォルダ
第三引数以降はオプションになります。

オプションを軽く説明すると

  • /E=保存元/保存先のどちらかにしか無いファイルでも、削除しない
  • /r:=失敗した時のリトライ回数(例では3回)
  • /log+:=実行結果のログ出力先を指定
  • /DCOPY:DAT=属性やタイムスタンプ等のオプション情報を維持する

robocopyコマンド単体の、オプションを含む詳細な解説は、すでに詳しく解説されているサイトを参考にして下さい。
念のため参考URLを貼っておきます。

https://tooljp.com/windows/chigai/html/robocopy/robocopy-mir-e-option-chigai.html

https://n-archives.net/software/robosync/articles/dcopy-dat/

このように、手作業では膨大な手間がかかってしまうような作業も、意外と簡単に自動化することができます。

また自前でプログラムを作るよりも、このようにすでに存在するコマンドを使う事で、思わぬ不具合によるデータ損失も防ぐことができます。

単純作業は積極的に自動化して、本業に集中しましょう!