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

関連ページ