Скрипт для слежения за файлами.



Скрипт "шпионит" за папкой и когда там появляются нужные файлы выполняет требуемую операцию.

Зачем нужен скрипт: 1С77 медленно создает DBF файлы большого размера если папка расшарена на другом компьютере. Чтобы "ловить" эти файлы и рассылать по адресатам, придуман этот скрипт.
Ну еще им можно отучать жену создавать файлы и ярлыки на рабочем столе :P

Upd: Скрипт хорошо зарекомендовал себя на этапе внедрения нескольких учетных систем на предприятии. Обмен происходит при помощи файлов, скрипт их "ловит" и запускает программу обмена.

Фунционал:
Слежение за 1 папкой
Логи
Добавление в автозагрузку
Настройки из ini файла
Удаление, копирование, замена целевых файлов
Фильтрация по расширению файла
Фильтрация по размеру

set FSO=CreateObject("Scripting.FileSystemObject") 
Set WshShell = CreateObject("WScript.Shell") 
Set objShell = CreateObject("Shell.Application")  
Set objFolder = objShell.Namespace(WshShell.CurrentDirectory)
Set objFolderItem = objFolder.Self
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objNetwork = WScript.CreateObject("WScript.Network")
On Error Resume Next
if Err.Number<>0 Then
MsgBox ("Error # " & CStr(Err.Number) & " " & Err.Description)
Err.Clear
End If
strComputerCurrName = objNetwork.ComputerName
strUserCurrName = objNetwork.UserName
Path = objFolderItem.Path
strFilePath = Path+"\spy.ini"
' Чтение файла настроек
strDir=INIread(8)
Path2=INIread(10)
FSize=INIread(12)
MoC=INIread(14)
Umsk=INIread(16)
Fmsk=INIread(18)
Path1=INIread(22)
SLog=INIread(20)
'Обработка аргументов
Comand = WScript.Arguments(optind)
If Comand="/install" Then ' Добавляем в автозагрузку
Path = objFolderItem.Path + "\spy.vbs"
WshShell.regwrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\FileSpy" & "_" & Path1, path, "REG_SZ"
MsgBox "Шпион с кодовым номером: " & Path1 & " добавлен в автозагрузку"
WScript.Quit
End If
If Comand="/uninstall" Then
WshShell.regdelete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\FileSpy" & "_" & Path1
MsgBox "Шпион с кодовым номером: " & Path1 & " убран из автозагрузки"
WScript.Quit
End If
If Comand="/stop" Then
If Slog=1 or Slog=3 Then 
set logfile =FSO.OpenTextFile(Path & "\spy.log", 8) 
logfile.WriteLine (CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) + " Работа всех шпионов завершена ") 
End If
strComputer = "." 'В теории можно указать имя другого компьютера, но я не пробовал
strNamespace = "Root\CIMV2"
Set objService = GetObject("WinMgmts:\" & _
strComputer & "" & strNamespace)
Set WshShell = WScript.CreateObject("WScript.Shell")
Killed = "wscript.exe" ' Если файл откомпилировать то Killed = "spy.exe", а как отлавливать именно мой скрипт, я не знаю)
Set colProcesses = objService.ExecQuery(_
"SELECT * FROM Win32_Process WHERE Name='" +Killed+ "'")
For Each objProcess in colProcesses
objProcess.Terminate()
Next
WScript.Quit
End If
If Comand="/help" Or Comand="/?" Then ' Вывод справки
MsgBox "Файловый шпион с кодовым номером: " & Path1 &  VbCrLf & "/stop - Отстрел работающих шпионов" &  VbCrLf & "/install - Добавляет скрипт шпион в автозагрузку	" &  VbCrLf & "/uninstall - Удаляет скрипт шпион из автозагрузки" &  VbCrLf & "spy.ini - Файл с настройками, за какой папкой следить и куда копировать или перемещать файлы." &  VbCrLf & "spy.log - Логи работы скрипта."
WScript.Quit
End If
If ReportFileStatus(objFolderItem.Path & "\spy.log")  = 0 and (Slog=1 or  SLog = 3 ) Then set logfile =FSO.CreateTextFile(objFolderItem.Path & "\spy.log") 
If SLog = 1 OR SLog = 3 Then 
set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
logfile.WriteLine "Старт: "+CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Компьютер: "+strComputerCurrName+" Пользователь: "+strUserCurrName + " Папка шпиона: "+ objFolderItem.Path + " Номер экземпляра: " + INIread(22) + " Версия скрипта: " + Right(INIread(3),7)
logFile.close
End If
' Запуск шпиона
strComputer = "." 
strDirSlash = Replace(strDir, "", "\\\")
strNamespace = "Root\CIMV2"
Set objService = GetObject("WinMgmts:\" & strComputer & "" & strNamespace)
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
objService.ExecNotificationQueryAsync objSink, _
"SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " &_
"Targetinstance ISA 'CIM_DirectoryContainsFile' and " &_
"TargetInstance.GroupComponent= " &_
"'Win32_Directory.Name=""" & strDirSlash & """'"
While 1
WScript.Sleep 1000
Wend

Sub Sink_OnObjectReady(oOutParams, oContext)
strMessage = objService.Get(oOutParams.TargetInstance.PartComponent).FileName _
& "." & objService.Get(oOutParams.TargetInstance.PartComponent).Extension
PathF = strDir+""+strMessage
PathT = Path2+""+strMessage
set F_Size = FSO.getfile (PathF)
UFSize = F_Size.Size
UFSize = CLng(UFSize) 
FSize = CLng(FSize) 
If FSize <> -1 and FSize >= UFSize and MoC = 3 And ReportFileStatus(PathT) = 1 Then 
FSO.deleteFile 
If SLog=1 Then ' Согласно настройкам пишем логи
set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
 logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Перемещен в: " + PathT
 logFile.close
End If
End If 
If FSize <> -1 and FSize >= UFSize and MoC = 4 And ReportFileStatus(PathT) = 1 Then 
FSO.deleteFile 
If SLog=1 Then
set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
 logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Скопирован в: " + PathT
 logFile.close
End If'
End If 
If FSize <> -1 and FSize < UFSize and ReportFileStatus(PathT) = 0 Then 
If SLog=1 Then
set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
 logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Больше заданного размера: " + FSize
 logFile.close
End If'
Exit Sub
Else
If Umsk=0 Then
strMessage = objService.Get(oOutParams.TargetInstance.PartComponent).FileName _
& "." & objService.Get(oOutParams.TargetInstance.PartComponent).Extension
PathF = strDir+""+strMessage
PathT = Path2+""+strMessage
Call FileOperation(MoC, PathF, PathT)
End If
if Umsk=1 Then
strMessage = objService.Get(oOutParams.TargetInstance.PartComponent).FileName _
& "." & Fmsk
PathF = strDir+""+strMessage
PathT = Path2+""+strMessage
Call FileOperation(MoC, PathF, PathT)
End If
if Umsk=2 Then
if objService.Get(oOutParams.TargetInstance.PartComponent).Extension = Fmsk Then
strMessage = objService.Get(oOutParams.TargetInstance.PartComponent).FileName _
& "." & objService.Get(oOutParams.TargetInstance.PartComponent).Extension
PathF = strDir+""+strMessage
PathT = Path2+""+strMessage
Call FileOperation(MoC, PathF, PathT)
End If
End If
End If
End Sub
Function ReportFileStatus(filespec)
   Dim ffso, msg
   Set ffso = CreateObject("Scripting.FileSystemObject")
   If (ffso.FileExists(filespec)) Then
      msg = 1
   Else
      msg = 0
   End If
   ReportFileStatus = msg
End Function
Sub FileOperation(MoC, PathF, PathT)
if MoC = 0 then
 FSO.CopyFile PathF, PathT
 If SLog = 1 Then 
 set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
 logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Скопирован в: " + PathT
 logFile.close
 End if
End if
if MoC = 1 Then
 FSO.moveFile  PathF, PathT
  If SLog = 1 Then
  set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
  logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Перемещен в: " + PathT
  logFile.close
  End if
End if
if MoC = 2 Then 
 FSO.deleteFile  PathF
  If SLog = 1 Then 
  set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
  logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Удален"
  logFile.close
  End if
End if
if MoC = 3 Then 
 FSO.moveFile  PathF, PathT
  If SLog = 1 Then 
  set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
  logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Перемещен в: " + PathT
  logFile.close
  End If
End if
if MoC = 4 then
 FSO.CopyFile PathF, PathT
  If SLog = 1 Then 
  set logfile =FSO.OpenTextFile(objFolderItem.Path & "\spy.log", 8) 
  logfile.WriteLine CStr(Date&" "&Hour(Now)&"."&Minute(Now)&"."&Second(Now)) +" Обнаружен файл: "+PathF & VbCrLf & "Скопирован в: " + PathT
  logFile.close
  End if
End if
End Sub
Function INIread(iLineNumber) ' Чтение нужной строки файла настроек
Set objTS = objFS.OpenTextFile(strFilePath, 1)
For i=1 To (iLineNumber-1)
objTS.SkipLine
Next
INIread=objTS.Readline
End Function

Текст файла настроек spy.ini

Чтение из файла происходит построчно, поэтому порядок срок нарушать нельзя

' CompanyName: Unknown
' FileDescription: File Spy
' FileVersion: 2.0.3.5
' FileName: spy.ini
' LegalCopyright: Matvey

# Папка источник
D:\Downloads
# Папка приемник
D:\Uploads
# Максимальный размер похищаемого файла в байтах. Если -1 то размер не учитывается
-1
# 0-Копировать, 1-перемещать, 2-удалять, 3-перемещать если в папке приемнике уже есть такой файл то его удалять, 4-копировать если в папке приемнике уже есть такой файл не удалять
3
# Использовать маску файла 0 - не использовать, работать со всеми файлами. 1 - использовать только файлы с заданным расширением. 2 - использовать все файлы кроме данных 
0
# Маска файла
dbf
# Записывать результаты в лог 0-нет, 1-да, 3-логировать только запуск скрипта
1
# Номер экземпляра скрипта для автозапуска
1
# Порядок строк нарушать нельзя

Чуть не забыл, файлы называть лучше так:

spy.vbs - Скрипт шпион. Висит в памяти и отслеживает появление любых файлов в папке слежения
/stop - Отстрел работающих шпионов
/install - Добавляет скрипт шпион в автозагрузку с тем номером, что записан в инишнике
/uninstall - Удаляет скрипт шпион из автозагрузки
/? /help - Помощь
spy.ini - Файл с настройками, за какой папкой следить и куда копировать или перемещать файлы.
spy.log - Логи работы скрипта.

Переименовывать файлы нельзя
Для слежения за несколькими папками, необходимо запускать скрипт несколько раз из нескольких папок

Пример:
Для слежения выбраны 3 папки: C:\ D:\ V:\Temp
Делаем копии скрипта и раcкладываем spy.vbs и spy.ini по папкам:
..\File_Spy1

..\File_Spy2

..\File_Spy3

В каждом файле настроек указываем пути и запускаем каждый скрипт

Для добавления в автозапуск, нужно запустить spy.vbs /install

Hомер экземпляра скрипта для автозапуска, указанный в файле настроек, должен быть уникален + PathT





Комментарии

Аватар пользователя Матвей

Сейчас скрипт имеет версию 3.1.8
Расширен функционал и доработана реакция на ошибки. Так добавлен контроль запуска скрипта от одного пользователя.

Пишу на яве за еду.