Skip to content

Instantly share code, notes, and snippets.

@kou10mo
Last active January 19, 2026 22:55
Show Gist options
  • Select an option

  • Save kou10mo/15d35a1e1e19729788f01249e4682818 to your computer and use it in GitHub Desktop.

Select an option

Save kou10mo/15d35a1e1e19729788f01249e4682818 to your computer and use it in GitHub Desktop.
特定ファイルをn世代バックアップするバッチファイル
@ECHO OFF
REM 参考) 遅延環境変数を有効に
REM https://qiita.com/sawa_tsuka/items/c7c477cacf8c97792e17
SETLOCAL enabledelayedexpansion
REM 参考) バッチファイルで、世代管理をしつつバックアップを取る
REM https://qiita.com/kumasun/items/24d0d855e084ce8ec856
REM ***** 各種設定 *****
REM 保存する世代数
SET GENERATION=5
REM 対象ファイルのフォルダパス(ネットワークフォルダもOK)
REM SET SRCDIR=C:\Path\To\Source\
REM SET SRCDIR=\\192.168.100.60\Path\To\Source\
SET SRCDIR=\\10.56.164.60\project\BBnaviダウンロードファイルの日本語化\作成資料\
REM バックアップするフォルダ(適当に指定)
SET DSTDIR=%SRCDIR%bk\
REM バックアップ対象のファイル名と拡張子
SET FILENAME=出勤管理簿
SET FILEEXT=.xlsx
REM 対象ファイルが存在しなければ終了
SET BKFILE=%SRCDIR%%FILENAME%%FILEEXT%
IF NOT EXIST "%BKFILE%" (
ECHO バックアップ対象ファイルが存在しません
EXIT /B 1
)
REM バックアップ先フォルダが存在しなければ作成
IF NOT EXIST "%DSTDIR%" (
MKDIR "%DSTDIR%"
)
REM YYYYMMDDHHMM形式で日時を取得する(例えば日次で動かし、YYYYMMDDだけで良ければ%time以降を削除)
SET DT=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
REM バックアップファイルとなる日時付きファイル名
SET DSTFILE="%DSTDIR%%FILENAME%_%DT%%FILEEXT%"
REM 既に該当日時のファイルが存在したら終了
IF EXIST %DSTFILE% (
EXIT /B 1
)
REM 更新日時が同じなら処理しない
SET NEWEST=
FOR /F %%a IN ('DIR /A-D /ON /B %DSTDIR%') DO (
SET NEWEST=%%a
)
FOR %%i IN (%DSTDIR%%NEWEST%) DO SET DSTTIME=%%~ti
SET DSTYMD=%DSTTIME:~0,4%%DSTTIME:~5,2%%DSTTIME:~8,2%%DSTTIME:~11,2%%DSTTIME:~14,2%
FOR %%i IN (%BKFILE%) DO SET SRCTIME=%%~ti
SET SRCYMD=%SRCTIME:~0,4%%SRCTIME:~5,2%%SRCTIME:~8,2%%SRCTIME:~11,2%%SRCTIME:~14,2%
ECHO %SRCYMD%
REM 同じ日時なら終了
IF %DSTYMD%==%SRCYMD% (
EXIT /B 1
)
REM バックアップ先にあるディレクトリの数を数える(コメントアウト2行はうまくいかなかったやつ…)
REM SET CNT=(DIR /A-D /B C:\Test\ | FIND /C /V "")
REM FOR %%t IN (`DIR /A-D /B "%DSTDIR%" ^| FIND /C /V ""`) DO SET CNT=%%t
SET /a CNT=0
FOR %%A IN (%DSTDIR%*) DO (
IF EXIST %%A (set /a CNT=CNT+1)
)
REM バックアップ先ファイル数が世代数を超えていたら削除
IF %CNT% GEQ %GENERATION% (
REM バックアップ先で最も古いファイルを探す
REM ファイルを降順(新しい順)にして、最後(最も古い)ファイルがOLDERにセットされるように
REM Sambaネットワーク上の場合はソートを/ON(逆順は/O-N にしないとダメぽい)
SET OLDER=
FOR /F %%a IN ('DIR /A-D /O-N /B %DSTDIR%') DO (
SET OLDER=%%a
)
REM 最も古いファイルを削除(遅延環境変数のため!OLDER!で指定)
IF EXIST "%DSTDIR%!OLDER!" (
DEL /Q "%DSTDIR%!OLDER!"
)
)
REM 対象ファイルをコピーする
COPY %BKFILE% %DSTFILE%
ENDLOCAL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment