2015-02-11 9 views
5

Ich schreibe einen einfachen .bat Backup-Skript, und als Teil davon mag ich die älteste Backup (Ordner) löschen bei Erreichen ein eingestellten max Limits von Backups gelöscht werden.Batch Script älteste Ordner in einem bestimmten Ordner

Im Moment habe ich dies:

%COUNTER% basiert auf der Anzahl der Backup-Ordner zur Zeit in dem Verzeichnis, in dem Sicherungen gespeichert sind, und wird früher im Skript berechnet.

%MAXBACKUPS% ist nur eine benutzerdefinierte Nummer wie "10", um zu sagen, dass Sie nur bis zu 10 Versionen der Sicherungen beibehalten möchten.

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

würde ich dieses Skript möchte nur den einen ältesten Ordner im ..\Backup Ordner löschen, aber wie es scheint, steht es jedem einzelnen Ordner zu löschen, es findet, sobald sie die Sicherungsgrenze erreicht, was natürlich nicht der ist erwünscht Verhalten.

+0

gut, löscht das Skript jeden einzelnen Ordner, weil Sie eine Schleife da drin haben, die für jeden Ordner 'rd' aufruft. Das macht der 'for' Befehl. Warum hast du es so geschrieben? – HugoRune

+0

Ich dachte, ich müsste alle Ordner korrekt nach Datum sortieren, aber jetzt, wo ich darüber nachdenke, ist das wahrscheinlich nicht der Fall. – Ectropy

+0

Wie sich herausstellt, ist es so, aber die Art und Weise, wie ich es ursprünglich gemacht habe, war ein bisschen aus. – Ectropy

Antwort

4

Sie waren so nah! :-)

Alles, was Sie tun müssen, ist die erste %MAXBACKUPS% Einträge überspringen Wenn nach dem Datum absteigend sortiert. Sie brauchen nicht einmal Ihre COUNTER Variable.

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

Ich denke, dies ist der beste Weg ist, um es zu erreichen, vor allem, da es nicht einen Zähler benötigt, und kann zusätzliche Sicherungen löscht, wenn Sie die Sicherungsgrenze zu einem späteren Zeitpunkt senken.Ich habe eine kleine Änderung für meine Implementierung vorgenommen, die ich in einer separaten Antwort für Interessierte zeigen werde. – Ectropy

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

Sie können die for-Schleife brechen mit goto

3

Eine einfache Möglichkeit, dies auf der Grundlage Ihrer Skript zu tun:

FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:-d /b') do set lastfolder=%%a 

rd /s /q "..\Backup\%lastfolder%" 

So können Sie immer noch eine Schleife über jeden Ordner, nach Alter sortiert, aber Sie überschreiben% lastfolder% und enthalten am Ende nur den Namen des ältesten Ordners.

Dann löschen Sie diesen Ordner.

+0

Ich legte 'ECHO% LASTFOLDER%' nach der FOR Linie, die Sie vorgeschlagen, aber es meldet 'ECHO off.' ist, als ob es nichts in diesen Variablen am Ende der for-Schleife gespeichert ist. Können Sie vielleicht nicht auf Variablen zugreifen, die innerhalb von for-Schleifen gesetzt sind? Wenn Sie können, gibt es ein anderes Problem im Spiel. – Ectropy

+0

es funktioniert auf meinem System. Im Zweifelsfall plazieren Sie 'echo' nach dem' do' (oder entfernen Sie einfach 'echo off' am Anfang des Skripts), so dass Sie sehen können, welcher 'set' der letzte ist, der ausgeführt wird. Batch hat keine lokalen Bereiche für Variablen, alle Variablen innerhalb der Schleife sind von überall zugänglich. – HugoRune

3

Hier ist der letzte Codeblock landete ich mit:

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

den Code Löschnachricht vereinfacht ein bisschen, und bietet den Endbenutzer mit Informationen darüber, welche Datei in der Eingabeaufforderung gelöscht Fenster.

Basierend auf dbenham's answer.

Verwandte Themen