Автор: SPV_Ed
Дата сообщения: 02.08.2007 12:54
Терминальный сервер. 1С 7.7 + 1С 8. Бекаплю таким скриптом, который запускается каждый день кроме воскресенья после полуночи. Предусмотрено завершение терминальных сессий юзеров перед бекапом. Скрипт создает суточный, недельный и месячный архивы, хранится локально и на сетевом ресурсе. Любые замечания приветствуются.
Код: On Error Resume Next
Set WshShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
strDateStart = Date ' Дата старта
strTimeStart = Time ' Время старта
aDate = split(strDateStart, ".")
nDays = 1 ' Количество дней для хранения суточных архивов
nWeeks = 1 ' Количество недель для хранения еженедельных архивов
nMonthes = 1 ' Количество месяцев для хранения ежемесячных архивов
' Путь к архивируемой БД
strDataPath = "C:\1с\"
' Шаблон имени создаваемого архивного файла
strDataDailyFileName = "1C_" & aDate(2) & "-" & aDate(1) & "-" & aDate(0) & "_" & WeekdayName(Weekday(Now), True)
' Локальный ресурс для хранения архивов
strPathArchiveLocal = "G:\Archive\1C\"
' Сетевой ресурс для хранения архивов
strPathArchiveRemote = "\\192.168.0.170\Archive$\1C\"
strDirDaily = "ArcDaily\" ' Cуточный
strDirWeekly = "ArcWeekly\" ' Недельный
strDirMonthly = "ArcMonthly\" ' Месячный
' Шаблон имени лог-файла
strLogFile = strPathArchiveLocal & strDataDailyFileName & ".log"
' Лог-файл ошибок архиватора
strArcErrLogFile = strPathArchiveLocal & "rarerr.log"
' Путь к директории архиватора
strPathToArchiver = "%ProgramFiles%\WinRar\"
' Файл-список исключений для архиватора
strExcFile = "ExcFile.txt"
If objFSO.FolderExists(strPathArchiveLocal) = False Then objFSO.CreateFolder(strPathArchiveLocal)
If objFSO.FolderExists(strPathArchiveRemote) = False Then objFSO.CreateFolder(strPathArchiveRemote)
If objFSO.FileExists(strLogFile) Then objFSO.DeleteFile(strLogFile)
WriteTextFiles Now & " Старт скрипта: " & WScript.ScriptFullName & VbCrLf, strLogFile
'================================================================================
' Завершение существующих терминальных сессий пользователей перед архивированием
'================================================================================
WriteTextFiles VbCrLf & Now & " Завершение cуществующих терминальных сессий" & VbCrLf, strLogFile
WshShell.Run "%comspec% /u /c chcp 1251 & quser >>" & strLogFile, 0, True
WriteTextFiles VbCrLf, strLogFile
WshShell.Run "%comspec% /u /c chcp 1251 & for /f ""eol=; tokens=1 skip=2"" %i in ('quser') do qprocess %i >>" & strLogFile, 0, True
WshShell.Run "%comspec% /u /c chcp 1251 & for /f ""eol=; tokens=2 skip=1"" %i in ('quser') do if /i not ""%i""==""console"" logoff %i /v >>" & strLogFile, 0, True
WriteTextFiles VbCrLf & Now & " Проверка наличия незавершившихся терминальных сессий" & VbCrLf, strLogFile
WshShell.Run "%comspec% /u /c chcp 1251 & quser >>" & strLogFile, 0, True
WriteTextFiles VbCrLf, strLogFile
'==================================
' Архивация баз за прошедшие сутки
'==================================
WriteTextFiles VbCrLf & Now & " Создание списка исключений для архиватора: " & strExcFile & VbCrLf, strLogFile
WriteTextFiles "*.cdx", strExcFile
WriteTextFiles VbCrLf & Now & " Cуточная архивация баз " & strSubject & strDataPath & " ===> " & strPathArchiveLocal & strDirDaily & VbCrLf, strLogFile
If objFSO.FolderExists(strPathArchiveLocal & strDirDaily) = False Then objFSO.CreateFolder(strPathArchiveLocal & strDirDaily)
' Вычисление размера архивируемой директории
Set objFolder = objFSO.GetFolder(strDataPath)
WriteTextFiles vbTab & "Размер архивируемой директории: " & strDataPath & " - " & Round(objFolder.Size / 1048576,2) & " Mb" & VbCrLf, strLogFile
' Запуск программы-архиватора
WshShell.Run chr(34) & strPathToArchiver & "Rar.exe" & chr(34) &_
" a -ep1 -r -se -rr10p -m5 -dh -x@" & strExcFile & " -ilog:" & strArcErrLogFile & " " &_
strPathArchiveLocal & strDirDaily & strDataDailyFileName & " " & strDataPath & "*", 0, True
' Вычисление размера созданного архива
If objFSO.FileExists(strPathArchiveLocal & strDirDaily & strDataDailyFileName & ".rar") = true Then
Set objTestFile = objFSO.GetFile(strPathArchiveLocal & strDirDaily & strDataDailyFileName & ".rar")
WriteTextFiles vbTab & "Размер созданного суточного архива: " & objTestFile & " - " & Round(objTestFile.Size / 1048576,2) & " Mb" & VbCrLf, strLogFile
Else
WriteTextFiles vbTab & "ОШИБКА: Файл: " & strPathArchiveLocal & strDirDaily & strDataDailyFileName & ".rar не создан" & VbCrLf, strLogFile
If objFSO.FileExists(strExcFile) Then objFSO.DeleteFile(strExcFile)
objFSO.MoveFile strLogFile, strLogFile & ".err"
WScript.Quit
End If
If objFSO.FileExists(strExcFile) Then objFSO.DeleteFile(strExcFile)
'=======================================
' Копирование архива за прошедшие сутки
'=======================================
' На сетевой ресурс
strReturn = CopyNewArcFiles (strPathArchiveLocal & strDirDaily, strPathArchiveRemote & strDirDaily)
WriteTextFiles strReturn, strLogFile
' Удаление неактуальных суточных архивов
WriteTextFiles VbCrLf & Now & " Удаление архивов старше " & nDays & " суток" & VbCrLf, strLogFile
' На локальном диске
strReturn = DeleteOldFiles (nDays, strPathArchiveLocal & strDirDaily, "d")
WriteTextFiles strReturn, strLogFile
' На сетевом ресурсе
strReturn = DeleteOldFiles (nDays, strPathArchiveRemote & strDirDaily, "d")
WriteTextFiles strReturn, strLogFile
'========================================
' Копирование архива за прошедшую неделю
'========================================
If WeekDay(strDateStart, 2) = 1 Then
' На локальный диск
strReturn = CopyNewArcFiles (strPathArchiveLocal & strDirDaily, strPathArchiveLocal & strDirWeekly)
WriteTextFiles strReturn, strLogFile
' На сетевой ресурс
strReturn = CopyNewArcFiles (strPathArchiveRemote & strDirDaily, strPathArchiveRemote & strDirWeekly)
WriteTextFiles strReturn, strLogFile
' Удаление неактуальных недельных архивов
WriteTextFiles VbCrLf & Now & " Удаление архивов старше " & nWeeks & " недель" & VbCrLf, strLogFile
' На локальном диске
strReturn = DeleteOldFiles (nWeeks, strPathArchiveLocal & strDirWeekly, "ww")
WriteTextFiles strReturn, strLogFile
' На сетевом ресурсе
strReturn = DeleteOldFiles (nWeeks, strPathArchiveRemote & strDirWeekly, "ww")
WriteTextFiles strReturn, strLogFile
End If
'=======================================
' Копирование архива за прошедший месяц
'=======================================
If Day(strDateStart) = 1 Or _
((Day(strDateStart) = 2 Or Day(strDateStart) = 3) And WeekDay(strDateStart, 2) = 1) Then
' На локальный диск
strReturn = CopyNewArcFiles (strPathArchiveLocal & strDirDaily, strPathArchiveLocal & strDirMonthly)
WriteTextFiles strReturn, strLogFile
' На сетевой ресурс
strReturn = CopyNewArcFiles (strPathArchiveRemote & strDirDaily, strPathArchiveRemote & strDirMonthly)
WriteTextFiles strReturn, strLogFile
' Удаление неактуальных месячных архивов
WriteTextFiles VbCrLf & Now & " Удаление архивов старше " & nMonthes & " месяцев" & VbCrLf, strLogFile
' На локальном диске
strReturn = DeleteOldFiles (nMonthes, strPathArchiveLocal & strDirMonthly, "m")
WriteTextFiles strReturn, strLogFile
' На сетевом ресурсе
strReturn = DeleteOldFiles (nMonthes, strPathArchiveRemote & strDirMonthly, "m")
WriteTextFiles strReturn, strLogFile
End If
'==============================================
' Функция копирования файлов созданных архивов
'==============================================
Function CopyNewArcFiles (strPathSrc, strPathDst)
WriteTextFiles VbCrLf & Now & " копирование созданного суточного архива" & VbCrLf, strLogFile
If objFSO.FolderExists(strPathDst) = False Then objFSO.CreateFolder(strPathDst)
objFSO.CopyFile strPathSrc & strDataDailyFileName & ".rar", strPathDst, True
If objFSO.FileExists(strPathDst & strDataDailyFileName & ".rar") = true Then
Set objTestFile = objFSO.GetFile(strPathDst & strDataDailyFileName & ".rar")
strCopyLog = strCopyLog + vbTab & "Файл: " & strDataDailyFileName & ".rar" & " скопирован в " & strPathDst & VbCrLf
Else
strCopyLog = strCopyLog + vbTab & "ОШИБКА: Файл: " & strDataDailyFileName & ".rar" & " не скопирован в " & strPathDst & VbCrLf
End If
CopyNewArcFiles = strCopyLog
End Function
'==============================================
' Функция удаления файлов неактуальных архивов
'==============================================
Function DeleteOldFiles (strPeriod, strPath, intrvl)
Set objFolder = objFSO.GetFolder(strPath)
Set objFiles = objFolder.Files
For Each File In objFiles
Result = Abs(DateDiff(intrvl, Now, File.DateCreated))
If Result > strPeriod-1 Then
strDeleteLog = strDeleteLog + vbTab & "Удален файл: " & File.Path & " от: " & File.DateCreated & VbCrLf
File.Delete
End If
Next
DeleteOldFiles = strDeleteLog
End Function
WriteTextFiles Now & " Архивация окончена. Время выполнения архивации: " & CDate(Time - strTimeStart), strLogFile
'=======================
' Копирование лог-файла
'=======================
' Ежедневный
If objFSO.FileExists(strLogFile) Then
objFSO.CopyFile strLogFile, strPathArchiveLocal & strDirDaily, True
objFSO.CopyFile strLogFile, strPathArchiveRemote & strDirDaily, True
' Еженедельный
If WeekDay(strDateStart, 2) = 1 Then
If objFSO.FileExists(strLogFile) Then
objFSO.CopyFile strLogFile, strPathArchiveLocal & strDirWeekly, True
objFSO.CopyFile strLogFile, strPathArchiveRemote & strDirWeekly, True
End If
End If
' Ежемесячный
If Day(strDateStart) = 1 Or _
((Day(strDateStart) = 2 Or Day(strDateStart) = 3) And WeekDay(strDateStart, 2) = 1) Then
If objFSO.FileExists(strLogFile) Then
objFSO.CopyFile strLogFile, strPathArchiveLocal & strDirMonthly, True
objFSO.CopyFile strLogFile, strPathArchiveRemote & strDirMonthly, True
End If
End If
' Удаление временного лога
objFSO.DeleteFile(strLogFile)
End If
Set WshShell = Nothing
Set objFSO = Nothing
WScript.Quit
'===================================
' Процедура записи текстового файла
'===================================
Sub WriteTextFiles (strText, strPath)
Set objFile = objFSO.OpenTextFile(strPath, 8, True)
objFile.WriteLine(strText)
objFile.Close
End Sub