Windows bat: ログ等のファイルをローテートする

FileRotate.bat
Windowsのバッチファイルでログ等のファイルをローテートするプログラムです。仕様はプログラム中のコメントに記載しています。
※ファイルサイズによるローテートは「バイト数の上限を超えたファイルをローテートする」をご参照ください。

実行に必要なバッチファイル(GitHub)
処理抜粋

ファイルのローテート箇所を抜粋しています。

set BAT_DIRECTORYEXISTS=DirectoryExists.batのパス

set FILE_PATH=ファイルパス
set MAX_BACKUP_NUMBER=バックアップ世代数の上限値

rem 世代数の上限の番号からローテート処理する
for /l %%i in (%MAX_BACKUP_NUMBER%,-1,1) do (
    set _FILE="%FILE_PATH%.%%i"
    if exist !_FILE! (
        if %%i equ %MAX_BACKUP_NUMBER% (
            rem ファイルの世代番号が最大の場合、ファイルを削除する
            call %BAT_DIRECTORYEXISTS% !_FILE!
            if !ERRORLEVEL! equ 0 (
                rem フォルダの場合
                rd /S /Q !_FILE! >nul
            ) else (
                rem ファイルの場合
                del /Q  !_FILE! >nul
            )
        ) else (
            rem ファイルの世代番号が最大ではない場合、世代をアップする
            set /a _NEXT_COUNT=%%i+1 
            move /Y !_FILE! "%FILE_PATH%%DOT%!_NEXT_COUNT!" >nul
        )
    )
)

rem 最新のファイルは世代番号に1を付ける
move /Y "%FILE_PATH%" "%FILE_PATH%%DOT%1" >nul
実行例
call FileRotate.bat 対象ファイルパス バックアップ世代数上限
call FileRotate.bat "C:¥log¥error.log" 5

引数に指定したファイルのローテートをします。ローテートされた一番古いファイルがバックアップ世代数上限まで達するとそのファイルを削除します。

実行前のファイル
C:¥log¥error.log
C:¥log¥error.log.1
C:¥log¥error.log.2
実行後のファイル
C:¥log¥error.log.1
C:¥log¥error.log.2
C:¥log¥error.log.3
FileRotate.bat
@setlocal enabledelayedexpansion
@echo off

rem ******************************************************************
rem * FileRotate.bat: ファイルローテート処理 
rem * 
rem * [説明]
rem *   ファイルもしくはフォルダに対し、世代番号を付与して名前を変更する。
rem *   世代番号は小さい番号ほど新しく、大きい番号ほど古くなる。
rem * 
rem *   <仕様・ルール>
rem *   ・ファイルとフォルダに対してローテートする
rem *   ・ローテートする対象が存在しない場合、何もしない
rem *   ・バックアップ世代数より大きい番号のファイルに対しては何もしない
rem *   ・バックアップ世代数は1以上を指定する
rem * 
rem *   <戻り値>
rem *   ・正常に処理した場合、0を返す
rem *   ・ローテートするファイルが存在しない場合、1を返す
rem *   ・引数が不正の場合、8を返す
rem *   ・その他、予期しないエラーなどの場合、9を返す
rem * 
rem * [引数]
rem *   %1: ローテートするファイル(必須)
rem *   %2: バックアップ世代数の上限(必須)
rem * 
rem * [バージョン]
rem *   1.0.0
rem ******************************************************************
rem echo FileRotate.bat %1 %2

rem 利用する外部バッチファイル
set BAT_DIRECTORYEXISTS="%~dp0\DirectoryExists.bat"
set BAT_ISINTEGER="%~dp0\IsInteger.bat"

rem ファイル名と世代番号の区切り文字
set DOT=.

set FILE_PATH=%~1
set MAX_BACKUP_NUMBER=%2

rem 引数チェック(引数が不正の場合、8を返す)
if not defined FILE_PATH (
    endlocal
    exit /b 8
)

rem バックアップ世代数の数字判定
call %BAT_ISINTEGER% %MAX_BACKUP_NUMBER%
if %ERRORLEVEL% neq 0 (
    endlocal
    exit /b 8
)
rem バックアップ世代数は1以上を指定する
if %MAX_BACKUP_NUMBER% lss 1 (
    endlocal
    exit /b 8
)


rem ローテートするファイルもしくはフォルダが存在しない場合、1を返す
if not exist "%FILE_PATH%" (
    endlocal
    exit /b 1
)

rem 世代数の上限の番号からローテート処理する
for /l %%i in (%MAX_BACKUP_NUMBER%,-1,1) do (
    set _FILE="%FILE_PATH%%DOT%%%i"
    if exist !_FILE! (
        if %%i equ %MAX_BACKUP_NUMBER% (
            rem ファイルの世代番号が最大の場合、ファイルを削除する
            call %BAT_DIRECTORYEXISTS% !_FILE!
            if !ERRORLEVEL! equ 0 (
                rem フォルダの場合
                rd /S /Q !_FILE! >nul
            ) else (
                rem ファイルの場合
                del /Q  !_FILE! >nul
            )
            if !ERRORLEVEL! neq 0 (
                endlocal
                exit /b 9
            )
        ) else (
            rem ファイルの世代番号が最大ではない場合、世代をアップする
            set /a _NEXT_COUNT=%%i+1 
            move /Y !_FILE! "%FILE_PATH%%DOT%!_NEXT_COUNT!" >nul
            if !ERRORLEVEL! neq 0 (
                endlocal
                exit /b 9
            )
        )
    )
)

rem 最新のファイルは世代番号に1を付ける
move /Y "%FILE_PATH%" "%FILE_PATH%%DOT%1" >nul
if %ERRORLEVEL% neq 0 (
    endlocal
    exit /b 9
)

endlocal
exit /b 0