2015-02-11 236 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.

相關問題