Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление старых файлов/папок если их кол-во больше n

Ответить
Настройки темы
CMD/BAT - [решено] Удаление старых файлов/папок если их кол-во больше n

Новый участник


Сообщения: 13
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день!
Помогите со скриптом, который будет сканировать нужную папку (например: C:\aaa), и если в нем файлов больше чем n (например 10), то удалить самый старый файл. И тоже самое нужно для папок.
Очень надеюсь на вашу помощь.

Отправлено: 14:32, 03-07-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата KaПaTы4:
что выполняют данные п »
Пытаются присвоить переданные пакетному файлу параметры двум переменным окружения.
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:04, 10-04-2019 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


KaПaTы4,
ну что непонятного?
Берем код Iska из поста 4, подставляем параметры в значения переменных так:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set "sFolder=%~1"
set /a "iCount=%~2"

for /f "skip=%iCount% usebackq delims=" %%i in (
	`dir /b /a:-d /o:-d /t:w "%sFolder%"`
) do echo del /f /q "%sFolder%\%%~i"

endlocal
exit /b 0
и запускаем как я указал в посте 9 так:
Код: Выделить весь код
name.bat "Диск:\Папка" "Число файлов"
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:50, 12-04-2019 | #12

POV POV вне форума

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброе время суток !
Прошу помощи .... 3 дня копания на различных ресурсах не дали результат :-(
По поводу удаления старых файлов: Есть файловая помойка на удаленном компе \\fs\obmen
Если делать типа так

@echo off
SET Path2Del=\\fs\Obmen\
forfiles -p "%Path2Del%" -s -m *.* -d -10 -c "cmd /c del /q @path"
for /f %%D in ('DIR cd "%Path2Del%" /AD/B ^| sort /r') do RD "%%D"

всё отлично отрабатывается и файлы старше 10 дней уничтожаются. Но проблема в том, что в папки сотрудники кидают и файлы которым сто лет в обед, и соответственно скрипт видит, что они старые и на следующий день их кикает ( потому как они не ВНОВЬ созданные )
Внимание, вопрос к знатокам: Каким образом можно либо автоматически переделывать у данных файлов дату на момент появления в директориях ( я уже думал, может перед выполнением скрипта бэкапить новые "старые" файлы, удалять их, а потом заново заливать, но со свежей датой) , либо каким-то образом переделать скрипт.

Пожалуйста помогите. Задача архиважная.
Заранее СПАСИБО.

Последний раз редактировалось POV, 10-01-2023 в 13:00.


Отправлено: 12:51, 10-01-2023 | #13


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1167
Благодарности: 486

Профиль | Отправить PM | Цитировать


Цитата POV:
проблема в том, что в папки сотрудники кидают и файлы которым сто лет в обед, и соответственно скрипт видит, что они старые и на следующий день их кикает ( потому как они не ВНОВЬ созданные ) »
Используйте дату создания (при копировании файлов, присваивается текущее время) для отбора файлов на удаление, вместо даты изменения (при копировании файлов не изменяется).
Код: Выделить весь код
DIR /?
- поможет в выборе поля даты создания файлов, хотя у Вас для отбора и удаления файлов используется forfiles...
Цитата POV:
либо каким-то образом переделать скрипт.
Пожалуйста помогите. Задача архиважная. »
Если только на powershell... либо подождите megaloman, возможно, он что-нибудь придумает на cmd...

-------
scio me nihil scire. Ѫ


Отправлено: 15:15, 10-01-2023 | #14


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6483
Благодарности: 1462

Профиль | Отправить PM | Цитировать


POV, они вновь созданные. Просто forfiles смотрит не на дату создания, а на дату изменения.
Люди кладут файлы, и у файлов новая дата создания, но старая дата изменения.

Возьмём пример:
Код: Выделить весь код
dir D:\temp\obmen |select name,creationtime,lastwritetime

Name        CreationTime        LastWriteTime      
----        ------------        -------------      
new-new.txt 10.01.2023 15:56:30 10.01.2023 15:55:11
new-old.txt 10.01.2023 15:55:55 27.12.2022 15:55:11
old-new.txt 27.12.2022 15:55:11 10.01.2023 15:55:11
old-old.txt 27.12.2022 15:55:53 27.12.2022 15:55:53
В вашем случае выбираются файлы со старой датой изменения
Код: Выделить весь код
# CMD
forfiles -p "D:\temp\obmen" -s -m *.* -d -10

"new-old.txt"
"old-old.txt"

# Аналог на Powershell
dir D:\temp\obmen |? lastwritetime -lt (get-date).Date.AddDays(-10)

    Каталог: D:\temp\obmen

Mode                 LastWriteTime         Length Name                                                                                                                     
----                 -------------         ------ ----                                                                                                                     
-a----        27.12.2022     15:55              0 new-old.txt                                                                                                              
-a----        27.12.2022     15:55              0 old-old.txt
Если учитывать дату создания, то будет так (powershell):
Код: Выделить весь код
dir D:\temp\obmen |? creationtime -lt (get-date).Date.AddDays(-10)

    Каталог: D:\temp\obmen

Mode                 LastWriteTime         Length Name                                                                                                                     
----                 -------------         ------ ----                                                                                                                     
-a----        10.01.2023     15:55              0 old-new.txt                                                                                                              
-a----        27.12.2022     15:55              0 old-old.txt
По идее, можно учитывать и обе даты, т. е., удаляться будет только то, что старше 10 дней в обоих случаях (powershell):
Код: Выделить весь код
$olderThan = (get-date).Date.AddDays(-10)
dir D:\temp\obmen |? {$_.creationtime -lt $olderThan -and $_.lastwritetime -lt $olderThan} |del -WhatIf
WhatIf: Выполнение операции "Удаление файла" над целевым объектом "D:\temp\obmen\old-old.txt".

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:08, 10-01-2023 | #15

POV POV вне форума

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо, дорогие, что откликнулись !
YuS_2,
Цитата YuS_2:
Если только на powershell... »
Да по-фигу на чём, лишь-бы работало. Но к сожалению на PowerShell не умею .... Экспериментировал с
HTML код: Выделить весь код
https://github.com/sanglyb/remove-old-files-powershell

, но там так-же работает, как и вариант с forfiles. Вот бы кто впихнул в этот .ps1 то, что нужно и куда нужно ....
DJ Mogarych
Благодарю, смысл уловил, но опять-же как пониманию на cmd этого в данном случае не реализовать, и опять-же powershell ... (читай выше) ....

Отправлено: 05:14, 11-01-2023 | #16


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1167
Благодарности: 486

Профиль | Отправить PM | Цитировать


Цитата POV:
Но к сожалению на PowerShell не умею »
Всё просто: чтобы работать с чем-либо, необходимо прежде изучить таки это самое что-либо
Для начала:
https://learn.microsoft.com/ru-ru/po...powershell-7.3
ну и:
https://andpop.ru/courses/winscript/...posh_popov.pdf

а по-быстрому:
1. Проверить политику запуска скриптов (в первой ссылке есть описание, вот более конкретная ссылка). Если стоит запрет на выполнение скриптов, то измените политику выполнения PowerShell на удаленно подписанную.
2. Скрипт лучше оформить в текстовом файле с кодировкой UTF-8 и дать ему какое-либо название, например: script.ps1
3. Запустите скрипт из командной оболочки powershell:
Код: Выделить весь код
.\script.ps1
или создайте "батник", со строкой запуска скрипта через powershell:
Код: Выделить весь код
@echo off
powershell -ex bypass -f ".\script.ps1"
pause
положите его рядом со скриптом и запустите.


Главное:
Прежде, чем запускать скрипт, откорректируйте его под свои параметры, например так:
Код: Выделить весь код
$folder = '\\fs\Obmen\'
$olderThan = (get-date).Date.AddDays(-10)
dir $folder -file |? {$_.creationtime -lt $olderThan -and $_.lastwritetime -lt $olderThan} |del -WhatIf
Посмотрите вывод скрипта... если перечислены правильные файлы на удаление, то уберите параметр -WhatIf в командлете del (сам командлет имеет другое полное название, это его алиас) и выполните скрипт повторно для реального удаления файлов...

-------
scio me nihil scire. Ѫ


Отправлено: 08:09, 11-01-2023 | #17

POV POV вне форума

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


YuS_2, Благодарю за ответ.
Про powershell: Естественно я могу такие скрипты запускать, я не умею на них писАть ! Потому и ковырял батники (что проще)
Приведенный Вами вариант смогу испробовать через часик. Дам знать.

Отправлено: 09:20, 11-01-2023 | #18

POV POV вне форума

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Попробовал ....
.ps1 просто схлопывается через секунду, а если через cmd, то "Для продолжения нажмите любую клавишу . . ." и после нажатия такая-же ситуация .... И пробовал запускать под админом.

Отправлено: 09:52, 11-01-2023 | #19


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
либо подождите megaloman, возможно, он что-нибудь придумает на cmd.. »
Коллега меня мамонтом обозвал!!!
Код: Выделить весь код
@Echo Off
cls
	Set "BoxIn=\\fs\obmen"
	Set /A Delta=-10
	Call :FromDate %Delta% %Date% "YYYYDDMM"

	Pushd "%BoxIn%"||(Echo Folder %BoxIn% not found &Pause &Exit /B)
		FOR /F "usebackq tokens=1,2,3,5* delims=. " %%i In (`2^>nul Dir /O:-D /T:C^|findstr /R /C:"^..\...\.....  ..:..         .*"`) DO (
			If %%k%%j%%i LSS %YYYYDDMM% (Echo %%k%%j%%i = "%%m" &Del "%%m")
		)
	Popd
pause
Exit /B 0

:FromDate

rem Пересчет даты на заданное кол-во дней
rem В первом аргументе +- дни
rem Во втором аргументе дата в формате dd.mm.yyyy
rem В третем аргументе имя переменной в кавычках где получим новую дату в формате yyyymmdd 

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyymmdd"
rem результат в перемменной %yyyymmdd%

 SetLocal
 Set "DT=%~2"
 Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
 Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
 Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
 Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
 Set /A J=J+2-12*L,I=100*(N-49)+I+L
 Set /A yyyy=I,mm=100+J,dd=100+K
 EndLocal& Set "%~3=%yyyy%%mm:~-2%%dd:~-2%"
Exit /B 0
Подразумевается, что формат отображения даты-времени в системе "ДД.ММ.ГГГГ чч:мм"
Проверьте, что у Вас отображается в команде Dir
Для отладки, чтобы скрипт реально не удалял файлы, перед Del можно поставить Echo
&Echo Del "%%m"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 11-01-2023 в 11:59.


Отправлено: 11:49, 11-01-2023 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаление старых файлов/папок если их кол-во больше n

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] Кол-во файлов в папке. Balancer Microsoft Windows 7 11 21-10-2012 20:07
CMD/BAT - Удаление старых файлов по имени файлов Bиктор Скриптовые языки администрирования Windows 1 19-04-2010 03:37
[решено] как получить список, если кол-во строчек не постоянно Russo AutoIt 2 18-12-2009 10:41
кол-во файлов в папке rivera Microsoft Windows NT/2000/2003 3 29-06-2006 09:38
максимальное кол-во файлов на Cd-ROMе Dr Mad Хочу все знать 1 05-09-2005 06:19




 
Переход