指定フォルダ内のファイルを 3世代管理する Windows バッチ

ファイル名に日付 _yyyyMMdd を付けて、日付付きファイルを3世代だけ残す

@echo off
setlocal enabledelayedexpansion

rem ================================
rem 設定
rem ================================
set "DIR=C:\work"
set "BASE_NAME=backup"
set "EXT=.txt"
set "NEWFILE=C:\work\new_backup.txt"

rem 今日の日付を yyyyMMdd で取得
for /f %%A in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd"') do set "TODAY=%%A"

rem 作成するファイル名
set "TARGET=%DIR%\%BASE_NAME%_%TODAY%%EXT%"

rem ================================
rem 新しいファイルを日付付きでコピー
rem ================================
if not exist "%NEWFILE%" (
    echo エラー: 新しいファイルが存在しません
    echo %NEWFILE%
    pause
    exit /b 1
)

copy /Y "%NEWFILE%" "%TARGET%"

if errorlevel 1 (
    echo エラー: ファイルコピーに失敗しました
    pause
    exit /b 1
)

echo 作成しました: %TARGET%

rem ================================
rem 3世代を超えた古いファイルを削除
rem ================================
set "COUNT=0"

for /f "delims=" %%F in ('dir /b /a-d /o-n "%DIR%\%BASE_NAME%_*%EXT%"') do (
    set /a COUNT+=1

    if !COUNT! GTR 3 (
        echo 削除します: %DIR%\%%F
        del "%DIR%\%%F"
    )
)

echo 3世代管理が完了しました
pause

endlocal