PDA

Показать полную графическую версию : [решено] Удаление папки по дате


Obnin
06-08-2010, 16:32
Всем добрый день!

Имеются папки - архивы за каждый день. Названия папки - это дата создания архива.

Подскажите пожалуйста, каким образом можно удалить все папки, дата создания которых больше, например, 10-ти дней.
Если нельзя удалить по названию, может можно удалить по дате создания...

Спасибо!

Олег97
06-08-2010, 17:13
Obnin, формат даты папок 25.12.10 или 25\12\10? пожалуйста пример.

NiOl
06-08-2010, 17:16
Есть маленькая сложность - если Вы желаете отмерить ИМЕННО 10 ДНЕЙ - Вам придется столкнуться с расчетом календаря, эта тема здесь несколько раз поднималась и если честно, мне ни одно решение этой задачи не показалось "красивым", но да это "имхо". Если упростить Вашу задачу и сохранять просто 10 последних архивов, а не за последние 10 дней (в случае, если бэкап по какой-либо причине не прошел, то архивных копий за последние 10 дней может оказаться значительно меньше, а то и вообще не оказаться...), то такие вопросы здесь тоже поднимались и решение очень просто:
@echo off
SetLocal EnableExtensions

set BackUp=MyDisk:\MyBackUp
set Num=10

pushd %BackUp%
for /f "tokens=* delims=" %%D in ('dir /ad /b /o-d') do call :Proceed "%%D"
popd
exit

:Proceed
if not %Num%==0 set /a Num-=1&exit /b
echo %date% %time%: Erase %1>>%~dpn0.log
rd /s /q %1 2>nul >nul
exit /b

* сортировка каталогов не по названию даты, а именно по дате выбрана потому, что неизвестен формат, в котором записана дата каталогов: чаще всего каталоги называют в виде "DD.MM.YYYY", т.к. это более простой способ, хотя для наглядности гораздо удобнее создавать каталоги в виде "YYYY-MM-DD" - хотя такое имя еще надо получить... (например так: %date:~6,4%-%date:~3,2%-%date:~0,2%)

deepred
06-08-2010, 18:14
Obnin,

Просто огромный плюс свойств FSO - это работа с датами обьектов:

Option Explicit
Dim FSO, Folder, subFolder
Dim strSource
Dim intErrLevel

strSource = "F:\disk" ' папка содержащая каталоги для проверки
intErrLevel = 0

Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

If FSO.FolderExists(strSource) Then
Set Folder = FSO.GetFolder(strSource)
For Each subFolder In Folder.subFolders
if DateDiff("D", subFolder.DateLastModified, Now) > 10 Then
subFolder.Delete
End If
Next
Else
WScript.Echo "папка " & strSource & " не найдена."
intErrLevel = 1
End If
Set FSO = Nothing
WScript.Quit intErrLevel

Obnin
09-08-2010, 13:31
Вариант NiOl отлично работает! :) Огромное спасибо!
А вариант deepred сильно ругается на отсутствие компонент...

Еще один малюсенький вопросик.
Все это дело планируется еще и архивировать, причем на Win64.
На Win32 я скопировал Rar.exe из папки установки winrar, и использую его.
Будет ли он работать на 64bit(сейчас проверить не могу)?
Если нет, то что посоветуете?

относительно "А вариант deepred сильно ругается на отсутствие компонент..." пишет:

C:\tst>Option Explicit
"Option" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\tst>Dim FSO, Folder, subFolder
"Dim" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

.... и т.д.

NiOl
09-08-2010, 13:51
относительно "А вариант deepred сильно ругается на отсутствие компонент..." пишет: »

Скрипт, приведенный DeepRedом - на вижалбэйсике. Соответственно его надо сохранить с расширением .VBS (кажется)

Про 64-битную ОС я не скажу ничего, но Вам будет вполне достаточно указать путь к установленному архиватору (на каждой машине), а не таскать его со скриптом. Может быть придется переползти на zip - существуют бесплатные, смд реализации этого архиватора...

deepred
09-08-2010, 14:33
Obnin,

М-да, не задачка вышла - как-то не догадался подписать, что код является сценарием WSH (Windows Script Host) и написан на языке VBScript,что NiOl совершенно верно определил.

По поводу Rar.exe у меня он замечательно работает на машине с архитектурой x64 под WinVista HP 64bit, думаю и у вас пробем не возникнет, к тому разработчик WinRar "обещал" полную совместимость... Вам будет вполне достаточно указать путь к установленному архиватору (на каждой машине), а не таскать его со скриптом. », полезное замечание, дополнительно можно воспользоваться приглашением командной строки prompt

Obnin
09-08-2010, 14:49
Большое всем спасибо! :)
Потестим, посмотрим...

Sony777
14-12-2011, 13:21
NiOl, спасибо за скрипт, очень помог. Но было бы замечательно, если бы помогли разобраться, как сделать чтобы скрипт работал на несколько разных дисков и директорий, а не на одну. Вот у меня 2 раздела жесткого куда записываются архивы и на каждом разделе по 3+ директории. Как изменить скрипт чтобы можно было прописывать несколько директорий? Или есть еще какие-то варианты?
В общем подводя итог - скрипт работает на отлично, нужно только чтобы он делал это все не только в одной директории. За ранее спасибо.

Я реализовал это описуя каждую директорию отдельно и прописуя цикл и условие каждой директории соответственно. Так все работает хорошо, но скрипт, а тем более батник при выполнении выходит большим.




© OSzone.net 2001-2012