rosalin
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору ' ******************************************************* ' * Find Delete Read Log v.1.0 * ' * 15.08.2006, Polo (C) ГИВЦ * ' * Настраиваемый обработчик файлов * ' * Копирование, перемещение, удаление файлов и * ' * просто отслеживание наличия в лог согласно * ' * настроек ini файла. Написано на WSH 5.6 * ' * Можно применять для резервного копирования, * ' * слежения за наличием и.т.д. * ' ******************************************************* ' ############################################### ' ######## START ####### ' ############################################### Dim FSO 'Объект файловая система Dim WSH 'Объект WScript.Shell Dim WshNetwork 'Объект сеть. Dim iniFile 'Объект файла настроек Dim LogFile 'Объект файла лога Dim WStr 'Строка для записи в лог Dim CurrStr 'Обработка текущей строки Dim newStr 'Формирование новой строки Dim fParam 'Параметр, читаемый из файла настроек Dim countSymb 'К-во символов Dim posSymb 'Позиция текущего символа Dim currSymb 'Текущий символ Dim iniFileName 'Файл настроек, имя Dim SDirs 'Список директорий через ";" Dim countDirs 'Количество директорий Dim arrayDir(1024) 'Массив директорий Dim DestFMove 'Директория, куда перемещать файлы Dim defAction 'Действие по умолчанию Dim defMoveMax 'Максимальный размер файла, допустимый для копирования, перемещения Dim cRuleFiles 'Количество правил по файлам Dim cRuleFolders 'Количество правил по папкам Dim RuleFile (1024, 1) 'Правила по файлам, содержание и действие Dim RuleFolder(1024, 1) 'Правила по папкам, содержание и действие Dim CountD,CountD1 'Счетчики Dim CurrExt 'Текущее расширение Dim CondExt 'Условие расширения Dim CurrRule 'Текущее правило Dim strPath, strFile 'Путь и имя файла в процедуре обработки Dim strFullSource 'Путь источника Dim strFullDest 'Путь назначения Dim target_dir, BaseName ' Dim NextFolder, ParmFolder ' Dim CountCopy 'Счетчик скопированных Dim CountMove 'Счетчик перемещенных Dim CountDelele 'Счетчик удаленных Dim CountReport 'Счетчик найденых Dim CountNothing 'Счетчик проигнорированых Dim CountErrors 'Счетчик ошибок дейчтвий с файлами Dim currSizeFile 'Размер текущего файла Dim allSizeFiles 'Подсчет общего размера файлов в байтах. Dim logSizeFiles 'Общий размер файлов, с опцией "только обнаружить", т.е. "log" Dim delSizeFiles 'Общий размер файлов, с опцией "удалить", т.е. "del" Dim copySizeFiles 'Общий размер файлов, с опцией "копировать", т.е. "copy" Dim moveSizeFiles 'Общий размер файлов, с опцией "переместить", т.е. "move" Dim nothingSizeFiles 'Общий размер файлов, с опцией "игнорировать", т.е. "nothing" Dim currFile 'Объект текущий файл. Dim ShowEndMessage 'Показ сообщения об окончании работы скрипта. Dim EndMessage 'Текст сообщения об окончании работы скрипта Dim SecToWaitEndMessage 'Ожидание в секундах до закрытия окна Dim LogFileName 'Файл лога Dim StoreLogFile 'Время хранения лога в днях. Dim LogFileMode 'Режим ведения лога: '2 - файл открывается для записи. Содержимое файла, 'которое было до этого, уничтожится; '8 - файл открывается для добавления данных. 'добавление в конец файла. Dim NetSendEndMessage 'Отправка сообщения по сети. Dim NetSendAdress 'Сетевой адрес Dim EmailEndOfMessage 'Отправка сообщения по почте. Dim EmailAdress 'Почтовый адрес. Dim IncLogToEmail 'Вложить лог в почтовое сообщение. 1-да, 0-нет. ' ############################################### ' ######## СТАРТ СКРИПТА ####### ' ############################################### On Error Resume Next CountCopy = 0 CountMove = 0 CountDelele = 0 CountReport = 0 CountNothing = 0 CountErrors = 0 allSizeFiles = 0 logSizeFiles = 0 delSizeFiles = 0 copySizeFiles = 0 moveSizeFiles = 0 nothingSizeFiles = 0 CountErrors = 0 StoreLogFile = 0 SecToWaitEndMessage = 0 Set WSH = WScript.CreateObject("WScript.Shell") Set FSO = CreateObject("Scripting.FileSystemObject") Set WshNetwork = CreateObject("WScript.Network") 'LogFileName = Year(Date()) 'wsh.popup LogFileName 'WScript.Quit() ' ############################################### ' ######## СЧИТАЕМ НАСТРОЙКИ ИЗ ФАЙЛА ####### ' ############################################### If Len(Wscript.arguments.Item(0)) < 1 Then iniFileName = "fdrl.ini" 'ФАЙЛ НАСТРОЕК ПО УМОЛЧАНИЮ Else iniFileName = Wscript.arguments.Item(0) 'ФАЙЛ НАСТРОЕК В КАЧЕСТВЕ ПАРАМЕТРА End If iniFileName = GetPath & iniFileName if (FSO.FileExists(iniFileName)) Then Set iniFile = FSO.OpenTextFile(iniFileName, 1, true) Else wsh.popup ("Файл настроек " & iniFileName & " не найден !") WScript.Quit() End If SDirs = GetParam("SDirs") DestFolderMove = GetParam("DestFolderMove") defAction = LCase(GetParam("defAction")) defMoveMax = abs(GetParam("defMoveMax")) LogFileMode = GetParam("LogFileMode") StoreLogFile = GetParam("StoreLogFile") EndMessage = GetParam("EndMessage") ShowEndMessage = GetParam("ShowEndMessage") SecToWaitEndMessage = GetParam("SecToWaitEndMessage") NetSendEndMessage = GetParam("NetSendEndMessage") NetSendAdress = GetParam("NetSendAdress") EmailEndOfMessage = GetParam("EmailEndOfMessage") EmailAdress = GetParam("EmailAdress") IncLogToEmail = GetParam("IncLogToEmail") If Err.number <> 0 then WStr = "Ошибка чтения файла настроек." & CHR(10) Wstr = Wstr & "Error N" & Err.number & " " & Err.Description & CHR(10) Wstr = Wstr & "Завершаем работу программы." WSH.Popup WStr WScript.Quit() End If 'LogFileMode = 2 'РЕЖИМ ВЕДЕНИЯ ЛОГА 'НАЗВАНИЕ ФАЙЛА ЛОГА LogFileName = GetPath & Year(Date()) & "_" & Month(Date()) & "_" & Day(Date()) & "_" & Hour(Time()) & "_" & Minute(Time()) & "_" & FSO.GetBaseName(iniFileName) & ".log" Set LogFile = FSO.OpenTextFile(LogFileName, LogFileMode, true) WStr = "*****************************************************" WSTL(WStr) WStr = "* Старт работы. WScript версия " & WScript.Version WSTL(WStr) WStr = "*****************************************************" WSTL(WStr) WStr = "Настройки файла " & iniFileName WSTL(WStr) WStr = "SDirs = " & SDirs WSTL(WStr) WStr = "DestFolderMove = " & DestFolderMove WSTL(WStr) WStr = "defAction = " & defAction WSTL(WStr) WStr = "defMoveMax = " & GetFileSize(defMoveMax) WSTL(WStr) WStr = "LogFileMode = " & LogFileMode WSTL(WStr) WStr = "ShowEndMessage = " & ShowEndMessage WSTL(WStr) WStr = "EndMessage = " & EndMessage WSTL(WStr) WStr = "SecToWaitEndMessage = " & SecToWaitEndMessage WSTL(WStr) WStr = "StoreLogFile = " & StoreLogFile WSTL(WStr) WStr = "NetSendEndMessage = " & NetSendEndMessage WSTL(WStr) WStr = "NetSendAdress = " & NetSendAdress WSTL(WStr) WStr = "EmailEndOfMessage = " & EmailEndOfMessage WSTL(WStr) WStr = "EmailAdress = " & EmailAdress WSTL(WStr) WStr = "IncLogToEmail = " & IncLogToEmail WSTL(WStr) If Err.number <> 0 then WSTL ("Ошибка в начале работы скрипта.") WSTL ("Error N" & Err.number & " " & Err.Description ) Err.number = 0 End If ' ############################################### ' ######## ОБРАБОТАЕМ строку точек входа ####### ' ############################################### countSymb = 0 countSymb = Len(SDirs) posSymb = 1 currSymb = "" CurrStr = "" countDirs = 0 Do While countSymb <> 0 currSymb = mid(SDirs,posSymb,1) if asc(currSymb)= 59 then countDirs = countDirs + 1 arrayDir(countDirs) =newStr newStr = "" WSTL("Точка входа для поиска №" & countDirs & " " & arrayDir(countDirs)) Else newStr = newStr & currSymb End if countSymb = countSymb - 1 posSymb = posSymb + 1 Loop If Err.number <> 0 then WSTL ("Ошибка обработки строки директорий поиска 'SDirs='.") WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 End If WSTL("Итого количество точек входа для поиска = " & countDirs) WStr = "-----------------------------------------------------" WSTL(WStr) ' ############################################### ' ###### Читаем правила для файлов и папок ##### ' ############################################### GetRules() WSTL("Количество правил для файлов: " & cRuleFiles) WSTL("Количество правил для папок: " & cRuleFolders) ' ############################################### ' ######## Анализ файлов и папок ####### ' ############################################### Do While countDirs <> 0 WStr = "-----------------------------------------------------" WSTL(WStr) WSTL("Начинаем анализ " & arrayDir(countDirs)) Call ProcFolder(arrayDir(countDirs)) WSTL("Окончен анализ " & arrayDir(countDirs)) countDirs = countDirs - 1 Loop allSizeFiles = logSizeFiles + delSizeFiles + copySizeFiles + moveSizeFiles + nothingSizeFiles WStr = "-----------------------------------------------------" WSTL(WStr) WSTL("Результат работы скрипта:") WSTL("Cкопировано: " & CountCopy & " " & GetFileSize(copySizeFiles)) WSTL("Перемещено: " & CountMove & " " & GetFileSize(moveSizeFiles)) WSTL("Удалено: " & CountDelele & " " & GetFileSize(delSizeFiles)) WSTL("Найдено: " & CountReport & " " & GetFileSize(logSizeFiles)) WSTL("В игноре: " & CountNothing & " " & GetFileSize(nothingSizeFiles)) WSTL("ИТОГО: " & CountNothing + CountReport + CountDelele + CountMove + CountCopy & " " & GetFileSize(allSizeFiles)) WStr = "*****************************************************" WSTL(WStr) WSTL("* КОЛИЧЕСТВО ОШИБОК ОБРАБОТКИ ФАЙЛОВ: "& CountErrors & " ошибок.") WStr = "*****************************************************" WSTL(WStr) If ShowEndMessage = 1 Then WStr = EndMessage WSTL(WStr) wsh.Popup WStr, SecondsToWaitMessage, "Скрипт завершил работу: " & Date() & " " & Time(), 0+64 End If 'NetSendEndMessage 'NetSendAdress If NetSendEndMessage = 1 Then WStr = "NET SEND " & NetSendAdress & " " & EndMessage WSH.Run(WStr) End If WshShell.LogEvent 0, EndMessage ' ***************************************************** ' ***************************************************** ' ***************************************************** ' ********* НИЖЕ БЛОК ПРОЦЕДУР ********* ' ***************************************************** ' ***************************************************** ' ***************************************************** ' ############################################### ' ######## Байты в кило и мега байты ####### ' ############################################### Function GetFileSize(strByte) GetFileSize=0 'Если мегабайты If Abs(strByte/(1024*1024)) > 1 Then GetFileSize = Round(strByte/(1024*1024),3) & " Мб" Exit Function end if 'Если килобайты If Abs(strByte/1024) > 1 Then GetFileSize = Round(strByte/(1024),3) & " Кб" Exit Function end if GetFileSize = strByte & " байт" End Function ' ############################################### ' ######## Обработка файлов. ####### ' ############################################### Sub WorkFile(strPath, strFile, strRule) On Error Resume Next strFullSource = strPath & "\" & strFile strFullDest = Mid(strPath, 3,Len(strPath)-3) Set currFile = FSO.GetFile(strFullSource) currSizeFile = currFile.Size 'wstl("Владелец: " & currFile.AvailableSpace) 'МОДИФИЦИРУЕМ НАЗВАНИЕ ФАЙЛА ДЛЯ СОБЛЮДЕНИЯ УНИКАЛЬНОСТИ countSymb = 1 CurrStr = "" Do While countSymb <= Len(strFullDest) If Mid(strFullDest,CountSymb,1) = "\" then CurrStr = CurrStr & "_" Else CurrStr = CurrStr + Mid(strFullDest,CountSymb,1) End If CountSymb = CountSymb + 1 Loop CurrStr = CurrStr & "_F_" strFullDest = DestFolderMove & "\" & CurrStr & strFile Err.Clear Select Case StrRule Case "log" 'ФАКТ ОБНАРУЖЕНИЯ ФАЙЛА В ЛОГ WSTL ("Обнаружен " & strFullSource & " " & GetFileSize(currSizeFile)) CountReport = CountReport + 1 logSizeFiles = logSizeFiles + currSizeFile If Err.number <> 0 then WSTL ("Ошибка отчета по файлу " & strFullSource) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 CountErrors = CountErrors + 1 End If Case "copy" 'КОПИРУЕМ ФАЙЛ if defMoveMax <> 0 and currSizeFile > defMoveMax then WSTL("Файл " & strFullSource & " имеет размер " & GetFileSize(currSizeFile) & ", копирование отменено." ) exit Sub else Call FSO.CopyFile (strFullSource, strFullDest) End if If Err.number <> 0 then WSTL ("Ошибка копирования файла " & strFullSource) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 CountErrors = CountErrors + 1 End If WSTL ("Cкопирован " & strFullSource & " в " & strFullDest & " " & GetFileSize(currSizeFile)) CountCopy = CountCopy + 1 copySizeFiles = copySizeFiles + currSizeFile Case "del" 'УДАЛЯЕМ ФАЙЛ Call FSO.DeleteFile (strFullSource) If Err.number <> 0 then WSTL ("Ошибка удаления файла " & strFullSource) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 CountErrors = CountErrors + 1 End If WSTL ("Удален " & strFullSource & " " & GetFileSize(currSizeFile)) CountDelele = CountDelele + 1 delSizeFiles = delSizeFiles + currSizeFile Case "move" 'ПЕРЕМЕЩАЕМ ФАЙЛ if defMoveMax <> 0 and currSizeFile > defMoveMax then WSTL("Файл " & strFullSource & " имеет размер " & GetFileSize(currSizeFile) & ", перенос отменен." ) Exit Sub Else Call FSO.MoveFile (strFullSource, strFullDest) End if If Err.number <> 0 then WSTL ("Ошибка копирования файла " & strFullSource) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 CountErrors = CountErrors + 1 End If WSTL ("Перемещен файл " & strFullSource & " в " & strFullDest & " " & GetFileSize(currSizeFile)) CountMove = CountMove +1 moveSizeFiles = moveSizeFiles + currSizeFile Case "nothing" 'Ignore rule CountNothing = CountNothing + 1 nothingSizeFiles = nothingSizeFiles + currSizeFile Case Else WSTL ("Ошибка обработки, " & strFullSource & " правило '" & strRule & "' не найдено") CountErrors = CountErrors + 1 End Select End Sub ' ############################################### ' ######## Перебор файлов и папок ####### ' ############################################### Sub ProcFolder(ParmFolder) On Error Resume Next BaseName = fso.GetAbsolutePathName(ParmFolder) If fso.GetFolder(BaseName).Files.Count > 0 Then For Each NextFile In fso.GetFolder(BaseName).Files Call ProcFile( ParmFolder, NextFile.Name ) Next End If If fso.GetFolder(BaseName).SubFolders.Count > 0 Then For Each NextFolder In fso.GetFolder(BaseName).SubFolders Call ProcFolder( NextFolder ) Next End If If Err.number <> 0 then WSTL ("Ошибка обработки директории поиска " & arrayDir(countDirs) ) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 End If End Sub ' ############################################### ' ######## Анализ файлов и действия ####### ' ############################################### Sub ProcFile(BaseName, filename) On Error Resume Next CurrRule = "" 'wstl("File: " & BaseName & "\" & filename) CurrExt = LCase(FSO.GetExtensionName(filename)) CountD = 1 Do While CountD <= cRuleFiles 'Если ищем по расширению If left(RuleFile (CountD,0),2) = "*." Then 'Если Расширение совпадает, то проверяем наличие правила на папку и 'запускаем подпрограмму обработки файлов. CondExt = LCase(FSO.GetExtensionName(RuleFile (CountD,0))) If CurrExt = CondExt then CurrRule = RuleFile (CountD,1) 'WSTL ("Найден файл по расширению " & BaseName & "\" & filename & " , " & CurrRule) 'Проверка на правило для папки If FindFolderRule() <> "" then CurrRule = FindFolderRule() 'WSTL("Правило изменено на " & currRule) End If Call WorkFile(BaseName, filename, currRule) End If End If 'Если правило поиска *####* If left(RuleFile (CountD,0),1) = "*" and Right(RuleFile (CountD,0),1) = "*" Then 'Если найдено совпадение if Instr(1, filename, Mid(RuleFile(CountD,0), 2, Len(RuleFile (CountD,0))-2)) > 0 Then CurrRule = RuleFile (CountD,1) 'WSTL ("Найден файл по правилу поиска " & RuleFile (CountD,0) & " , " & BaseName & "\" & filename & " , " & CurrRule) 'Проверка на правило для папки If FindFolderRule() <> "" then CurrRule = FindFolderRule() 'WSTL("Правило изменено на " & currRule) End If Call WorkFile(BaseName, filename, currRule) End If End If 'Если правило поиска *#### If left(RuleFile (CountD,0),2) <> "*." and left(RuleFile (CountD,0),1) = "*" and Right(RuleFile (CountD,0),1) <> "*" Then 'Если соответствует условию if Mid(RuleFile (CountD,0),2,Len(RuleFile (CountD,0))) = Right(fso.GetBaseName (filename),Len(RuleFile (CountD,0))-1) then CurrRule = RuleFile (CountD,1) 'WSTL ("Найден файл по правилу поиска " & RuleFile (CountD,0) & " , " & BaseName & "\" & filename & " , " & CurrRule) 'Проверка на правило для папки If FindFolderRule() <> "" then CurrRule = FindFolderRule() 'WSTL("Правило изменено на " & currRule) End If Call WorkFile(BaseName, filename, currRule) end if End If 'Если правило поиска ####* If Right(RuleFile (CountD,0),1) = "*" and Left(RuleFile (CountD,0),1) <> "*"Then 'Если соответствует условию if Left(fso.GetBaseName (filename) ,Len(RuleFile (CountD,0))-1) = Left(RuleFile (CountD,0) ,Len(RuleFile (CountD,0))-1) then CurrRule = RuleFile (CountD,1) 'WSTL ("Найден файл по правилу поиска " & RuleFile (CountD,0) & " , " & BaseName & "\" & filename & " , " & CurrRule) 'Проверка на правило для папки If FindFolderRule() <> "" then CurrRule = FindFolderRule() 'WSTL("Правило изменено на " & currRule) End If Call WorkFile(BaseName, filename, currRule) end if End If CountD = CountD +1 Loop If Err.number <> 0 then WSTL ("Ошибка анализа файлов и действия " ) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 End If End Sub ' ############################################### ' ######## Ищем правила на папки ####### ' ############################################### Function FindFolderRule() On Error Resume Next CountD1 = 1 Do While CountD1 <= cRuleFolders If LCase(RuleFolder(CountD1,0)) = LCase(BaseName) then FindFolderRule = RuleFolder (CountD1,1) Exit Do End If If Left(BaseName, Len(RuleFolder(CountD1,0))) & "\" = RuleFolder(CountD1,0) & "\" then FindFolderRule = RuleFolder (CountD1,1) Exit Do end if FindFolderRule = "" CountD1 = CountD1 + 1 Loop If Err.number <> 0 then WSTL ("Ошибка поиска правил на папки." ) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 End If End Function ' ############################################### ' ######## Запись в лог ####### ' ############################################### Sub WSTL(WStr) On Error Resume Next WStr = "<" & Date() & " " & Time() & "> " & WStr & " " LogFile.WriteLine(WStr) If Err.number <> 0 then WStr = "Не могу вести лог, проверьте" & CHR(10) Wstr = Wstr & "права на запись в каталог скрипта." & LogFile & CHR(10) Wstr = Wstr & "Error N" & Err.number & " " & Err.Description & CHR(10) Wstr = Wstr & "Завершаем работу программы." & CHR(10) WSH.Popup WStr WScript.Quit() End If End Sub ' ############################################### ' ######## Узнаем каталог скрипта ####### ' ############################################### Function GetPath Dim path path = WScript.ScriptFullName GetPath = Left(path, InStrRev(path, "\")) End Function ' ############################################### ' ######## Читаем параметр по умолч. ####### ' ############################################### Function GetParam(fParam) On Error Resume Next countSymb = Len(fParam) 'iniFile. Do While Not iniFile.AtEndOfStream CurrStr = iniFile.ReadLine if Left(CurrStr, countSymb) = fParam then GetParam = Mid(CurrStr, countSymb+2, Len(CurrStr)) 'wsh.popup fParam & " = " & GetParam Exit Do end if Loop countSymb = 0 If Err.number <> 0 then WSTL ("Ошибка чтения параметров по умолчанию." ) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 End If End Function ' ############################################### ' ######## Читаем правила ####### ' ############################################### Sub GetRules() On Error Resume Next cRuleFiles = 0 cRuleFolders = 0 Do While Not iniFile.AtEndOfStream CurrStr = iniFile.ReadLine countSymb = Len(CurrStr) CurrSymb = Left (CurrStr, 5) Select Case CurrSymb Case "File=" cRuleFiles = cRuleFiles + 1 posSymb =1 newStr = "" CurrStr = Mid(CurrStr, 6, countSymb-5) countSymb = Len(CurrStr) Do While countSymb <> 0 currSymb = Mid(CurrStr, posSymb , 1) if currSymb="," then RuleFile(cRuleFiles,0) = newStr newStr = "" Else newStr = newStr & currSymb if countSymb = 1 then If newStr = "default" then RuleFile(cRuleFiles,1) = defAction Else RuleFile(cRuleFiles,1) = LCase(newStr) End if end if End if countSymb = countSymb - 1 posSymb = posSymb + 1 Loop WSTL ("Правило для файлов: " & RuleFile(cRuleFiles,0) & " , действие: " & RuleFile(cRuleFiles,1)) Case "Fold=" cRuleFolders = cRuleFolders + 1 posSymb =1 newStr = "" CurrStr = Mid(CurrStr, 6, countSymb-5) countSymb = Len(CurrStr) Do While countSymb <> 0 currSymb = Mid(CurrStr, posSymb , 1) if currSymb="," then RuleFolder(cRuleFolders,0) = newStr newStr = "" Else newStr = newStr & currSymb if countSymb = 1 then If newStr = "default" then RuleFolder(cRuleFolders,1) = defAction Else RuleFolder(cRuleFolders,1) = LCase(newStr) End if end if End if countSymb = countSymb - 1 posSymb = posSymb + 1 Loop WSTL ("Правило для папок: " & RuleFolder(cRuleFolders,0) & " , действие: " & RuleFolder(cRuleFolders,1)) End Select Loop If Err.number <> 0 then WSTL ("Ошибка чтения правил на файлы и папки." ) WSTL ("Error N" & Err.number & " " & Err.Description) Err.number = 0 End If End Sub |