среда, 30 мая 2012 г.

VBS: скрипт для управления файлами резервных копий

   Согласно плану по резервному копированию одним  или двумя файлами  резервной копии не отделаться, нужно несколько копий, с запасом , а еще нужно следить , чтобы этих файлов было приемленное колличество, т.к место все таки ограниченно. А еще , к примеру в Mysql, делая резервные копии, например, с помощью Mysql Administrator нужно старые копии удалять.
Для этих целей я написал .vbs  скрипт, который решает несколько проблем:
1) Удаляет старые резервные копии файлов по дате
2) Следит и не удалит, при достижение минимального колличества файлов резервной копий
3) В одном скрипте можно описать все нужные каталоги сервера  для удаления старых файлов
4)В каталоге с резерными копиями могут находится и другие файлы, скрипт их не затронет

Короче меньше, слов больше текста:
Текст скрипта с комментариями:

'скрипт удаления файлов в каталоге по дате из каталога 'оставляет файлы при достижение минимального кол-ва файлов в каталоге
Const adDate = 7
Const adVarChar = 200

Dim objFile 'файлы в каталоге
Const delTime = 14    ' дней для старых файлов maska ="^новый"  ' шаблон файлов для удаления countfiles=0 ' переменная для подсчета файлов
' Создание объектов оболочки и файловой системы Set oShell = CreateObject("wscript.shell")
Set oFSO = CreateObject("Scripting.Filesystemobject")

' Определение путей папок Catalog1 = oShell.ExpandEnvironmentStrings("C:test")

'создание ссылки для управления регулярными выражениями Set Re = New RegExp
Re.Pattern = Maska 
Re.IgnoreCase = True  ' игнор регистра
' Проверка или Создание журнала логов работы сценария sLogFileName = "C:testdelete_Files_log"
sLogFileName = Replace(sLogFileName, ".", "_")
sLogFileName = Replace(sLogFileName, "/", "_")

if ofso.FileExists(sLogFileName & ".log") then
  Set oLogFile = oFSO.OpenTextFile(sLogFileName & ".log",8,true)
else
  Set oLogFile = oFSO.CreateTextFile(sLogFileName & ".log",true)
end if

oLogFile.WriteLine Now& "========== Start deleting =========="

'strFolder = "C:test"
'Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'Запуск наших процеду по удалению 1-й параметр каталог для удаления 2- кол-во минимальных файлов , 3- дней после которых можно удалять CountNumbeFiles catalog1,4  ,14

'после можно описать и друигик каталоги, нужно только ' maska ="^новый" - поменять маску если надо ' Re.Pattern = Maska ' Catalog1 = oShell.ExpandEnvironmentStrings("C:test") - указать каталог , или оставить старый ' CountNumbeFiles catalog1,4 ,14 - теперь вызываем для нового каталога
oLogFile.WriteLine Now& "========== End deleting =========="
oLogFile.Close
WScript.Quit 0

Sub deleteFiles(sFolderPath,cnt,dt)
    'создание рекорд сета     With WScript.CreateObject("ADODB.Recordset")
        With .Fields
            .Append "Path",             adVarChar, 2^15 - 1
            .Append "DateLastModified", adDate
        End With

        .Open
        .Sort = "DateLastModified DESC"  ' сортировка записей         ''добавляем в рекордсет только необходимые файлы         For Each objFile In oFSO.GetFolder(sFolderPath).Files
    if re.test(objfile.Name) then
            .AddNew Array("Path", "DateLastModified"), Array(objFile.Path, objFile.DateLastModified)
end if
        Next

        .Movefirst
'переход на cnt позицию, минимум , которые не удаляется         .Move cnt,0
        Do Until .EOF
   With .Fields
    'MsgBox .Item("Path").Value        set objFile =oFso.GetFile( .Item("Path").Value)
            ' Проверка, является ли файл устаревшим,если да удаляем             If (Date-objFile.DateLastModified) > dt and (Date-objFile.DateCreated) >dt Then

oLogFile.Writeline .Item("Path").Value & vbTab & .Item("DateLastModified").Value
'WScript.Echo .Item("DateLastModified").Value, vbTab, .Item("Path").Value ' Удаление устаревшего файла                  oFSO.DeleteFile objFile.Path, True

            end if
End With
            .MoveNext
        Loop

        .Close
    End With


end sub

'Процедура проверки кол-ва наших файлов и затем их удаления sFolderPath - каталог,cnt - минимальное кол-во файлов Sub CountNumbeFiles(sFolderPath,cnt, dt) 
If oFSO.FolderExists(sFolderPath) Then
    ' Создание объекта Folder     Set oFolder = oFSO.GetFolder(sFolderPath)
    ' Получение коллекции файлов     Set colFiles = oFolder.Files
    ' Обработка каждого файла из коллекции     For each oFile in colFiles
          ' сравниваем имя с шаблоном -если нащ файл то плюсум кол-во        if re.test(ofile.Name) then 
       'здесь подсчет файлов будет           countfiles=countfiles+1
       end if
    Next

'выход если файлов меньше нужного   if countfiles<cnt then
   'MsgBox "файлов бля мало"    oLogFile.WriteLine  "Файлы не удалялись, т.к кол-во меньше минимального"
   'oLogFile.Close    ExitSub  ' выход их процедуры, если мало файлов
   else
   ' ВОТ ЗДЕСЬ происходит выхов удаления 1 ый параметр каталог, 2- дата удаление кол deleteFiles sFolderPath,cnt, dt
  end if
Else ' каталог не найден , запись в лог файл. 'WScript.Echo "Can't find folder [" & strFolder & "]" oLogFile.WriteLine date& "Не найлен каталог" & sFolderPath
End If
end sub

Копируем его в .txt файлик, присваем расширение .vbs, поправляем под свои нужды
and Enjoy it!

Кстати, подстветка синтаксиса может быть ошибочна, как получилось, и  второе , советую его сначало оттестить, хотя у меня на прошлом месте работы он работает успешно.

И еще , большое спасибо ресурсу http://script-coding.com/Browse.html#VBScript - там много инфы про скриптовые языки, кода, а так же хороший форум.


Комментариев нет :

Отправить комментарий