Last active
January 19, 2026 22:55
-
-
Save kou10mo/15d35a1e1e19729788f01249e4682818 to your computer and use it in GitHub Desktop.
特定ファイルをn世代バックアップするバッチファイル
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @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