Самый просто способ использовать следующую команду
Код: Выделить всё
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
За основу взято Обнаружение файлов
В процессе Проблемки которые возникли в ограничениях Batch
Для сдвига даты и в дальнейшем сравнении Скрипт cmd bat минус плюс Год Месяц День
Скрипт со следующими условиями
Проверка по 3 условиям:
1.Время изменения файла (модификация последней операции записи)
2.Время изменения свойств файла (время создания)
3.Время последнего доступа (Последнее использование, последний доступ)
Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удаляем файлы , удалить пустые папки.
После удаляем все файлы по расширению, удаляем пустые папки, выводим общий размер удаленных файлов так же пишем в лог что удаляем
В лог пишет полный путь удаляемого файла и само имя файла, все даты файла размер и сравниваемую дату
по итогу общий размер удаленных файлов.
В переменной можно указать сразу несколько папок через :
Пример: set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
Вначале лучше протестировать на какой то папку предварительно ее скопировав если она нужна, или заменить del и rd на echo
Скрипт может не отработать если в названиях папок есть пробел в конце имени или точка!
del-file-old-docs-cp866-V5.2.1.bat строк 53 отключена ^ , включена 55 взависисомти от ОС
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.2.1 04.05.2023 (через файл)
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия страше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удалем файлы , удалить пустые папки.
:: После удаляем все файлы по расширению, удаляем пустые папки, выводим общий размер удаленных файлов
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="d:\docs"
::set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
:: Проверять только через ; (поумолчанию .)
set filtr="."
:: Исключить из проверки через ; (поумолчанию ^$ или ')
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
::attrib +h "%~dp0LOGDELFILE.TXT"
:: Удаление старого списка файлов
del /F /Q "%~dp0SPISOKFILE.TXT"
::Для сравнения дат за минусом N дней/месецев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -5
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: 1.Этап Разбор входных дирикторий, если их нексколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация, Разбор по адресам (путям)
::dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /C:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
:: ИЛИ ВОЗМОЖНО ТАК c ^ работает на win server 2008, на win-10 не работает (Недопустимый ключ i v)
dir /a-d /B /S %%a\ 2^>nul|findstr/irv /C:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
setlocal DISABLEDELAYEDEXPANSION
for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:dateschange) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
:: Еще варинт запроса
:: FORFILES [/P .путь] [/M *маска_поиска] [/S рекрусивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
::Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: 4.Этап Разбор входных дирикторий, если их нексколько
for %%c in (%way%) do IF /I %%c1 NEQ ""1 ( set waydir=%%c& call:remaining) ELSE (echo Пустая переменая3)
:: 5.Этап завершаем выполненние
:: Удаление старого списка файлов
del /F /Q "%~dp0SPISOKFILE.TXT"
::pause
goto :end
:remaining
:: 4.Этап
:: Общий размер удаленный файлов старше %comparisons% (при переводе показывает только целые числа 0, не показывает)
echo Общий размер удаленный файлов старше даты %comparisons% >>"%~dp0LOGDELFILE.TXT" & echo Общий размер удаленный файлов старше даты %comparisons%
echo %sizeall% B>>"%~dp0LOGDELFILE.TXT" & echo %sizeall% B
set /a kb=%sizeall%/1024
echo %kb% KB>>"%~dp0LOGDELFILE.TXT" & echo %kb% KB
set /a mb=%sizeall%/1024/1024
echo %mb% MB>>"%~dp0LOGDELFILE.TXT" & echo %mb% MB
set /a gb=%sizeall%/1024/1024/1024
echo %gb% GB>>"%~dp0LOGDELFILE.TXT" & echo %gb% GB
:: Удалим все следующие расширения в папке и подкаталогах (*.png *.jpg *.jpeg *.gif *.cer *.crl *.inf *.osx *.oga *.html *.htm *.php *.css *.js *.lnk *.sql *.avi *.mpeg4 *.exe *.msi *.db *.dbf *.sig *.enc *.desktop *.dll *.ds *.eml *.chm)
Set ext=*.png *.gif *.cer *.crl *.inf *.osx *.oga *.html *.htm *.php *.css *.js *.lnk *.sql *.avi *.mpeg4 *.exe *.msi *.db *.sig *.enc *.desktop *.dll *.ds *.eml *.chm
:: Убираем все кавычки
set waydirp=%waydir:"=%
:: Составляем путь\*расширение через "," для цикла
Call Set St="%waydirp%\%%ext: =","%waydirp%\%%"
:: Поиск файлов по расширению получение размера и удаление
For /F "Delims=," %%A in ('dir /b /s /a:-d %St%') do (
for %%k in ("%%A*") do set /a sizeext=!sizeext!+%%~zk & del /F /Q "%%A" & echo по расширению "%%A" размер: %%~zk>>"%~dp0LOGDELFILE.TXT" & echo Удаление по расширению "%%A" размер: %%~zk )
setlocal DISABLEDELAYEDEXPANSION
:: Удаляем пустые папки (папка в папке не удаляет, только непосредственно пустую)
::for /r %waydir% %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i" & echo пустые папки "%%~i">>"%~dp0LOGDELFILE.TXT"
:: Удаление пустых папок *для неизвестной глубины
goto start
:fn1
for /d %%i in ("%~1\*") do (call :fn1 "%%i" & rd /q "%%i" && echo пустые папки "%%i">>"%~dp0LOGDELFILE.TXT")
exit /b
:start
call :fn1 %waydir%
echo Общий размер по расширению >>"%~dp0LOGDELFILE.TXT" & echo Общий размер по расширению
echo %sizeext% B >>"%~dp0LOGDELFILE.TXT" & echo %sizeext% B
set /a extkb=%sizeext%/1024
echo %extkb% KB>>"%~dp0LOGDELFILE.TXT" & echo %extkb% KB
set /a extmb=%sizeext%/1024/1024
echo %extmb% MB>>"%~dp0LOGDELFILE.TXT" & echo %extmb% MB
set /a extgb=%sizeext%/1024/1024/1024
echo %extgb% GB>>"%~dp0LOGDELFILE.TXT" & echo %extgb% GB
echo Общий размер всех удаленных файлов>>"%~dp0LOGDELFILE.TXT" & echo Общий размер всех удаленных файлов
set /a ob=%sizeall%+%sizeext%
echo %ob% B>>"%~dp0LOGDELFILE.TXT" & echo %ob% B
set /a obkb=%ob%/1024
echo %obkb% KB>>"%~dp0LOGDELFILE.TXT" & echo %obkb% KB
set /a obmb=%ob%/1024/1024
echo %obmb% MB>>"%~dp0LOGDELFILE.TXT" & echo %obmb% MB
set /a obgb=%ob%/1024/1024/1024
echo %obgb% GB>>"%~dp0LOGDELFILE.TXT" & echo %obgb% GB
echo Завершение Удаления %datep%>>"%~dp0LOGDELFILE.TXT" & echo Завершение Удаления
goto :end
:dateschange
:: 2.Этап Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер файла
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir /A %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir /A %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir /A %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
echo %filename%
echo "%timemodify%" "%comparisons%"
echo "%timechange%" "%comparisons%"
echo "%timeaccess%" "%comparisons%"
::pause
set /a "checknum=%timemodify%" 2>nul
if "%timemodify%" NEQ "%checknum%" (echo ОШИБКА ПРОВЕРКИ %filename%>>"%~dp0LOGDELFILE.TXT")
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно), если все условия истены удаляем файл и пишем в лог
if "%timemodify%" LEQ "%comparisons%" (
if "%timechange%" LEQ "%comparisons%" (
if "%timeaccess%" LEQ "%comparisons%" (
goto :FILEDELETE
)))
echo ПРОВЕРЯЕМЫЙ Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
goto :end
:FILEDELETE
:: 3.Этап Удаление старого файла
del /F /Q /A %filename%
echo Удаление %filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%>>"%~dp0LOGDELFILE.TXT"
setlocal enabledelayedexpansion
::Суммируем размер всех удаленных файлов
set /a sizeall=!sizeall!+%sizefile%
goto :end
:end
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.2 04.05.2022 (через файл)
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удаляем файлы , удалить пустые папки.
:: После удаляем все файлы по расширению, удаляем пустые папки, выводим общий размер удаленных файлов
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="d:\docs"
::set way="C:\Users\Temp;C:\Temp"
:: Проверять только через ; (по умолчанию .)
set filtr="."
:: Исключить из проверки через ; (по умолчанию ^$ или ')
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
::attrib +h "%~dp0LOGDELFILE.TXT"
:: Удаление старого списка файлов
del /F /Q "%~dp0SPISOKFILE.TXT"
::Для сравнения дат за минусом N дней/месяцев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -5
:: Проверка если текущее число 29.02 а после обычный год то 01.03
set /a feb=y%%4
if %feb% NEQ 0 (
if %m%%d% == 0229 set m=03& set d=01)
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: 1.Этап Разбор входных директорий, если их несколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация, Разбор по адресам (путям)
dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /C:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
:: ИЛИ ВОЗМОЖНО ТАК c ^ работает на win server 2008, на win-10 не работает (Недопустимый ключ i v)
::dir /a-d /B /S %%a\ 2^>nul|findstr/irv /C:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT"
for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:dateschange) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
:: Еще вариант запроса
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
::Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: 4.Этап Разбор входных директорий, если их несколько
for %%c in (%way%) do IF /I %%c1 NEQ ""1 ( set waydir=%%c& call:remaining) ELSE (echo Пустая переменая3)
:: 5.Этап завершаем выполнение
:: Удаление старого списка файлов
del /F /Q "%~dp0SPISOKFILE.TXT"
pause
goto :end
:remaining
:: 4.Этап
:: Общий размер удаленный файлов старше %comparisons% (при переводе показывает только целые числа 0, не показывает)
echo Общий размер удаленный файлов старше даты %comparisons% >>"%~dp0LOGDELFILE.TXT" & echo Общий размер удаленный файлов старше даты %comparisons%
echo %sizeall% B>>"%~dp0LOGDELFILE.TXT" & echo %sizeall% B
set /a kb=%sizeall%/1024
echo %kb% KB>>"%~dp0LOGDELFILE.TXT" & echo %kb% KB
set /a mb=%sizeall%/1024/1024
echo %mb% MB>>"%~dp0LOGDELFILE.TXT" & echo %mb% MB
set /a gb=%sizeall%/1024/1024/1024
echo %gb% GB>>"%~dp0LOGDELFILE.TXT" & echo %gb% GB
:: Удалим все следующие расширения в папке и подкаталогах (*.png *.jpg *.jpeg *.gif *.cer *.crl *.inf *.osx *.oga *.html *.htm *.php *.css *.js *.lnk *.sql *.avi *.mpeg4 *.exe *.msi *.db *.dbf *.sig *.enc *.desktop *.dll *.ds *.eml *.chm)
Set ext=*.png *.gif *.cer *.crl *.inf *.osx *.oga *.html *.htm *.php *.css *.js *.lnk *.sql *.avi *.mpeg4 *.exe *.msi *.db *.sig *.enc *.desktop *.dll *.ds *.eml *.chm
:: Убираем все кавычки
set waydirp=%waydir:"=%
:: Составляем путь\*расширение через "," для цикла
Call Set St="%waydirp%\%%ext: =","%waydirp%\%%"
:: Поиск файлов по расширению получение размера и удаление
For /F "Delims=," %%A in ('dir /b /s /a:-d %St%') do (
for %%k in ("%%A*") do set /a sizeext=!sizeext!+%%~zk & del /F /Q "%%A" & echo по расширению "%%A" размер: %%~zk>>"%~dp0LOGDELFILE.TXT" & echo Удаление по расширению "%%A" размер: %%~zk )
setlocal DISABLEDELAYEDEXPANSION
:: Удаляем пустые папки (папка в папке не удаляет, только непосредственно пустую)
::for /r %waydir% %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i" & echo пустые папки "%%~i">>"%~dp0LOGDELFILE.TXT"
:: Удаление пустых папок *для неизвестной глубины
goto start
:fn1
for /d %%i in ("%~1\*") do (call :fn1 "%%i" & rd /q "%%i" && echo пустые папки "%%i">>"%~dp0LOGDELFILE.TXT")
exit /b
:start
call :fn1 %waydir%
echo Общий размер по расширению >>"%~dp0LOGDELFILE.TXT" & echo Общий размер по расширению
echo %sizeext% B >>"%~dp0LOGDELFILE.TXT" & echo %sizeext% B
set /a extkb=%sizeext%/1024
echo %extkb% KB>>"%~dp0LOGDELFILE.TXT" & echo %extkb% KB
set /a extmb=%sizeext%/1024/1024
echo %extmb% MB>>"%~dp0LOGDELFILE.TXT" & echo %extmb% MB
set /a extgb=%sizeext%/1024/1024/1024
echo %extgb% GB>>"%~dp0LOGDELFILE.TXT" & echo %extgb% GB
echo Общий размер всех удаленных файлов>>"%~dp0LOGDELFILE.TXT" & echo Общий размер всех удаленных файлов
set /a ob=%sizeall%+%sizeext%
echo %ob% B>>"%~dp0LOGDELFILE.TXT" & echo %ob% B
set /a obkb=%ob%/1024
echo %obkb% KB>>"%~dp0LOGDELFILE.TXT" & echo %obkb% KB
set /a obmb=%ob%/1024/1024
echo %obmb% MB>>"%~dp0LOGDELFILE.TXT" & echo %obmb% MB
set /a obgb=%ob%/1024/1024/1024
echo %obgb% GB>>"%~dp0LOGDELFILE.TXT" & echo %obgb% GB
echo Завершение Удаления %datep%>>"%~dp0LOGDELFILE.TXT" & echo Завершение Удаления
goto :end
:dateschange
:: 2.Этап Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер файла
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно), если все условия истены удаляем файл и пишем в лог
if %timemodify% LEQ %comparisons% (
if %timechange% LEQ %comparisons% (
if %timeaccess% LEQ %comparisons% (
goto :FILEDELETE
)))
echo ПРОВЕРЯЕМЫЙ Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
goto :end
:FILEDELETE
:: 3.Этап Удаление старого файла
del /F /Q %filename%
echo Удаление %filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%>>"%~dp0LOGDELFILE.TXT"
::Суммируем размер всех удаленных файлов
set /a sizeall=!sizeall!+%sizefile%
goto :end
:end
Код: Выделить всё
:: Запрос содержание данной директории и ПОДКАТАЛОГОВ (накопительная переменная) + фильтрация, Разбор по адресам (путям)
dir /a-d /B /S %%a\ 2>nul|findstr/irv /c:"^$"|findstr/ir %filtr%|findstr/irv %hide%>> "%~dp0SPISOKFILE.TXT") ELSE (echo Пустая переменая1)
for /f "usebackq tokens=1 delims=" %%b in ("%~dp0SPISOKFILE.TXT") do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:dateschange) ELSE (echo Пустая переменая2)
del-file-old-docs-cp866-V5.1.bat
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.1 30.04.2022
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удаляем файлы , удалить пустые папки.
:: После удаляем все файлы по расширению, удаляем пустые папки, выводим общий размер удаленных файлов
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="D:\docs"
::set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
:: Проверять только через ; (по умолчанию .)
set filtr="."
:: Исключить из проверки через ; (по умолчанию ^$)
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
attrib +h "%~dp0LOGDELFILE.TXT"
::Для сравнения дат за минусом N дней/месяцев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -5
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: 1.Этап Разбор входных директорий, если их несколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация, Разбор по адресам (путям)
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /C:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:dateschange) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
:: Еще вариант запроса
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
::Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: 4.Этап Разбор входных директорий, если их несколько
for %%c in (%way%) do IF /I %%c1 NEQ ""1 ( set waydir=%%c& call:remaining) ELSE (echo Пустая переменая3)
:: 5.Этап завершаем выполнение
pause
goto :end
:remaining
:: 4.Этап
:: Общий размер удаленный файлов старше %comparisons% (при переводе показывает только целые числа 0, не показывает)
echo Общий размер удаленный файлов старше даты %comparisons% >>"%~dp0LOGDELFILE.TXT" & echo Общий размер удаленный файлов старше даты %comparisons%
echo %sizeall% B>>"%~dp0LOGDELFILE.TXT" & echo %sizeall% B
set /a kb=%sizeall%/1024
echo %kb% KB>>"%~dp0LOGDELFILE.TXT" & echo %kb% KB
set /a mb=%sizeall%/1024/1024
echo %mb% MB>>"%~dp0LOGDELFILE.TXT" & echo %mb% MB
set /a gb=%sizeall%/1024/1024/1024
echo %gb% GB>>"%~dp0LOGDELFILE.TXT" & echo %gb% GB
:: Удалим все следующие расширения в папке и подкаталогах (*.png *.jpg *.jpeg *.gif *.cer *.crl *.inf *.osx *.oga *.html *.htm *.php *.css *.js *.lnk *.sql *.avi *.mpeg4 *.exe *.msi *.db *.dbf *.sig *.enc *.desktop *.dll *.ds *.eml *.chm)
Set ext=*.png *.gif *.cer *.crl *.inf *.osx *.oga *.html *.htm *.php *.css *.js *.lnk *.sql *.avi *.mpeg4 *.exe *.msi *.db *.sig *.enc *.desktop *.dll *.ds *.eml *.chm
:: Убираем все кавычки
set waydirp=%waydir:"=%
:: Составляем путь\*расширение через "," для цикла
Call Set St="%waydirp%\%%ext: =","%waydirp%\%%"
:: Поиск файлов по расширению получение размера и удаление
For /F "Delims=," %%A in ('dir /b /s /a:-d %St%') do (
for %%k in ("%%A*") do set /a sizeext=!sizeext!+%%~zk & echo /F /Q "%%A" & echo по расширению "%%A" размер: %%~zk>>"%~dp0LOGDELFILE.TXT" & echo Удаление по расширению "%%A" размер: %%~zk )
setlocal DISABLEDELAYEDEXPANSION
:: Удаляем пустые папки (папка в папке не удаляет, только непосредственно пустую)
::for /r %waydir% %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i" & echo пустые папки "%%~i">>"%~dp0LOGDELFILE.TXT"
:: Удаление пустых папок *для неизвестной глубины
goto start
:fn1
for /d %%i in ("%~1\*") do (call :fn1 "%%i" & rd /q "%%i" && echo пустые папки "%%i">>"%~dp0LOGDELFILE.TXT")
exit /b
:start
call :fn1 %waydir%
echo Общий размер по расширению >>"%~dp0LOGDELFILE.TXT" & echo Общий размер по расширению
echo %sizeext% B >>"%~dp0LOGDELFILE.TXT" & echo %sizeext% B
set /a extkb=%sizeext%/1024
echo %extkb% KB>>"%~dp0LOGDELFILE.TXT" & echo %extkb% KB
set /a extmb=%sizeext%/1024/1024
echo %extmb% MB>>"%~dp0LOGDELFILE.TXT" & echo %extmb% MB
set /a extgb=%sizeext%/1024/1024/1024
echo %extgb% GB>>"%~dp0LOGDELFILE.TXT" & echo %extgb% GB
echo Общий размер всех удаленных файлов>>"%~dp0LOGDELFILE.TXT" & echo Общий размер всех удаленных файлов
set /a ob=%sizeall%+%sizeext%
echo %ob% B>>"%~dp0LOGDELFILE.TXT" & echo %ob% B
set /a obkb=%ob%/1024
echo %obkb% KB>>"%~dp0LOGDELFILE.TXT" & echo %obkb% KB
set /a obmb=%ob%/1024/1024
echo %obmb% MB>>"%~dp0LOGDELFILE.TXT" & echo %obmb% MB
set /a obgb=%ob%/1024/1024/1024
echo %obgb% GB>>"%~dp0LOGDELFILE.TXT" & echo %obgb% GB
echo Завершение Удаления %datep%>>"%~dp0LOGDELFILE.TXT" & echo Завершение Удаления
goto :end
:dateschange
:: 2.Этап Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Получаем размер файла
for %%k in (%filename%) do Set sizefile=%%~zk
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно), если все условия истины удаляем файл и пишем в лог
if %timemodify% LEQ %comparisons% (
if %timechange% LEQ %comparisons% (
if %timeaccess% LEQ %comparisons% (
goto :FILEDELETE
)))
echo ПРОВЕРЯЕМЫЙ Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
goto :end
:FILEDELETE
:: 3.Этап Удаление старого файла
::del /F /Q %filename%
echo Удаление %filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons% размер:%sizefile%>>"%~dp0LOGDELFILE.TXT"
::Суммируем размер всех удаленных файлов
set /a sizeall=!sizeall!+%sizefile%
goto :end
:end
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 4.0 28.04.2022
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удаляем файлы , удалить пустые папки.
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="C:\zabbix"
::set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
:: Проверять только через ; (по умолчанию .)
set filtr="."
:: Исключить из проверки через ; (по умолчанию ^$)
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
attrib +h "%~dp0LOGDELFILE.TXT"
::Для сравнения дат за минусом N дней/месяцев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -1
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: 1.Этап Разбор входных директорий, если их несколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация, Разбор по адресам (путям)
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" ( set filename="%%b"& call:dateschange) ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
:: Еще вариант запроса
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
:: Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: Разбор входных директорий, если их несколько, удаляем пустые папки
for %%a in (%way%) do IF /I %%c1 NEQ ""1 (
::for /r %%a %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i"
echo %%a
) ELSE (echo Пустая переменая4)
setlocal DISABLEDELAYEDEXPANSION
pause
:end
:dateschange
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно), если все условия истины удаляем файл и пишем в лог
if %timemodify% LEQ %comparisons% (
if %timechange% LEQ %comparisons% (
if %timeaccess% LEQ %comparisons% (
goto :FILEDELETE
)))
echo ПРОВЕРЯЕМЫЙ Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
goto :end
:FILEDELETE
::Удаление старого файла
::del /F /Q %filename%
echo Удаление %filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%>>"%~dp0LOGDELFILE.TXT"
:end
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 3.0 28.04.2022
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удаляем файлы , удалить пустые папки.
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="C:\zabbix"
::set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
:: Проверять только через ; (полмолчания .)
set filtr="."
:: Исключить из проверки через ; (полмолчания ^$)
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
attrib +h "%~dp0LOGDELFILE.TXT"
::Для сравнения дат за минусом N дней/месяцев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -1
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do IF /I %%a1 NEQ ""1 (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do IF /I "%%b1" NEQ "1" (echo "%%b";>> "%~dp0SPISOKFILE.TXT") ELSE (echo Пустая переменая2)) ELSE (echo Пустая переменая1)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
:: Еще вариант запроса
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
:: Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: Разбор по адресам (путям)
FOR /F "usebackq delims=;" %%c in ("%~dp0SPISOKFILE.TXT") do IF /I %%c1 NEQ ""1 ( set filename=%%c& call:dateschange) ELSE (echo Пустая переменая3)
:: Разбор входных директорий, если их несколько, удаляем пустые папки
for %%a in (%way%) do IF /I %%c1 NEQ ""1 (
::for /r %%a %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i"
echo %%a
) ELSE (echo Пустая переменая4)
del /F /Q "%~dp0SPISOKFILE.TXT"
setlocal DISABLEDELAYEDEXPANSION
pause
:end
:dateschange
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно), если все условия истины удаляем файл и пишем в лог
if %timemodify% LEQ %comparisons% (
if %timechange% LEQ %comparisons% (
if %timeaccess% LEQ %comparisons% (
goto :FILEDELETE
)))
echo ПРОВЕРЯЕМЫЙ Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
goto :end
:FILEDELETE
::Удаление старого файла
::del /F /Q %filename%
echo Удаление %filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%>>"%~dp0LOGDELFILE.TXT"
:end
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 2.0 27.04.2022
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удаляем файлы , удалить пустые папки.
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="C:\zabbix"
::set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
:: Проверять только через ; (по умолчанию .)
set filtr="."
:: Исключить из проверки через ; (по умолчанию ^$)
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
attrib +h "%~dp0LOGDELFILE.TXT"
::Для сравнения дат за минусом N дней/месяцев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -1
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!"%%b";
)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!"%%a\%%b";
:: Еще вариант запроса
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
:: Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%
::echo %puti%
:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:dateschange
:: Разбор входных директорий, если их несколько, удаляем пустые папки
for %%a in (%way%) do (
::for /r %%a %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i"
echo %%a
)
echo testV %datep%>>"%~dp0LOGDELFILE.TXT"
pause
:end
:dateschange
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно)
if %timemodify% LEQ %comparisons% (
if %timechange% LEQ %comparisons% (
if %timeaccess% LEQ %comparisons% (
::Удаление старого файла
::del /F /Q /A:H %filename%
echo удаление %filename%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%>>"%~dp0LOGDELFILE.TXT"
)))
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
setlocal DISABLEDELAYEDEXPANSION
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 26.04.2022
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удалям файлы , удалить пустые папки.
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="D:\distr\1;D:\temp"
::set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
:: Проверять только через ; (по умолчанию .)
set filtr="."
:: Исключить из проверки через ; (по умолчанию ^$)
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
attrib +h "%~dp0LOGDELFILE.TXT"
::Для сравнения дат за минусом N дней/месяцев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -1
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%b;
)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
:: Еще вариант запроса
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
:: Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
::echo %puti%
:: Разбор по адресам (путям)
for %%c in (%puti%) do set filename=%%c& call:dateschange
:: Разбор входных директорий, если их несколько, удаляем пустые папки
for %%a in (%way%) do (
::for /r %%a %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i"
echo %%a
)
echo testV %datep%>>"%~dp0LOGDELFILE.TXT"
pause
:end
:dateschange
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно)
if %timemodify% LEQ %comparisons% (
if %timechange% LEQ %comparisons% (
if %timeaccess% LEQ %comparisons% (
::Удаление старого файла
::del /F /Q %filename%
echo удаление %filename%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%>>"%~dp0LOGDELFILE.TXT"
)))
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
setlocal DISABLEDELAYEDEXPANSION
Код: Выделить всё
@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 1.0 26.04.2022
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия старше 5 лет то пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT , удаляем файлы , удалить пустые папки.
TITLE del-file-old-docs
setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
:: Путь если несколько через ;
set way="D:\distr\1;D:\temp"
::set way="C:\Users\;C:\Program Files (x86);C:\Users\All Users"
:: Проверять только через ; (по умолчанию .)
set filtr="."
:: Исключить из проверки через ; (по умолчанию ^$)
set hide="^$"
::Удаление старого файла лога
::del /F /Q /A:H "%~dp0LOGDELFILE.TXT"
::Создать\внести отметку времени скрытый файл для построчного лога
echo LOG %datep%>>"%~dp0LOGDELFILE.TXT"
::copy /b NUL "%~dp0LOGDELFILE.TXT"
attrib +h "%~dp0LOGDELFILE.TXT"
::Для сравнения дат за минусом N дней/месяцев/лет
::День
set d=%date:~0,2%
::Месяц
set m=%date:~3,2%
::Год (-5лет)
set /a y=%date:~6,4% -1
:: Получаем
set comparisons=%y%%m%%d%
:: Экранируем пути добавляем кавычки было ; стало ";"
set way=%way:;=";"%
:: Разбор входных директорий, если их несколько
for %%a in (%way%) do (
:: Запрос содержание данной директории и подкаталогов (накопительная переменная) + фильтрация
for /f "tokens=1 delims=" %%b in ('dir /a-d /B /S %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%b;
)
:: Запрос содержание данной директории (накопительная переменная) + фильтрация
::for /f "tokens=1 delims=" %%b in ('dir /a-d /B %%a\ 2^>nul^|findstr/irv /c:"^$"^|findstr/ir %filtr%^|findstr/irv %hide%') do set puti=!puti!%%a\%%b;
:: Еще вариант запроса
:: FORFILES [/P .путь] [/M *маска поиска] [/S рекурсивно] [/C команда] [/D [+ | -] {dd.MM.yyyy | dd}]
:: Forfiles -p "C:\папка с файлами" -s -m *.* -d -60 -c "cmd /c del /q @path" удалить все файлы старше 60 дней
:: Уберем последнюю ; так как она потом создает пустую переменную "" которая выполняет команду для текущей директории.
set puti=%puti:~0,-1%
:: Убираем все кавычки
set puti=%puti:"=%
:: Заново экранируем строку путь
set puti="%puti:;=";"%"
:: Разбор по адресам (путям)
::for %%c in (%puti%) do set filename=%%c & call:dateschange
for %%c in (%puti%) do IF /I %%c1 NEQ ""1 ( set filename=%%c & call:dateschange) ELSE ( goto :otpravka)
goto :otpravka
:dateschange
:: Наличие файла
IF EXIST %filename% (set exists=1) ELSE (set exists=0)
:: Время изменения файла (модификация последней операции записи)
::for %%i in (%filename%) do set timemodify=%%~ti
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:W^|findstr /rc:"[0-9]\..*"') do set timemodify=%%l%%k%%j
:: %%m:%%n - время
:: Время изменения свойств файла (время создания)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:C^|findstr /rc:"^[^ ]"') do set timechange=%%l%%k%%j
:: %%m:%%n - время
:: Время последнего доступа (Последнее использование, последний доступ)
for /f "tokens=1-5 delims=.: " %%j in ('2^>nul Dir %filename% /T:A^|findstr /rc:"[0-9]\..*"') do set timeaccess=%%l%%k%%j
:: %%m:%%n - время
:: Проверим что все даты старше 5 лет (LEQ - меньше или равно)
if %timemodify% LEQ %comparisons% (
if %timechange% LEQ %comparisons% (
if %timeaccess% LEQ %comparisons% (
::Удаление старого файла
::del /F /Q /A:H %filename%
echo удаление %filename%
:: Убираем кавычки пишем в лог что удаляем
set filename=%filename:"=%
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%>>"%~dp0LOGDELFILE.TXT"
)))
echo Путь:%filename% изменения:%timemodify% создания:%timechange% последний доступ:%timeaccess% дата сравнения:%comparisons%
:: Очистка переменных, от случайного попадания предыдущего значения
set exists=
set timemodify=
set timechange=
set timeaccess=
goto :end
:otpravka
:: Разбор входных директорий, если их несколько, удаляем пустые папки
for %%a in (%way%) do (
::for /r %%a %%i in (.) do dir /b "%%~i" | find /v "">nul || rd /s /q "%%~i"
echo %%a
)
pause
setlocal DISABLEDELAYEDEXPANSION
:end