Очистка удаление старых файлов

Для ОС Windows
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Очистка удаление старых файлов

Сообщение Артём Мамзиков »

Возникла потребность удалить файлы старше 5 лет на файловых серверах, от 30 до 170 гб.

Самый просто способ использовать следующую команду

Код: Выделить всё

:: 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
del-file-old-docs-cp866-V5.2.bat

Код: Выделить всё

@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
ИЛИ ВОЗМОЖНО ТАК 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") 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)
Предыдущие версии плохо работают с большим кол-вом файлов или длинными путями из за ограничения Bat.

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
del-file-old-docs-cp866-V4.bat

Код: Выделить всё

@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
del-file-old-docs-cp866-V3.bat

Код: Выделить всё

@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
del-file-old-docs-cp866-V2.bat

Код: Выделить всё

@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
del-file-old-docs-cp866-V1.bat

Код: Выделить всё

@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
del-file-old-docs-win-cp866-ifV1.bat

Код: Выделить всё

@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
количество слов: 4462
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

Очистка удаление старых файлов

Сообщение Артём Мамзиков »

Очистка временных файлов более 3х месяцев
del-Temp-i-Scan-file-old

Код: Выделить всё

@echo off
mode con:cols=130 lines=1000
color 1a
:: Автор Мамзиков Артём Андреевич
:: V 5.2 04.05.2022 (через файл)
:: Проверка по 3 условиям
:: Время изменения файла (модификация последней операции записи)
:: Время изменения свойств файла (время создания)
:: Время последнего доступа (Последнее использование, последний доступ)
:: Если все 3 условия страше 3 месяцев, удалем файлы , удалить пустые папки, пишем в файл текущая дата путь имя файла в LOGDELFILE.TXT
:: Очистка 2х папкок: временные документы и scan

TITLE del-Temp-i-Scan-file-old

setlocal enabledelayedexpansion
:: Текущая дата для лога
set datep=%date% %TIME:~,-3%
::  Путь если несколько через ;
set way="D:\docs\Почта\временные документы;d:\docs\scan"
::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%
::Год
set y=%date:~6,4%

:: Переменная кол-во месяцев
set monthval=3
:: Месяц Оставить одно первое значение числа если 0 =0 то выполнить оставить одно значение справа т .е если месяц 02 то будет 2
if %m:~0,1%==0 set m=%m:~1%
:: Узнать количество годов/лет если указанно больше 12 месяцев (текущее количество месяцев : 12 = округляем до целого числа)
set /a yearval=%monthval%/12
:: Получим в месяцах
set /a minmonth=12*%yearval%
:: Вычислим количество месяцев которое нужно отнять/прибавить от текущих
set /a resmonth=%monthval%-%minmonth%
:: Если искомое кол-во месяцев меньше 12 %monthval% например текущий 5-май вычитаем 7-июль 5-7=-2 октябрь отрицательное, но в этом случае нужно вычесть -1 год, и для + наоборот больше 12 месяцев +1 год
set /a mvr=%m%-%resmonth%
IF %mvr% LEQ 0 (set yearjd=1) ELSE (set yearjd=0)

:: Для условия Чтобы сразу получить положительное число месяцев (текущий месяц + 12 месяцев)
set /a posmonth=%m%+12
:: Условие текущий месяц меньше или равно вычитаемому то +12 если нет то просто текущий вычитаем полученное значение
IF %m% LEQ %resmonth% (
:: И теперь отнимаем наши %resmonth% месяцев
set /a receivedmonth=%posmonth%-%resmonth%) ELSE (
:: Текущий минус полученный
set /a receivedmonth=%m%-%resmonth%)

::Получаем год текущий год -%yearval%-%yearjd%
set /a receivedyear=%y%-%yearval%-%yearjd%
:: Переведем в обычные переменные
set y=%receivedyear%
set m=%receivedmonth%

set /a feb=y%%4
:: Проверка если текущее число 29.02 а после обычный год то 01.03
::if %feb% NEQ 0 (
::if %m%%d% == 229 set m=03& set d=01)
:: Если високосный будет 0=0 значит 29 если не равно значит 28 дней
if %feb%==0 (set feb=29) else (set feb=28)
:: Для текушего месяца выводим максимальное кол-во дней
for /f "tokens=%m%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do set numdaymonth=%%i
:: Проверить день например 31 число больше чем может быть, в получаемом месяце 30
if %d% GTR %numdaymonth% set d=%numdaymonth%
::Добавим 0 к месяцу если 1 цифра
set m=0%m%
set m=%m:~-2%
:: Получаем дату
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

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")
:: Проверим что все даты старше 3 месяцев (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
:st
set /p "v=Введите число: "
for /f "delims=" %%A in ('echo.%v%^| findstr "[^0-9]"') do set "nv=%%~A"
if not "%v%"=="%nv%" (echo.Это число %v%) else (goto st)
pause>nul

Код: Выделить всё

@echo off
:st
set /p "v=Введите число: "
set /a "x=%v%" 2>nul
if "%x%"=="%v%" (echo.Это число %v%) else (goto st)
pause>nul
EQU - равно
NEQ - не равно

Код: Выделить всё

set filename="D:\distr\1"
set timemodify=y545454

set /a "checknum=%timemodify%" 2>nul
if "%timemodify%" NEQ "%checknum%" (echo ОШИБКА ПРОВЕРКИ %filename%>>"%~dp0LOGDELFILE.TXT")
echo "%timemodify%" NEQ "%checknum%"
::или попадают числа а после них текст
set checknum=""
for /f "delims=" %%A in ('echo %timemodify%^| findstr "^[0-9]"') do set checknum=%%~A
if "%timemodify%" NEQ "%checknum%" (echo ОШИБКА ПРОВЕРКИ %filename%>>"%~dp0LOGDELFILE.TXT")
echo "%timemodify%" NEQ "%checknum%"
pause
количество слов: 997
Ответить Пред. темаСлед. тема

Вернуться в «Windows»