批处理脚本删除给定文件夹中最旧的文件夹

Ect*_*opy 7 cmd batch-file

我正在编写一个简单的.bat备份脚本,作为其中的一部分,我希望在达到设置的备份最大限制时删除最旧的备份(文件夹).

现在我有这个:

%COUNTER% 基于当前存储备份的目录中的备份文件夹的数量,并在脚本的早期计算.

%MAXBACKUPS% 只是一个用户指定的数字,如"10",表示您只想保留最多10个版本的备份.

:: Delete the oldest backup, but only if we've exceeded the desired number of backups.
IF %COUNTER% gtr %MAXBACKUPS% (
ECHO More than %MAXBACKUPS% backups exist. Deleting oldest...
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:-d /b') do rd /s /q "..\Backup\%%a"
::Increment the counter down since we've just removed a backup folder.
SET /a COUNTER=%COUNTER%-1
)
Run Code Online (Sandbox Code Playgroud)

我希望这个脚本只删除文件夹中最旧的文件..\Backup夹,但是当它达到备份限制时,它似乎会删除它找到的每个文件夹,这显然不是所需的行为.

dbe*_*ham 5

你真是太近了!:-)

您需要做的就是%MAXBACKUPS%按日期降序排序时跳过第一个条目.你甚至不需要你的COUNTER变量.

:: Preserve only the %MAXBACKUPS% most recent backups.
set "delMsg="
for /f "skip=%MAXBACKUPS% delims=" %%a in (
  'dir "..\Backup\*" /t:c /a:d /o:-d /b'
) do (
  if not defined delMsg (
    set delMsg=1
    echo More than %MAXBACKUPS% found - only the %MAXBACKUPS% most recent folders will be preserved.
  )
  rd /s /q "..\Backup\%%a"
)
Run Code Online (Sandbox Code Playgroud)