Войти

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


Страниц : [1] 2 3 4

avfiga
25-07-2009, 13:39
Здравствуйте! Помогите пожалуйсто создать скрипт для удаления старых файлов и папок старше n - дней из определенной папки.
Нашел такой скрипт который удаляет старые файлы из корневого каталога, а как переделать его так что б он удалял все папки и файлы старше n - дней незнаю.

Если кто то сможет помочь заранее огромное спаибо !!!!!!!!!!!

Пример скрипта:

RunForFiles "C:\Test\" 'файлы, среди которых будет производиться поиск устаревших, лежат в этой директории

Function RunForFiles(folderspec)
Dim fso, f, f1, fc

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(folderspec)
Set fc = f.Files
For Each f1 in fc
WScript.Echo (folderspec & f1.name) 'вывод сообщения с именем файла, который будет удален. используется в тестовых целях, в рабочем скрипте нужно отключить
If CompareDate(folderspec & f1.name) = True Then Log(folderspec & f1.name)
'DelFile(folderspec & f1.name) 'удалить файл. сейчас удаление отключено для отладки.
Next
End Function

'***************************************************************
'Возвращает True, если дата создания файла больше 14-ти дней
Function CompareDate(strFileName)
Dim fso, f, s, i
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(strFileName)

i = DateDiff("d", f.DateCreated, Now)

If i > 14 Then 'здесь указывается количество дней, которое используется для сравнения с датой создания файла, т.е., в этом примере удаляются все файлы, созданные раньше, чем 14 дней назад
'WScript.Echo(strFileName&" "&i) 'вывести имя файла и его возраст, используется для отладки
CompareDate = True
Else
CompareDate = False
End If
End Function

'****************************************************************
'функция для извлечения пути
Function ExpandPath(strFullFileName)
ExpandPath = Left(strFullFileName,instrrev(strFullFileName,"\"))
End Function

'***************************************************************
Function DelFile(strFullFileName)
Dim fso, F
Set fso = CreateObject("Scripting.FileSystemObject")
Set F = fso.GetFile(strFullFileName)
F.Delete
End Function

'****************************************************************
'функция для создания log-файла. он создается рядом со скриптом, имя - дата запуска скрипта.
Function Log(strLineToLog)
Const ForReading = 1, ForWriting = 2
Dim fso, f, r, FileLog
r = ""

FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)-4)) & "_" & DatePart("yyyy",Date) & "_" & DatePart("m",Date) & "_" & DatePart("d",Date) & "." & "log"
Set fso = CreateObject("Scripting.FileSystemObject")

If (fso.FileExists(FileLog)) Then
Set f = fso.OpenTextFile(FileLog, Forreading, True)
r = f.Readall
f.Close
Set f = fso.OpenTextFile(FileLog, ForWriting, True)
f.Write strLineToLog & vbCrLf & r
f.Close
Else
Set f = fso.OpenTextFile(FileLog, ForWriting, True)
f.Write strLineToLog
f.Close
End If
End Function

Этот скрипт удалит в указанной папке все файлы, которые были созданы 14 и больше дней назад.

amel27
25-07-2009, 17:16
как переделать его так что б он удалял все папки и файлы старше n - дней незнаю »для файлов:
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDIR = objFSO.GetFolder(strFldr)
Set objCol = objDIR.Files

For Each objItem In objCol
If DateDiff("d", objItem.DateLastModified, Now) > intDays Then objItem.Delete
Next
использование:
CScript MyScript.VBS 14 C:\TEST
для папок неясно, в смысле с рекурсией?.. приведенный в топике скрипт ищет только в текущей

avfiga
25-07-2009, 17:40
Да действительно данный скрипт удаляет только файлы и только в папке C:\Test, а надо переделать так что б удалял все что есть в папке C:\Test.

amel27
26-07-2009, 05:36
надо переделать так что б удалял все что есть в папке C:\Test »
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateLastModified, Now) > iDays Then oI.Delete
Next

For Each oI In cD
DelOld oI.Path, iDays
If oI.Size = 0 Then oI.Delete
Next
End Function


использование:
CScript MyScript.VBS 14 C:\TEST

avfiga
26-07-2009, 15:42
Код:
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateLastModified, Now) > iDays Then oI.Delete
Next
For Each oI In cD
DelOld oI.Path, iDays
If oI.Size = 0 Then oI.Delete
Next
End Function »

Извеняюсь я в написании скриптов полный чайник! Этот блок кода необходимо подставить в страрый код?

amel27
26-07-2009, 15:55
Этот блок кода необходимо подставить в страрый код? »
это VBS-скрипт удаления старого содержимого каталога по дате, пример использования:
MyScript.VBS 14 C:\TEST

З.Ы. рекомендую все-таки разобраться с его работой

avfiga
26-07-2009, 16:00
Большое спасибо! Если не затруднит можно добавить коментарии?

amel27
27-07-2009, 10:08
avfiga, комментарии только усложнят читаемость, не в обиду - код и без того прозрачен... хотя, если очень нужно, могу сделать построчный разбор

Anton04
27-07-2009, 12:30
amel27,

Спасибо за труды.
Меня тоже заинтересовал данная тема. Если не затруднит, ответь на пару вопросов:

1.Этот скрипт удаляет файлы и папки основываясь только на дату создания или дата последнего изменения тоже играет для него роль?

2.А как будет обрабатываться объект если каталог подпадает под удаление (т.е. создан раньше), а файл в этом каталоге нет (т.е. создан позже)?

amel27
27-07-2009, 12:38
Anton04,

1. ".DateLastModified" - дата изменения, для удаления по дате создания заменить на ".DateCreated"
2. Сначала удаляются файлы, каталог удаляется если окажется пустым (будут удалены все файлы/подкаталоги)

Anton04
27-07-2009, 13:23
amel27,

Спасибо, возьмём на заметку :clapping:

Ограничений по вложенности каталогов нет? (ну окрамя тех, что присуствуют в операционной и файловой системе)
С русскими именами тоже проблем не будет?
Я так понимаю, что саму головную папку (в примере это папка test) скрипт не трогает?
Как обстоят дела со скрытыми файлами и папками. И файлами с атрибутом только для чтения (удаляет/пропускает)?

P.S. А вот если бы он ещё создавал лог файл с неудалёнными файлами и папками (после его работы), ну вооще сказка была-бы :angel: ах мечты, мечты...

amel27
27-07-2009, 15:51
Anton04, немного изменил - с удалением защищенных атрибутами и выводом удаляемых файлов:
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateLastModified, Now) > iDays Then
WScript.Echo oI.Path
oI.Attributes = 0
oI.Delete
End If
Next

For Each oI In cD
DelOld oI.Path, iDays
If oI.Size = 0 Then
oI.Attributes = 0
oI.Delete
End If
Next
End Functionпример запуска:
cscript //Nologo MyScript.VBS 14 C:\TEST >MyScript.Log

Anton04
27-07-2009, 17:55
amel27,

Ещё раз спасибо.

:oszone:

Sempl2
12-08-2009, 18:53
amel27, спасибо за скрипт
Меня интересует вопрос, а если в папке test есть скрытая папка с ограничением доступа, как сделать так чтоб он не выкидывал ошибку а пропускал её?

amel27
13-08-2009, 01:57
Sempl2, самое постое - добавить в начало скрипта:
On Error Resume Next

P.S. при этом команды сброса атрибутов нужно удалить или закомментировать:
' oI.Attributes = 0

Sempl2
13-08-2009, 09:46
amel27, ошибку не выкидывает, но удалять не продолжает скрипт заканчивает работу на этой папке.
Можно как то сделать чтоб он пропускал её и продолжал удалять?

amel27
13-08-2009, 11:17
удалять не продолжает скрипт заканчивает работу на этой папке »понятно... :tomato2:
если в папке test есть скрытая папка с ограничением доступа »гм... чет я загрузился... если с файлами понятно: атрибут стоит - пропускаем, нет - удаляем, а как быть с папками - пропускать ВСЁ содержимое?.. или атрибуты проверять только на папках?.. кстати, у меня VBS ругается только на атрибут RO, остальные никак не мешают удалению.

Sempl2
13-08-2009, 11:40
amel27, у меня общая папка находится под DFSom, а он создает внутри папку "DfsrPrivate" на нее ограничен доступ и удалять её нельзя. Вот и надо как то сделать чтоб все старые файлы и папки чистил, а её пропускал.

amel27
13-08-2009, 12:42
Sempl2, попробуй поставить строки "On Error Resume Next" в ДВА места:

- первой строкой скрипта
- первой строкой функции DelOld (сразу после строки "Function DelOld")

Sempl2
13-08-2009, 15:38
amel27,
Спасибо большое все получилось :yahoo:




© OSzone.net 2001-2012