Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Нужен батник чтоб удалял папки выше 10 дней (http://forum.oszone.net/showthread.php?t=237763)

Krol0071 03-07-2012 09:15 1944728

Нужен батник чтоб удалял папки выше 10 дней
 
Добрый день!

Смотрю есть люди которые выручают друг друга.
Выручите народ пожалуйста и меня! :)
Очень нужен бат-файл чтобы удалял старые папки свыше 10 дней.
Пример:

есть путь D:\arhiv
В данной папке "arhiv" создаются папки с именем, формата "20110420" в которых содержатся файлы.
Вот и нужен батник чтобы удалял все старые папки по данному пути.

Заранее благодарен!!!

Krol0071 03-07-2012 09:57 1944751

да еще забыл сказать, что в этих папках хронятся файлы формата .txt

Vadikan 03-07-2012 10:08 1944758

https://www.outsidethebox.ms/11968/

Krol0071 03-07-2012 10:50 1944780

Vadikan, спасибо за совет, но там в основном написано как удалять файлы.
А это я знаю. Меня больше интересует как можно удалять папки сроком выше 10 дней. Но как известно папка не будет удалена пока она не пуста. Вот в этом и загвостка.
По этому я к вам и пришел. Нужен батник который сможет удалять получается файлы в подкаталогах свыше 10 дней или сразу папки свыше 10 дней.
Как написать я не знаю.... в этом деле не очень силен, так начинающий только.

megaloman 03-07-2012 11:14 1944802

Код:

@Echo Off

Set Arhiv=D:\arhiv
Set DeltaDay=-10

SetLocal EnableDelayedExpansion
Call :FromNow %DeltaDay% %Date%

FOR /F "usebackq delims=" %%d IN (`Dir "%Arhiv%\" /A:D /B`) DO If %%d LSS %yyyymmdd% Rd "%Arhiv%\%%d" /s /q
GoTo :Eof

:FromNow
rem
rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd
rem
rem Пример использования
rem
rem SetLocal EnableDelayedExpansion
rem Set DeltaDay=-10
rem Call :FromNow %DeltaDay% %Date%
rem Echo %Date%  %DeltaDay%  %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 yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
GoTo :Eof

Не проблема убить папку (смотрите Rd /?). Проблема пересчитать дату. Использовал решение. Я предполагал, что в папке архив нет иных папок, кроме как с именем по датам.
Подозреваю, что короче получится, если использовать утилиту forfiles, но стандартно она имеется в системе далеко не всегда.

Krol0071 03-07-2012 11:36 1944826

megaloman, респект и уважение тебе! долгих лет жизни! Я в восторге! Все работает!

Но вот еще один вопрос появился, а можно ли в одном батнике написать несколько путей?

в данном примере D:\arhiv, а можно допустим
D:\arhiv\1\1\2 и
D:\arhiv\1\1\3

Пример того что хочу объяснить:

Set Arhiv=D:\arhiv\1\1\2
Set Arhiv=D:\arhiv\1\1\3

...а потом уже пошло
Set DeltaDay=-10

SetLocal EnableDelayedExpansion
Call :FromNow %DeltaDay% %Date%



Спасибо тебе огромное, megaloman

megaloman 03-07-2012 11:48 1944834

Самое простое сделать несколько циклов последовательно вместо одного из предыдущего решения, если в папках всё те же архивы с именами по дате и убить надо одинаково старые папки
Код:

Set Arhiv=D:\arhiv\1\1\2
FOR /F "usebackq delims=" %%d IN (`Dir "%Arhiv%\" /A:D /B`) DO If %%d LSS %yyyymmdd% Rd "%Arhiv%\%%d" /s /q
Set Arhiv=D:\arhiv\1\1\3
FOR /F "usebackq delims=" %%d IN (`Dir "%Arhiv%\" /A:D /B`) DO If %%d LSS %yyyymmdd% Rd "%Arhiv%\%%d" /s /q

Если папок с архивами много, пишите, но хотелось бы знать, по какому правилу образованы их имена.

kiripanda 03-07-2012 14:15 1944954

Код:

@echo off &setlocal enableextensions

set /a Last=10

call :rd "z:\arhiv\0\1\2"
call :rd "z:\arhiv\0\1\3"
goto :eof

:rd
for /f "skip=%Last%" %%d in (
'dir /b/ad/o-n "%~1\????????" ^|findstr /rbec:[0-9]*'
) do rd /s /q "%~1\%%d"
goto :eof

оставляет последние 10

sergeypele 29-04-2013 17:56 2141781

vbs удаляет все в указанной директории
set fso=Wscript.CreateObject("Scripting.FileSystemObject")

dir="C:\mail"
Set f = fso.GetFolder(dir)
Set fc = f.Files
For Each f1 in fc
d= f1.DateCreated
diff=DateDiff("d",d,Now)
if diff>10 Then # лол-во дней
WScript.Echo "DELETE! " & f1.name
fso.DeleteFile(dir & "\" & f1.name)
end if
Next

greenOwl 03-07-2013 16:01 2178708

Цитата:

Я предполагал, что в папке архив нет иных папок, кроме как с именем по датам.
А если имена не по датам ? как можно выйти из этой ситуации ?

sunnykey 05-07-2013 11:04 2179705

Цитата:

Цитата greenOwl
А если имена не по датам ? как можно выйти из этой ситуации ? »

Уже стопицот раз обсуждали такие темы:CMD/BAT - Удаление по дате


Время: 20:03.

Время: 20:03.
© OSzone.net 2001-