Windowsコマンドプロンプト | バッチで世代管理&バックアップを取る方法 | MS-DOS

Windowsコマンドプロンプト | バッチで世代管理&バックアップを取る方法 | MS-DOS

こんにちは!今回は私自身業務でよく利用する「バックアップ」にフォーカスを当て、バックアップかつ世代管理できるバッチを作成しました。

ご参考になれば幸いです。

バックアップのイメージ

まずはバックアップ処理のイメージです。

・C>TESTフォルダを定期的にバックアップします。

・C>TEST_BACKフォルダには以下の3つのフォルダを用意します。

 ①バックアップ格納場所:バックアップフォルダ(N世代分)を保存します。

 ②バッチ置き場:今回の処理を記述したバッチを置きます。

 ③ログファイル置き場:ログ情報を出力します。

・BACKの中身

世代ごとに分かれていて、ファイル命名規則は「bk_yyyymmddhhmmss」となっています。

・BATの中身

main.batのみ置いています。

・LOGの中身

.logファイルにログを書き込みます。

以下のように記録されます。

バッチ

作成したバッチは以下の通りです。

rem ------------------------------------------------------------
rem N世代をバックアップしたい場合のバッチ
rem ------------------------------------------------------------

set log=C:\TEST_BACK\LOG\bklog.log

rem 改行
echo. >>%log%

rem 日付の追記
echo %date% %time% :バッチ処理を開始 >>%log%


rem ------------------------------------------------------------
rem 時間取得(yyyymmddhhmmssを生成)
rem ------------------------------------------------------------

set time_tmp=%time: =0%
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%


rem ------------------------------------------------------------
rem バックアップ処理
rem ------------------------------------------------------------

if not %ERRORLEVEL% == 0 (
	echo %date% %time% :初期化で失敗しました >> %log%
) else (
	echo %date% %time% :バックアップ処理を開始 >> %log%

	rem ***************************************
	rem ↓↓↓ここにバックアップ処理を書く↓↓↓
	
	echo D | xcopy /e C:\TEST C:\TEST_BACK\BACK\bk_%now%

	rem ↑↑↑ここにバックアップ処理を書く↑↑↑
	rem ***************************************
)


rem ------------------------------------------------------------
rem 一番古いファイルの削除(5世代分を残す)
rem del:ファイル削除 / del:フォルダ削除
rem ------------------------------------------------------------

if not %ERRORLEVEL% == 0 (
	echo %date% %time% :バックアップ処理で失敗しました >> %log%
) else (
	echo %date% %time% :世代管理処理を開始 >> %log%
	for /f "skip=5" %%B in ('dir /b /o-d C:\TEST_BACK\BACK\bk_*') do rd /s /q C:\TEST_BACK\BACK\%%B
)


rem ------------------------------------------------------------
rem 終了処理
rem ------------------------------------------------------------
if not %ERRORLEVEL% == 0 (
	echo %date% %time% :世代管理処理で失敗しました >> %log%
) else (
	echo %date% %time% :処理終了 >> %log%
	EXIT
)

補足①:xcopy

・フォルダのコピーを行うため、「xcopy」を用いました。

 echo Dとすることで、「ファイル:F or フォルダ:D」の警告画面をスキップすることができます。

 echo D | xcopy /e C:\TEST C:\TEST_BACK\BACK\bk_%now% 

補足②:世代管理

・世代管理処理は「for」文を用います。

 skip=5とすれば5世代まで管理します。

 保存期間の古いものから削除するために、「dir /b /o-d」としています。

 「rd」でフォルダを削除しますが、「/s /q」で強制的にフォルダ内のファイル・フォルダも削除します。

for /f "skip=5" %%B in ('dir /b /o-d C:\TEST_BACK\BACK\bk_*') do rd /s /q C:\TEST_BACK\BACK\%%B

以上です。