2015-02-11 7 views
5

Sto scrivendo un semplice script di backup .bat e, come parte di esso, voglio che il backup più vecchio (cartella) venga eliminato al raggiungimento di un limite massimo di backup.Batch Script per eliminare la cartella più vecchia in una data cartella

In questo momento ho questo:

%COUNTER% si basa sul numero di cartelle di backup attualmente nella directory in cui sono memorizzati i backup, ed è calcolato in precedenza nello script.

%MAXBACKUPS% è solo un numero specificato dall'utente come "10", per indicare che si desidera conservare solo fino a 10 versioni dei backup.

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

Vorrei che questo script per solo eliminare l'una cartella più antica nella cartella ..\Backup, ma così com'è sembra cancellare ogni singola cartella che trova una volta che raggiunge il limite di backup, che non è ovviamente il desiderato comportamento.

+0

bene, lo script elimina ogni singola cartella perché si ha un ciclo in là che richiede 'rd' per ogni cartella. Questo è ciò che fa il comando 'for'. Perché l'hai scritto in quel modo? – HugoRune

+0

Pensavo di aver bisogno di ordinare correttamente tutte le cartelle per data, ma ora che ci penso, probabilmente non è così. – Ectropy

+0

A quanto pare, è il caso, ma il modo in cui l'ho fatto in origine era un po 'spento. – Ectropy

risposta

4

Eri così vicino! :-)

Tutto ciò che dovete fare è saltare le prime voci %MAXBACKUPS% quando ordinate per data decrescente. Non hai nemmeno bisogno della tua variabile 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

Penso che questo sia il modo migliore per farlo, specialmente dal momento che non richiede un contatore e può cancellare backup aggiuntivi se si abbassa il limite di backup in un secondo momento.Ho apportato una leggera modifica per la mia implementazione che mostrerò in una risposta separata per gli interessati. – 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 

si può rompere il ciclo con goto

3

Un modo semplice per fare questo, sulla base di script:

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

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

quindi è ancora un ciclo su ogni cartella, in ordine di età, ma si sovrascrive% lastfolder% quindi alla fine contiene solo il nome della cartella meno recente.

Quindi si elimina quella cartella.

+0

Ho inserito 'ECHO% LASTFOLDER%' dopo la riga FOR che hai suggerito, ma riporta 'ECHO è spento' come se non ci fosse nulla memorizzato in quella variabile entro la fine del ciclo for. Potresti forse non accedere alle variabili impostate all'interno di cicli for? Se puoi, c'è qualche altro problema in gioco. – Ectropy

+0

funziona sul mio sistema. In caso di dubbi, posiziona 'echo' dopo' do' (o rimuovi qualsiasi 'echo off' all'inizio dello script), in questo modo puoi vedere quale 'set' è l'ultimo da eseguire. Batch non ha ambiti locali per le variabili, tutte le variabili all'interno del ciclo sono accessibili da qualsiasi luogo. – HugoRune

3

Ecco l'ultimo blocco di codice ho finito per usare:

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

semplifica il codice di eliminazione di messaggio un po ', e fornisce all'utente finale con le informazioni su ciò che il file è stato eliminato nel prompt dei comandi finestra.

Sulla base dbenham's answer.