for /f "tokens=*" %%i in ('forfiles /s /d-15') do del /q /f /s %%i
forfiles -p диск:\путь -s -m *.* -d -кол.дней -c "cmd /c del /q @path"
forfiles -p диск:\путь -d -кол.дней -c "cmd /c rmdir /s /q @path"
@echo off rem ========================================================================================= rem * Процедура удаления файлов %1 старше %2 дней от текущего, но оставляя не менее %3 дней * rem * Год в датах обрезается до 2-х цифр, т.о. корректно работает только для файлов с 2000г * SETLOCAL ENABLEDELAYEDEXPANSION @echo on set DelFiles=%~1 set MAX_DAYS=%2 set MIN_DAYS=%3 @echo off if "%MAX_DAYS%"=="" ( echo Не задан обязательный параметр MAX_DAYS exit /b ) if "%MIN_DAYS%"=="" set MIN_DAYS=0 set /A TIME_SHIFT=MAX_DAYS*24*60 rem Текущая дата и время, разбиение на части set cur_date_time=%DATE:~-10%-%TIME:~,8% rem echo %CUR_DATE_TIME% FOR /F "tokens=1,2,3,4,5* delims=-.:" %%J in ("%cur_date_time%") do ( SET CUR_DAY=%%J SET CUR_MONTH=%%K SET CUR_YEAR=%%L SET CUR_HOUR=%%M SET CUR_MINUTE=%%N ) SET CUR_YEAR=%CUR_YEAR:~-2% SET CUR_HOUR=%CUR_HOUR: =0% call :datetime_to_minutes %CUR_YEAR% %CUR_MONTH% %CUR_DAY% %CUR_HOUR% %CUR_MINUTE% set CUR_TIME_MINUTES=%ERRORLEVEL% rem Цикл по файлам, в порядке даты создания pushd %~dp1 FOR /F "delims=" %%I IN ('dir "%DelFiles%" /a:-d /o:d /t:w /b 2^>nul') DO ( rem Имя файла и его дата set FNAME=%%~nxI set FDATETIME=%%~tI rem echo !FNAME! !FDATETIME! rem Разбиение даты/времени файла на части FOR /F "tokens=1,2,3,4,5* delims=-.: " %%J in ("!FDATETIME!") do ( SET FDAY=%%J SET FMONTH=%%K SET FYEAR=%%L SET FHOUR=%%M SET FMINUTE=%%N ) SET FYEAR=!FYEAR:~-2! rem Дата/время файла в минутах call :datetime_to_minutes !FYEAR! !FMONTH! !FDAY! !FHOUR! !FMINUTE! set FTIME_MINUTES=!ERRORLEVEL! set /A FTIME_SHIFT=CUR_TIME_MINUTES-FTIME_MINUTES rem echo FTIME_SHIFT=!CUR_TIME_MINUTES!-!FTIME_MINUTES! rem echo !FTIME_SHIFT! %TIME_SHIFT% rem Удаление файлов с разницей даты/времени больше заданной if !FTIME_SHIFT! GTR %TIME_SHIFT% ( rem Проверка, за сколько дней остались архивы call :count_filemask_days "%DelFiles%" if !ERRORLEVEL! GTR %MIN_DAYS% ( echo %%I ^(!FDATETIME!^) - удаление del /q "%%I" ) ELSE ( echo %%I ^(!FDATETIME!^) - не удален, т.к. файлов осталось не больше чем за %MIN_DAYS% дн. ) ) ) popd exit /b rem Процедура подсчета количества дней, в которых присутствуют заданные по маске файлы %1 :count_filemask_days set NF_MASK=%~1 pushd %~dp1 set /A CF_DAYS=0 set NF_LAST_DATE= FOR /F "delims=" %%F IN ('dir "%NF_MASK%" /a:-d /o:d /t:w /b 2^>nul') DO ( set NF_NAME=%%~nxF set NF_DATETIME=%%~tF set NF_DATE=!NF_DATETIME:~0,10! rem echo !NF_NAME! !NF_DATE! if NOT "!NF_DATE!"=="!NF_LAST_DATE!" ( set /A CF_DAYS=CF_DAYS+1 set NF_LAST_DATE=!NF_DATE! ) ) popd exit /b %CF_DAYS% rem Процедура перевода даты/времени в количество минут (без точного учета високосных лет) :datetime_to_minutes rem Приведение параметров к нормальным числам set YEAR=%1 if %YEAR:~0,1%==0 set YEAR=%YEAR:~1% set MONTH=%2 if %MONTH:~0,1%==0 set MONTH=%MONTH:~1% set DAY=%3 if %DAY:~0,1%==0 set DAY=%DAY:~1% set HOUR=%4 if %HOUR:~0,1%==0 set HOUR=%HOUR:~1% set MINUTE=%5 if %MINUTE:~0,1%==0 set MINUTE=%MINUTE:~1% rem echo %YEAR% %MONTH% %DAY% %HOUR% %MINUTE% rem Определение количества дней, прошедших с начала года до заданного месяца SET /A YM_Days=0 SET /A INYEAR=YEAR/4 SET /A NEW_YEAR=INYEAR*4 SET /A PR_MONTH=MONTH-1 FOR /L %%X IN (1,1,%PR_MONTH%) DO ( if %%X==1 (Set /A M_Days=31) if %%X==2 ( IF !NEW_YEAR!==!YEAR! ( Set /A M_Days=29 ) ELSE ( Set /A M_Days=28 ) ) if %%X==3 (Set /A M_Days=31) if %%X==4 (Set /A M_Days=30) if %%X==5 (Set /A M_Days=31) if %%X==6 (Set /A M_Days=30) if %%X==7 (Set /A M_Days=31) if %%X==8 (Set /A M_Days=31) if %%X==9 (Set /A M_Days=30) if %%X==10 (Set /A M_Days=31) if %%X==11 (Set /A M_Days=30) SET /A YM_Days=YM_Days+M_Days ) rem Количество минут из количества дней/часов set /A MINUTES=(YEAR-1)*365*24*60+YM_Days*24*60+(DAY-1)*24*60+HOUR*60+MINUTE exit /b %MINUTES%