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