用于删除给定文件夹中最旧文件夹的批处理脚本
Batch Script to delete oldest folder in a given folder
我正在编写一个简单的 .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
)
我希望此脚本只删除 ..\Backup
文件夹中最旧的一个文件夹,但就目前而言,它似乎会在达到备份限制后删除它找到的每个文件夹,这显然不是期望的行为。
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:d /b') do (
rd /s /q "..\Backup\%%a"
goto :break
)
:break
您可以使用 goto
中断 for 循环
根据您的脚本执行此操作的简单方法:
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:-d /b') do set lastfolder=%%a
rd /s /q "..\Backup\%lastfolder%"
所以你仍然遍历每个文件夹,按年龄排序,但你覆盖了 %lastfolder% 所以最后它只包含最旧文件夹的名称。
然后你删除那个文件夹。
你们太亲密了! :-)
您需要做的就是在按日期降序排序时跳过第一个 %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"
)
这是我最终使用的最后一段代码:
:: Preserve only the %MAXBACKUPS% most recent backups.
FOR /f "skip=%MAXBACKUPS% delims=" %%a in (
'dir "..\Backup\*" /t:c /a:d /o:-d /b'
) do (
ECHO More than %MAXBACKUPS% backups found--Deleting "%%a".
ECHO.
rd /s /q "..\Backup\%%a"
)
它稍微简化了删除消息代码,并在命令提示符中为最终用户提供有关删除了哪些文件的信息window。
基于
我正在编写一个简单的 .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
)
我希望此脚本只删除 ..\Backup
文件夹中最旧的一个文件夹,但就目前而言,它似乎会在达到备份限制后删除它找到的每个文件夹,这显然不是期望的行为。
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:d /b') do (
rd /s /q "..\Backup\%%a"
goto :break
)
:break
您可以使用 goto
中断 for 循环根据您的脚本执行此操作的简单方法:
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:-d /b') do set lastfolder=%%a
rd /s /q "..\Backup\%lastfolder%"
所以你仍然遍历每个文件夹,按年龄排序,但你覆盖了 %lastfolder% 所以最后它只包含最旧文件夹的名称。
然后你删除那个文件夹。
你们太亲密了! :-)
您需要做的就是在按日期降序排序时跳过第一个 %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"
)
这是我最终使用的最后一段代码:
:: Preserve only the %MAXBACKUPS% most recent backups.
FOR /f "skip=%MAXBACKUPS% delims=" %%a in (
'dir "..\Backup\*" /t:c /a:d /o:-d /b'
) do (
ECHO More than %MAXBACKUPS% backups found--Deleting "%%a".
ECHO.
rd /s /q "..\Backup\%%a"
)
它稍微简化了删除消息代码,并在命令提示符中为最终用户提供有关删除了哪些文件的信息window。
基于