2015-02-11 203 views
5

我在写一个简单的.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文件夹中删除一个最古老的文件夹,但因为它的立场似乎一旦到达备份限制,这显然是不希望删除它找到的每一个文件夹行为。

+0

很好,因为你在那里有一个循环调用'rd'每个文件夹的脚本删除每一个文件夹。这就是'for'命令的作用。你为什么这样写呢? – HugoRune 2015-02-11 23:36:45

+0

我以为我需要按日期正确排序所有文件夹,但现在我想到了,可能并非如此。 – Ectropy 2015-02-11 23:38:46

+0

事实证明,情况正是如此,但我原来的做法有点不合适。 – Ectropy 2015-02-12 03:16:18

回答

4

你太亲近了! :-)

您只需按日期降序排序,即可跳过第一个%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" 
) 
+0

我认为这是实现它的最好方法,尤其是因为它不需要计数器,并且可以在以后降低备份限制时删除额外的备份。我对我的实施做了一些细微的修改,我将在单独的答案中对那些感兴趣的人做出解释。 – Ectropy 2015-02-12 03:10:28

2
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:d /b') do (
rd /s /q "..\Backup\%%a" 
goto :break 
) 
:break 

你可以转到

3

打破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%,因此最后只包含最旧文件夹的名称。

然后您删除该文件夹。

+0

我在你建议的FOR行之后放置了'ECHO%LASTFOLDER%'',但它报告'ECHO关闭了',就好像在for循环结束时没有任何东西存储在那个变量中一样。你可能不能访问for循环中设置的变量吗?如果可以的话,还有其他一些问题。 – Ectropy 2015-02-11 23:58:48

+0

它适用于我的系统。如果有疑问,将'echo'放在'do'之后(或者在脚本开始处删除任何'echo off'),这样你就可以看到哪个'set'是最后一个要执行的。批处理没有局部范围的变量,循环内的所有变量都可以从任何地方访问。 – HugoRune 2015-02-12 00:18:23

3

下面是最后的代码块我最终使用:

:: 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" 
) 

它简化了删除消息的代码位,并提供最终用户提供哪些文件是在命令提示符下删除信息窗口。

基于dbenham's answer.

相关问题