Показать полную графическую версию : [решено] Удаление старых файлов/папок если их кол-во больше n
greenOwl
03-07-2013, 14:32
Добрый день!
Помогите со скриптом, который будет сканировать нужную папку (например: C:\aaa), и если в нем файлов больше чем n (например 10), то удалить самый старый файл. И тоже самое нужно для папок.
Очень надеюсь на вашу помощь.
то удалить самый старый файл »
Один файл?
И тоже самое нужно для папок. »
Домашнее задание?
greenOwl
03-07-2013, 15:43
Хотя бы для одного файла, но лучше конечно, столько файлов, что бы осталось n.
Не, не домашка, как у всех, архивирование )
Файлы:
@echo off
setlocal enableextensions enabledelayedexpansion
set sFolder=C:\Documents and Settings\User\Мои документы\Мои рисунки\PicPic
set /a iCount = 10
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
Если файлы, подлежащие удалению, отображаются верно — уберите «echo» перед «del» для их реального удаления.
greenOwl
03-07-2013, 16:29
Iska, спасибо огромное, а то я искал, не нашел, думал, что на этом и остановлюсь :laiel:
Freddy1984
06-07-2018, 10:36
Iska, а для папок не подскажете как?
Iska, а для папок не подскажете как? »
Примерно так:
@echo off
setlocal enableextensions enabledelayedexpansion
set sFolder=C:\Documents and Settings\User\Мои документы\Мои рисунки\PicPic
set /a iCount = 10
for /f "skip=%iCount% usebackq delims=" %%i in (
`dir /b /a:d /o:-d /t:w "%sFolder%"`
) do echo rd /s /q "%sFolder%\%%~i"
endlocal
exit /b 0
Будьте крайне осторожны! Не проверялось! Если каталоги, подлежащие удалению, отображаются верно — уберите «echo» перед «rd» для их реального удаления.
Приветствую. Подскажи, как написать bat файл и сделать его приложением. Что бы в нем можно было выбирать сетевые или просто пути для разделов в которых хранятся файлы и папки, и для каждого раздела можно было бы указывать какое количество файлов допустимо в данном разделе и какой объем памяти должен быть для данного раздела, если он превышается что бы программа удаляла старые архивы файлы или папки. Пример для 1С бухгалтерии выделен раздел 1 ТБ но он вечно заполняется и уследить не успеваю, так чтобы при его критичном заполнении удалялись старые резервные копии, либо при превышении n-го количества фалов в разделе удалялись старые. За ранее большое спасибо.
сделать его приложением »
найдите "Bat_To_Exe_Converter", например.
выбирать сетевые или просто пути для разделов »
указывать какое количество файлов »
поставьте в переменных параметры
set "sFolder=%~1"
set /a iCount =%~2
и запускайте так: "name.bat" "Диск:\Папка" "Число файлов"
Извините за режим чайника. Немного не въехал(((
set "sFolder=%~1"
set /a iCount =%~2
что выполняют данные п
что выполняют данные п »
Пытаются присвоить переданные пакетному файлу параметры двум переменным окружения.
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 "Диск:\Папка" "Число файлов"
Доброе время суток !
Прошу помощи .... 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 дней уничтожаются. Но проблема в том, что в папки сотрудники кидают и файлы которым сто лет в обед, и соответственно скрипт видит, что они старые и на следующий день их кикает ( потому как они не ВНОВЬ созданные )
Внимание, вопрос к знатокам: Каким образом можно либо автоматически переделывать у данных файлов дату на момент появления в директориях ( я уже думал, может перед выполнением скрипта бэкапить новые "старые" файлы, удалять их, а потом заново заливать, но со свежей датой) , либо каким-то образом переделать скрипт.
Пожалуйста помогите. Задача архиважная.
Заранее СПАСИБО.
проблема в том, что в папки сотрудники кидают и файлы которым сто лет в обед, и соответственно скрипт видит, что они старые и на следующий день их кикает ( потому как они не ВНОВЬ созданные ) »
Используйте дату создания (при копировании файлов, присваивается текущее время) для отбора файлов на удаление, вместо даты изменения (при копировании файлов не изменяется).
DIR /?
- поможет в выборе поля даты создания файлов, хотя у Вас для отбора и удаления файлов используется forfiles...
либо каким-то образом переделать скрипт.
Пожалуйста помогите. Задача архиважная. »
Если только на powershell... либо подождите megaloman, возможно, он что-нибудь придумает на cmd...
DJ Mogarych
10-01-2023, 16:08
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".
Спасибо, дорогие, что откликнулись !
YuS_2, Если только на powershell... » Да по-фигу на чём, лишь-бы работало. Но к сожалению на PowerShell не умею .... Экспериментировал с https://github.com/sanglyb/remove-old-files-powershell, но там так-же работает, как и вариант с forfiles. Вот бы кто впихнул в этот .ps1 то, что нужно и куда нужно .... :unsure:
DJ Mogarych
Благодарю, смысл уловил, но опять-же как пониманию на cmd этого в данном случае не реализовать, и опять-же powershell ... (читай выше) ....
Но к сожалению на PowerShell не умею »
Всё просто: чтобы работать с чем-либо, необходимо прежде изучить таки это самое что-либо :)
Для начала:
https://learn.microsoft.com/ru-ru/powershell/scripting/learn/ps101/01-getting-started?view=powershell-7.3
ну и:
https://andpop.ru/courses/winscript/books/posh_popov.pdf
а по-быстрому:
1. Проверить политику запуска скриптов (в первой ссылке есть описание, вот более конкретная ссылка (https://learn.microsoft.com/ru-ru/powershell/scripting/learn/ps101/01-getting-started?view=powershell-7.3#execution-policy)). Если стоит запрет на выполнение скриптов, то измените политику выполнения 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 (сам командлет имеет другое полное название, это его алиас) и выполните скрипт повторно для реального удаления файлов...
YuS_2, Благодарю за ответ.
Про powershell: Естественно я могу такие скрипты запускать, я не умею на них писАть ! Потому и ковырял батники (что проще)
Приведенный Вами вариант смогу испробовать через часик. Дам знать.
Попробовал ....
.ps1 просто схлопывается через секунду, а если через cmd, то "Для продолжения нажмите любую клавишу . . ." и после нажатия такая-же ситуация .... И пробовал запускать под админом.
megaloman
11-01-2023, 11:49
либо подождите megaloman, возможно, он что-нибудь придумает на cmd.. »Коллега меня мамонтом обозвал!!! :lol: @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"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.