SPV_Ed
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Терминальный сервер. 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 |
|