Windowsバッチファイルレシピ_特定フォルダを除外してフォルダのバックアップを実行する
フォルダ単位のバックアップを採取する際に、特定のフォルダはバックアップに含めたくないという場合に実行する処理となります。
例えば、Windows環境でNuxt.jsを利用したWEBサイト開発していると、ビルド実行によってnode_modulesフォルダやdistフォルダに大量のファイルが存在するため、これらを除外してバックアップしたいことがあります。
そのような場合に実行できるバッチファイルとなります。
なお、圧縮したかったため、7zipを用いてzip圧縮しています。
作成したバッチファイル
処理概要
TARGET_DIRNAMEに対して、EXCLUDE_DIRSを除いたフォルダとファイルをバックアップします。
一旦、作業用フォルダTARGET_TMPへファイルを移動させた上で、アーカイブ処理を実行しています。
バックアップファイルは「momo-chienoki_YYYYMMDDhhmmss.zip」となるように実行時の日付と時刻を文字列化しています。
(各処理解説は下部に記載しています。)
バッチファイル
@echo off
setlocal
set /p answer="実行してよろしいでしょうか(y/n)? : %answer%"
if "%answer%"=="y" (
echo 実行中...
) else if "%answer%"=="n" (
echo "cancel"
exit /b 1
)else (
echo "other key"
exit /b 1
)
REM
REM definitions
REM
set TARGET_DIRNAME=momo-chienoki
set DATELABEL=%date:~0,4%%date:~5,2%%date:~8,2%
set str_time=%time: =0%
set TIMELABEL=%str_time:~0,2%%str_time:~3,2%%str_time:~6,2%
set TARGET_SRC=%~dp0\%TARGET_DIRNAME%\
set TARGET_TMP=%~dp0\%TARGET_DIRNAME%_%DATELABEL%%TIMELABEL%
set TARGET_DST=%~dp0\%TARGET_DIRNAME%_%DATELABEL%%TIMELABEL%.zip
set EXCLUDE_DIRS=dist node_modules
set ZIP_COMMAND="C:\Program Files\7-Zip\7z.exe"
REM
REM Create temporary backup folder
REM
Robocopy %TARGET_SRC% %TARGET_TMP% /S /xd %EXCLUDE_DIRS%
if not %ERRORLEVEL% == 1 (
echo ERROR:%ERRORLEVEL%
pause
exit /b 1
)
REM
REM Archive
REM
cd %TARGET_TMP%
%ZIP_COMMAND% a -tzip %TARGET_DST% .
if not %ERRORLEVEL% == 0 (
echo ERROR
pause
exit /b 1
)
cd %~dp0
REM
REM Delete temporary backup folder
REM
rmdir /s /q %TARGET_TMP%
if not %ERRORLEVEL% == 0 (
echo ERROR
pause
exit /b 1
)
REM
REM Show success messages
REM
echo ========================================
echo Successfully.
echo %TARGET_DST%
echo ========================================
echo.
pause
endlocal
exit /b 0
バッチファイル処理の解説
定数定義
TARGET_DIRNAMEにバックアップ対象となるフォルダ名を定義します。
「%~dp0\」は現在ディレクトリ(バッチファイル実行時の現在位置)となります。
set TARGET_DIRNAME=momo-chienoki
set TARGET_SRC=%~dp0\%TARGET_DIRNAME%\
set EXCLUDE_DIRS=dist node_modules
バックアップファイルの名前は「momo-chienoki_YYYYMMDDhhmmss.zip」となるように日付と時刻を文字列化しています。
日付は「date」コマンドを実行した結果から文字列の切り出しを実施しています。
時刻は「time」コマンドの実行結果ですが、ゼロ埋めしないと午前中は「 hmmss」空文字が入ってしまいますので、変数に代入してから加工します。
set DATELABEL=%date:~0,4%%date:~5,2%%date:~8,2%
set str_time=%time: =0%
set TIMELABEL=%str_time:~0,2%%str_time:~3,2%%str_time:~6,2%
set TARGET_TMP=%~dp0\%TARGET_DIRNAME%_%DATELABEL%%TIMELABEL%
set TARGET_DST=%~dp0\%TARGET_DIRNAME%_%DATELABEL%%TIMELABEL%.zip
コピー処理
コピーコマンドには「Robocopy」を使います
「/xd」オプションによって、除外するフォルダを指定できます
「/S」オプションは、コピー元フォルダのサブフォルダ、ファイルをすべてコピーする指定となります。
Robocopy %TARGET_SRC% %TARGET_TMP% /S /xd %EXCLUDE_DIRS%
if not %ERRORLEVEL% == 1 (
echo ERROR:%ERRORLEVEL%
pause
exit /b 1
)
Robocopyの戻り値には注意が必要です。コピーの実行成功を確認するには戻り値「1」を確認する必要があります。
Robocopyの戻り値 | 説明 |
---|---|
0 | コピーは行われませんでした。処理は正常に終了ました。ミスマッチ(Mismatched)も見つかりませんでした。全てのファイルはコピー先に存在しています。 |
1 | ファイルのコピーが行われました。 |
2 | コピー先にのみ存在するファイルが見つかりました。コピーされたファイルはありませんでした。 |
アーカイブ処理
アーカイブには7-Zipを利用しています。
「-tzip」オプションでzip圧縮となります。「.」指定で現在位置以下の全ファイルを圧縮します。
一旦フォルダに入って、zipコマンドを実行して、実行後に現在フォルダに戻るようにしています。
これはフォルダを含めずに圧縮したい(解凍時にファイルをそのまま配置したい)ために実施しています。
set ZIP_COMMAND="C:\Program Files\7-Zip\7z.exe"
cd %TARGET_TMP%
%ZIP_COMMAND% a -tzip %TARGET_DST% .
if not %ERRORLEVEL% == 0 (
echo ERROR
pause
exit /b 1
)
cd %~dp0