Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Автоматическое удаление папок и файлов старше x дней

Автор: magiogre
Дата сообщения: 12.05.2010 10:52
Помогите написать vbs-скрипт, который будет сканировать папку и удалять из неё все файлы и папки старше x-дней.




Автор: tyghr
Дата сообщения: 12.05.2010 11:15
сам недавно писал:

описание:
Удаляет старые бэкапы, (только RAR!!!!!!, если надо и другие расширения, поправь сам)
рядом с vbs должны лежать!!
файл логов delold.log
файл настроек delold.ini

настройки в ini:
foldbackup - путь к папке
termdate - интервал дней хранения, после которого удаляются архивы
except - названия папок, которые не надо сканировать (исключения)

пример ini:
foldbackup=\\srv-storage\BACKUP
termdate=30
except=desktop
except=site


сам vbs ^ ^

Код:
dim fso, foldback, termdate, except()
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Set objShell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
set Locator = createobject("wbemscripting.swbemlocator")
Set ServicesSet = locator.connectserver("","\root\cimv2")

foldpath = objShell.CurrentDirectory
inipath=foldpath & "\delold.ini"
logpath=foldpath & "\delold.log"
Set f = fso.GetFile(inipath)
Set flog = fso.GetFile(logpath)

Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault)
excount=0
Do Until ts.AtEndOfStream
    templine = ts.ReadLine
    if mid(templine,1 ,6)="except" then excount=excount + 1
Loop
redim except(excount)
ts.Close

Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault)
exnumber=1
Do Until ts.AtEndOfStream
    templine = ts.ReadLine
    select case mid(templine,1,6)
    case "foldba"
        if len(templine)>11 then foldback = mid(templine,12,len(templine)-11)
    case "termda"
        if len(templine)>9 then termdate = int(mid(templine,10,len(templine)-9))
    case "except"
        if len(templine)>7 then except(exnumber)= mid(templine,8,len(templine)-7) : exnumber = exnumber + 1
    end select
Loop
ts.Close

Set tslog = flog.OpenAsTextStream(ForAppending, TristateUseDefault)
currtime = Now()
tslog.writeline "-------------" & currtime & "--------------"
gofolder(foldback)
tslog.writeline "----------------------------------------------"
tslog.close

Set flog = Nothing
Set f = Nothing
set servicesset = nothing
set locator = nothing
set fso = nothing
set objshell = nothing

Private Sub GoFolder(ByVal fldSTR)
    on error resume next
    Dim fldRUN
    Dim fldSUB
    Dim Raschir
    set fldRUN = fso.GetFolder(fldSTR)
    for i=1 to excount
     if lcase(fldRUN.name) = except(i) then exit sub
    next
    For Each fldSUB In fldRUN.SubFolders
GoFolder fldSUB
    Next
    For Each fileSUB In fldRUN.Files
     raschir=""
Raschir = Mid(fileSUB.Name, Len(fileSUB.Name) - 2, 3)
If Raschir = "rar" Then
        If (currtime - fileSUB.DateLastModified) > termdate Then
            tslog.writeline fileSUB.path
            fso.DeleteFile (fileSUB.path)
        end if
     end if
    Next
End Sub
Автор: magiogre
Дата сообщения: 12.05.2010 11:29
Мне бы попроще, чтобы скрипт тупо удалял все файлы и папки, в т.ч. подпапки, которые старше х дней.
(Нужно зачищать папку, которую пользователи используют для обмена данными.)
Автор: vlary
Дата сообщения: 12.05.2010 12:44
Программирование "удобняшек" на VBScript
Автор: Serg41
Дата сообщения: 12.05.2010 13:40
у меня так работает много лет, взял тоже с форума, удаляет файлы старше N дней
сделай файл *.vbs и смотри

Option Explicit
Dim fso, dTwoDaysAgo
dTwoDaysAgo = Date() - 16
Set fso = CreateObject("Scripting.FileSystemObject")

DirWalk("c:\backup\")

Sub DirWalk(parmPath)
Dim oSubDir, oSubFolder, oFile, n

On Error Resume Next
Set oSubFolder = fso.getfolder(parmPath)
For Each oFile In oSubFolder.Files
If Err.Number <> 0 Then
Err.Clear
ElseIf oFile.DateLastModified < dTwoDaysAgo Then
fso.DeleteFile oFile.Path, True
End If
Next

For Each oSubDir In oSubFolder.Subfolders
DirWalk oSubDir.Path
Next
On Error Goto 0
End Sub
Автор: magiogre
Дата сообщения: 12.05.2010 21:32
Спасибо! Оба варианта отлично работают!
Автор: IgorOhrimenko
Дата сообщения: 03.11.2010 15:22

Цитата:

For Each oSubDir In oSubFolder.Subfolders
DirWalk oSubDir.Path
Next

Немного дополнив этот цикл можно удалять пустые папки.

For Each oSubDir In oSubFolder.SubFolders
        DirWalk oSubDir.Path
        If oSubDir.Size = 0 Then
            oSubDir.Delete True
        End If
Next
Автор: zvcom
Дата сообщения: 15.11.2010 11:24
Еще можно задачу решить с помощью команды forfiles.
Вот пример удаляющий файлы в каталоге D:\Folder\ старше 7-ми дней с логированием:


Код:
rem Удалять файлы, старше дней
set Days=7
rem путь к файлам
set Path="D:\Folder\"

forfiles /p %Path% /m *.log /d -%Days% /c "CMD /C echo @PATH .. @fdate .. @fsize && del @PATH"

Страницы: 1

Предыдущая тема: Играть через RAdmin


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.