Пакетный файл Windows хранит только последние 30 файлов
Я написал пакетный файл, который делает следующее:
REM @ECHO OFF
rem %1 = coid
rem %2 = rpg location with ending /
rem get the path of this cmd script
SET SUBDIR=%~dp0
SET BKUPDIR=%SUBDIR%BACKUPS
SET LOGFILE=%BKUPDIR%backup.log
ECHO ************************************************* >>%LOGFILE%
ECHO STARTING BACKUP FOR %1 AT %2 >>%LOGFILE%
FOR /f "skip=1" %%x in ('wmic os get localdatetime') DO IF NOT defined mydate SET mydate=%%x
SET filedate=%mydate:~0,14%
SET fullname=%BKUPDIR%%1_%FILEDATE%.ZIP
ECHO BKUPDIR: %BKUPDIR% >>%LOGFILE%
ECHO mydate: %mydate% >>%LOGFILE%
ECHO filedate: %filedate% >>%LOGFILE%
ECHO fullname: %fullname% >>%LOGFILE%
ECHO SUBDIR: %SUBDIR% >>%LOGFILE%
rem lets make sure the backup directory exists before starting
IF NOT EXIST %BKUPDIR% MD %BKUPDIR% >>%LOGFILE%
%SUBDIR%7z a -tzip %fullname% %2%1*.d
IF ERRORLEVEL 255 ECHO user_stopped_the_process >>%LOGFILE%
IF ERRORLEVEL 8 ECHO not_enough_memory >>%LOGFILE%
IF ERRORLEVEL 7 ECHO command_line_error >>%LOGFILE%
IF ERRORLEVEL 2 ECHO fatal_error >>%LOGFILE%
IF ERRORLEVEL 1 ECHO ok_warnings >>%LOGFILE%
IF ERRORLEVEL 0 GOTO END
IF EXIST %fullname% DEL %fullname%
:END
ECHO FINISHING BACKUP FOR %1 >>%LOGFILE%
ECHO ************************************************* >>%LOGFILE%
set mydate=
Я сохраняю файлы как %1
и дата / время создания файла:
SSS_20130110133304.ZIP
SSS_20130110133336.ZIP
я запускаю это в планировщике задач для запуска каждую ночь.
Я хочу, чтобы в каталоге не было слишком много zip-файлов, поэтому я хотел бы сохранить последние 30 zip-файлов, которые существуют.
Я застрял в этом месте. Как сохранить самые последние 30 zip-файлов, чтобы я не закончил с дерьмовой загрузкой zip-файлов?
2 ответов
этот список .zip-файлы от самых новых до самых старых (по дате создания), пропускаем первые 30 файлов.
for /f "skip=30 delims=" %%A in ('dir /a:-d /b /o:-d /t:c *.zip ^2^>nul') do if exist "%%~fA" echo "%%~fA"
просто изменить echo
to del
когда вы хотите фактически удалить файлы. :)
просто сосредоточив внимание на вопросе -- как сохранить 30 самых последних файлов и удалить остальные:
можно сделать dir > clean.lst
С правильной сортировкой, так что самые последние файлы находятся в начале clean.lst
. Тогда вы можете использовать for
команда, чтобы пропустить первые 30 строк в файле и удалить файлы, перечисленные после 30-го файла.
считайте это тест:
C:>md xyz
C:>cd xyz
c:\xyz>copy con genfiles.bat
@echo off
set _i=1
:loop
if %_i%==100 goto :EOF
echo.>%_i%.txt
set /a _i+=1
goto loop
^Z
1 file(s) copied.
c:\xyz>genfiles
c:\xyz>del genfiles.bat
теперь у вас есть 99 текстовых файлов в XYZ папка.
вы можете удалить все, кроме 30 последних вроде этого:
C:\xyz>dir /b /o-d *.txt > clean.lst
C:\xyz>for /f "skip=30 delims=" %i in (clean.lst) do del "%i"
C:\xyz>del clean.lst
A dir
показывает только текстовые файлы 70.txt-99.txt остаются, остальные были удалены.
для вашего пакетного файла, я думаю, это будет выглядеть примерно так:
cd /d %BKUPDIR%
dir /b /o-d *.zip > clean.lst
for /f "skip=30 delims=" %%i in (clean.lst) do del "%%i"
del clean.lst