robocopy コマンドで簡易バックアップの仕組みを用意する

先週末にメインで使っていたPCが大破。
微妙なマシンは幾らか有していた為、
そのうちのスティックPCで暫しの間過ごす事に。

データ関連は外付け USB HDD への保存を基本としていたので
移行作業自体は接続の変更だけで終了したのだが、
タスク登録していたバックアップバッチはシステムドライブ上に在り
直ぐ取り出す事も侭ならず、仕方ないので書き直すことにした。

書き直すとは言っても、実際のところ今までのバッチが
融通聞かない代物だったので、リファインの切っ掛けとしては
丁度良かった気もする。

想定する利用シーンに基づき、2 つの実行ウィザードと
1 つの実行バッチを追加。
前に書いたものよりかは大分マシなものになったと思う。

実際のスクリプトは以下。
俺俺感ぱないけど、何かの参考になれば幸いである。


(1)バッチ HDD バックアップ
設定ファイルに記述されたドライブに対してバックアップ処理を実行。

BatchHDDBackup.bat

@echo off
set cfg_name=%~n0
set cfg_ext=.ini
set cfg_file=%cfg_name%%cfg_ext%

if not exist "%cfg_file%" (
  echo コンフィグファイル %cfg_file% が見つかりません。
  
  echo ; %cfg_name% configuration>%cfg_file%
  echo [directory]>>%cfg_file%
  echo src=>>%cfg_file%
  echo dst=>>%cfg_file%
  
  echo コンフィグファイル %cfg_file% を作成しました。
  echo;
  echo 'src=' 以降にバックアップ元ドライブまたはフォルダを、
  echo 'dst=' 以降にバックアップ先ドライブまたはフォルダを、
  echo フルパスで指定してください。
  echo;
  echo なお、パスの指定に前後「"」または末尾「\」を含めないでください。
  echo 上記記号が混入してると正しく動作しません。
  echo;
  echo 例:)
  echo src=Z:
  echo dst=Y:
  echo;
  
  exit /b
)
rem コンフィグファイル %cfg_file% は既に存在します。

rem バックアップ元ドライブ
for /f "eol=; tokens=1* delims==" %%a in ('find "src" %cfg_file%') do (set src=%%b)
rem バックアップ先ドライブ
for /f "eol=; tokens=1* delims==" %%a in ('find "dst" %cfg_file%') do (set dst=%%b)

call HDDBackup.bat "%src%" "%dst%"
exit /b


BatchHDDBackup.ini

; BatchHDDBackup configuration
[directory]
src=Z:
dst=Y:

タスクスケジューラに登録して定期実行することを想定。
壊れた PC で主に利用していた動作。


(2)カレント HDD バックアップ
カレントドライブを元、選択したドライブを先としてバックアップ処理を実行。

CurrentHDDBackup.bat

@echo off
set src=%~d0
echo カレントドライブ %src% をバックアップします。
vol %src%
echo;

set dst=0
set /p dst="バックアップ先ドライブを入力してください . . . "

rem 指定されたドライブが見つかりません。
set is_exist=0
for /f "usebackq tokens=*" %%i in (`vol %dst% ^| find "ラベル" /C`) do (set is_exist=%%i)
if %is_exist%==0 goto END

vol %dst%
echo;

set yesno=n
set /p yesno="バックアップを開始しますか?(y/n) . . . "

if not "%yesno:y=y%"=="y" goto END

call HDDBackup.bat "%src%" "%dst%"

echo;
echo バックアップが終了しました。
pause
exit /b

:END
echo;
echo バックアップを中止しました。
pause
exit /b

今回一番欲しかったもの。別 PC にドライブを移した際、
即時使えるものを求めていた。
こいつがメイン、バックアップの両方に入っていれば
仮に一方が壊れた場合でも、新調したドライブへのリストアが容易に行えるって寸法。


(3)セレクト HDD バックアップ
始めに選択したドライブを元、後に選択したドライブを先としてバックアップ処理を実行。

SelectHDDBackup.bat

@echo off
echo 選択したドライブをバックアップします。
echo;

set src=0
set /p src="バックアップ元ドライブを入力してください . . . "

rem 指定されたドライブが見つかりません。
set is_exist=0
for /f "usebackq tokens=*" %%i in (`vol %src% ^| find "ラベル" /C`) do (set is_exist=%%i)
if %is_exist%==0 goto END

vol %src%
echo;

set dst=0
set /p dst="バックアップ先ドライブを入力してください . . . "

rem 指定されたドライブが見つかりません。
set is_exist=0
for /f "usebackq tokens=*" %%i in (`vol %dst% ^| find "ラベル" /C`) do (set is_exist=%%i)
if %is_exist%==0 goto END

vol %dst%
echo;

set yesno=n
set /p yesno="バックアップを開始しますか?(y/n) . . . "

if not "%yesno:y=y%"=="y" goto END

call HDDBackup.bat "%src%" "%dst%"

echo;
echo バックアップが終了しました。
pause
exit /b

:END
echo;
echo バックアップを中止しました。
pause
exit /b

カレントバックアップのついでに書いたもの。
過去何回かメインデータの方を誤って削除して、
その度にリストアで不便を伴っていたのも事実なので、
有るに越したことはないと思う。


(4)HDD バックアップ
処理本体。robocopy コマンドでバックアップ処理を実行。

HDDBackup.bat

@echo off
rem バックアップ元ドライブ
if "%~1"=="" goto END
set src=%~1

rem バックアップ先ドライブ
if "%~2"=="" goto END
set dst=%~2

set root_dir=Regekatsu
set sub_dir=Backup
set log_dir=log
set save_dir=%SystemDrive%\%root_dir%\%sub_dir%\%log_dir%
md "%save_dir%"

set dt=%date%
set tm=%time%
set dt=%dt:~0,4%-%dt:~5,2%-%dt:~8,2%
set tm=%tm:~0,2%-%tm:~3,2%-%tm:~6,2%
set tm=%tm: =0%
set log_dttm=%dt%_%tm%
set log_prefix=Backup_
set log_ext=.log
set log_file="%save_dir%\%log_prefix%%log_dttm%%log_ext%"

setlocal
cd \

robocopy "%src%" "%dst%" /MIR /R:0 /W:0 /LOG:"%log_file%" /NP /NDL /TEE

endlocal
exit /b

:END
echo usage: %~nx0% バックアップ元ドライブ バックアップ先ドライブ
exit /b


実行ログの保存先。これは決め打ち。

%SystemDrive%\Regekatsu\Backup\log