2015-01-05 3 views
3

У меня есть следующие в пакетном файле:пакетный файл удалить все, кроме новейших 10 файлов

:REMOLDFILES 
ECHO Removing files older than 14 days. >>%LOGFILE% 
cd /d %BKUPDIR% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.zip ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" ECHO "%%~fA" >>%LOGFILE% 
FOR /f "skip=14 delims=" %%A IN ('DIR /a:-d /b /o:-d /t:c %1*.log ^2^>nul') DO IF EXIST "%%~fA" DEL "%%~fA" >>%LOGFILE% 
IF [%3]==[Y] GOTO SECONDBACKUPDIR 
IF [%3]==[y] GOTO SECONDBACKUPDIR 
GOTO END 

Проблема я столкнулся и в том, что резервная копия была не работает в течение нескольких недель, и в конечном итоге удаление все мои резервные копии, так как им было более 2 недель.

Что мне нужно, чтобы сохранить последние 10 последних резервных копий.

У кого-нибудь есть идея, как я это сделаю? Я не писал это один раз, так как я не знаком с пакетными файлами.

+1

Этот код должен удалить все, кроме самой новой ** 14 ** '* .log' и '* .zip'. Сокращение этого до 10 не поможет. Как определить, была ли выполнена резервная копия? – Magoo

+0

@Magoo - Я тоже это заметил (из-за этого у моего первоначального ответа было 14 дней), но OP специально попросил 10. Я полагаю, у него есть свои причины (может быть, он не работает по выходным?). –

+0

Какая ОС вы используете? Возможно, вы сможете использовать команду 'forfiles', которая легко решает вашу проблему. – SomethingDark

ответ

3

Вы можете использовать FOR /F SKIP игнорировать последние 10 наиболее недавно измененные записи после сортировки по дате последнего изменения:

for /f "skip=10 eol=: delims=" %%F in ('dir /b /o-d *.zip') do @del "%%F" 
+1

Работал отлично! tyvm! – ErocM

+2

Неверно! Неправильно! Неправильно! Этот код будет делать то же самое, что и исходный код **, кроме **, что он удалит все, кроме последних ** 10 ** zip-файлов, тогда как оригинал разрешил ** 14 ** оставаться. В противном случае, это фактически * точно * то же, что и исходный код, кроме того, что он обрабатывает только файлы '.zip' и не удовлетворяет очень небольшую возможность наличия каталога с именем' * .zip *. – Magoo

+0

@Magoo - «Мне нужно, чтобы он сохранял последние 10 последних резервных копий.« –

1

Вы можете получить список файлов в обратном порядке по дате изменения с помощью команды DIR. Затем вы просто скажете свой цикл FOR, чтобы пропустить первые 10 (примечание ваш почтовый индекс показывает 14, но вы запрашиваете 10) записей, поэтому все обрабатываемое будет удалено.

REM Update to 14 if needed. 
SET Keep=10 
FOR /F "usebackq tokens=* skip=%Keep% delims=" %%A IN (`DIR *.zip /B /O:-D /A:-D`) DO DEL "%%A">>%LOGFILE% 

Поскольку вы не знакомы с партией, вы можете проверить эту команду (чтобы увидеть, что будет удалено, а не на самом деле удалить его), заменив DEL с ECHO.


Редактировать

Поскольку вы также обработки лог-файлов, поэтому не просто удалять их в одном цикле?

REM Update to 14 if needed. 
SET Keep=10 
FOR /F "usebackq tokens=* skip=%Keep% delims=" %%A IN (`DIR *.zip /B /O:-D /A:-D`) DO (
    ECHO Processing: %%~nA 
    REM Delete ZIP file. 
    DEL "%%A" 
    REM Delete LOG file. 
    DEL "%%~nA.log" 
)>>%LOGFILE% 
+1

Те же проблемы, что и принятый ответ. Вы не указали директории '/ a-d' для выхода из строя' * .zip' (редко, но это может произойти в теории.) Хорошо, чтобы избежать ненужного дублирования. По существу, то же самое, что и код OP, но 10 дней вместо 14 - и ваш код не генерирует записи журнала ... – Magoo

+0

@Magoo - Команда 'DEL' потерпит неудачу, если передана директория, но это хорошо практика, чтобы все это исключить. Что касается перенаправления на журнал, вы правы - я просто пропустил это. –

+1

True - но без '/ ad' строки с именем каталога он будет занимать один из слотов с исключениями, поэтому каталог остается вне зависимости от того,' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' * files ** останется, если одна строка в первых 10 является каталогом, а не файлом. – Magoo