1

Тема: VBScript: Слежение за изменениями файлов в директории?

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

AttachmentFolder = "C:\temp"
Dim oMessage
'Set oMessage = CreateObject("CDO.Message")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")

Set objFolderItems = objShellApp.NameSpace(AttachmentFolder).Items()
For Each objFolderItem In objFolderItems
    If Not objFolderItem.IsFolder Then
        Set objFile = objFSO.GetFile(objFolderItem.Path)
        If (LCase(Right(objFolderItem.Name, 4)) = ".txt") Or (LCase(Right(objFolderItem.Name, 4)) = ".rar") Then
            oMessage.AddAttachment objFile
        End If
    End If
    Debug.WriteLine objFile
            Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.GetFile(objFile)
        x = f.DateLastModified
                If f.DateLastModified > x Then
                WScript.Echo "File modifed"
                x = f.DateLastModified
            End If
    Debug.WriteLine x
Next

Этот код берет пути и и записывает в переменную дату последней модификации.

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

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

---------------------------
Notepad
---------------------------
Cannot create the C:\TEMP\New Text Document (2).txt file.

Make sure that the path and filename are correct.
---------------------------
OK   
---------------------------

2

Re: VBScript: Слежение за изменениями файлов в директории?

Приведённый код не совсем понятен. Например:

If ...
    Set objFile = objFSO.GetFile(objFolderItem.Path)
End If
...
Set f = fs.GetFile(objFile)

Во-первых, зачем дважды так странно вызывать GetFile, а во-вторых, как можно оперировать объектом objFile, который создаётся в блоке с условием, вне этого блока? Если условие не выполнится, то второй вызов GetFile должен приводить к ошибке времени выполнения.
Ошибка "Make sure that the path and filename are correct" никак не связана с организацией бесконечного цикла и означает "Удостоверьтесь, что путь и имя файла правильны".

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3 (изменено: Ganzales, 2007-07-24 15:03:53)

Re: VBScript: Слежение за изменениями файлов в директории?

The gray Cardinal пишет:

Приведённый код не совсем понятен. Например:

If ...
    Set objFile = objFSO.GetFile(objFolderItem.Path)
End If
...
Set f = fs.GetFile(objFile)

Эту часть кода я просто взял из примера котрый получает пути файлов в папке.

            Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.GetFile(objFile)
        x = f.DateLastModified
                If f.DateLastModified > x Then
                WScript.Echo "File modifed"
                x = f.DateLastModified
            End If

А этот код вписал для сравнения последней модификации

4

Re: VBScript: Слежение за изменениями файлов в директории?

Копи-пастинг - это безусловно главнейший приём работы на компьютере, но он не единственный .
Сформулируй свою задачу полностью, тогда подумаем.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5 (изменено: Ganzales, 2007-07-24 15:31:03)

Re: VBScript: Слежение за изменениями файлов в директории?

Есть дерриктория, в которой находится к примеру набор документов, хочу написать скрипт который будет слидить за всей деррикторией целиком, те если пользователь внес изменения в документ, то на почту приходит уведомление.

Вобщем все также как и в случаем со слежением за модификацией файла, только чтоп отслеживал не один файл а всю деррикторию, число файлов может менятся.

А WMI не умеет этого делать случаем?

6

Re: VBScript: Слежение за изменениями файлов в директории?

AttachmentFolder = "C:\temp"
Dim oMessage
Dim arrString()
Dim i
Dim Body
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")
Set objFolderItems = objShellApp.NameSpace(AttachmentFolder).Items()
For Each objFolderItem In objFolderItems
    If Not objFolderItem.IsFolder Then
        Set objFile = objFSO.GetFile(objFolderItem.Path)
        If (LCase(Right(objFolderItem.Name, 4)) = ".") Then
            oMessage.AddAttachment objFile
        End If
    End If
   
            Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.GetFile(objFile)
                If f.DateLastModified > Now - (1/64) Then
               Body = Body & "File modifed - " & objFolderItem.Name & "  " & f.DateLastModified & vbCrLf
               i=1                
            End If
Next
If i = 1 then
Call SendPost("mail2", "apatkin@mera.ru", "apatkin@mera.ru", "File modifed", Body)
Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")
    Set Flds = iConf.Fields
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTP_Server
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
    Flds.Update
    iMsg.Configuration = iConf
    iMsg.To = strTo
    iMsg.From = strFrom
    iMsg.Subject = strSubject
    iMsg.TextBody = strBody
    iMsg.Send
End Function
End If

Сделал вот так, если запускать скрипт шедулером, то он будет просто сравнивать дата модификации с с нынешней датой - периодичность запуска скрипта шедулером, те будет отслеживатся все изменения в папке.

Конечно кастыли, но работает.

Вопрос такой возник:

Debug.Write Body
дает результат

File modifed - New Text Document (2).txt  24.07.2007 16:26:40
File modifed - test4.txt  24.07.2007 16:26:33

После чего я эту переменную передаю функции SendPost
Письмо приходит уже такого вормата

File modifed - New Text Document (2).txt  24.07.2007 16:26:40 File modifed - test4.txt  24.07.2007 16:26:33

Можно как это поправить?

7

Re: VBScript: Слежение за изменениями файлов в директории?

Ganzales пишет:

А WMI не умеет этого делать случаем?

VBScript: слежение за созданием файлов в указанном каталоге

Ganzales пишет:

Можно как это поправить?

Если ты имеешь в виду "украденные" переводы строк, то это может делать слишком умный почтовый клиент. Попробуй в скрипте повставлять в "Body" побольше "vbCrLf" в конце.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

8 (изменено: Ganzales, 2007-07-25 08:51:17)

Re: VBScript: Слежение за изменениями файлов в директории?

The gray Cardinal пишет:
Ganzales пишет:

А WMI не умеет этого делать случаем?

VBScript: слежение за созданием файлов в указанном каталоге
.

Да я уже просмотрел этот пример.

Там запрос на выборку делается, и отслеживаются события создания документа, в аналогичном примере который следит за модификацией файла необходимым параметорм является путь к файлу, совместить эти 2 запроса у меня так и не вышло.


Да, добавил еще "vbCrLf", теперь письмо нормально отображено.

А в чем может быть проблема, пытаюсь запустить этот же скрипт на другой машине(сервер, под вин2003), при запуске выдает ошибку.

---------------------------
Windows Script Host
---------------------------
Script:    E:\VBScripts\SarchMod.vbs
Line:    18
Char:    9
Error:    Invalid procedure call or argument
Code:    800A0005
Source:     Microsoft VBScript runtime error

---------------------------
OK   
---------------------------

9

Re: VBScript: Слежение за изменениями файлов в директории?

Разобрав скрипт по ссылке рещил поэксперементировать и получил нужные результат

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMv2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'CIM_DataFile'" & _
    " AND TargetInstance.Drive = 'c:'" & _
    " AND TargetInstance.Extension = 'txt'" & _
    " AND TargetInstance.Path = '\\temp\\'")
Wscript.Echo "Îæèäàåì ñîáûòèÿ ..."
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent 
    WScript.Echo "File modifed: " & objReceivedEvent.TargetInstance.FileName
    WScript.Echo "Name: " & objReceivedEvent.TargetInstance.Name
Loop

Так выходит намного проще.

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

Может можно как указать по типу __InstanceModificationEvent, __InstanceCreationEvent итд?

10

Re: VBScript: Слежение за изменениями файлов в директории?

вместо вечно болтающегося цикла while(true) можно подписаться на события WMI:

monitorDir.wsf

<job>
 <script language="JScript">
 // если не работает, то выполнить однократно следующие команды:
 // mofcomp -N:root\cimv2 %SystemRoot%\system32\Wbem\scrcons.mof
 // mofcomp -N:root\cimv2 %SystemRoot%\system32\Wbem\wbemcons.mof

 var dir="c:/1/";    // каталог, за содержимым которого будем следить
 var cmd="cmd.exe /k echo [%TargetInstance.Name%]"; // команда, запускаемая при изменении каталога
 var wmi=GetObject("winMgmts:root/CIMv2");

 if(WSH.arguments.length)
 {            // запуск скрипта с любым параметром остановит сервис
  wmi.Get("__EventFilter.Name='monitor'").Delete_();
  wmi.Get("CommandLineEventConsumer.Name='monitorEvent'").Delete_();
  WSH.quit();
 }

 var q="select * from __InstanceOperationEvent within 3 "+
       "where TargetInstance ISA 'CIM_DataFile' "+
       "and TargetInstance.drive='"+dir.substr(0,2)+"' "+
       "and TargetInstance.path='"+dir.substr(2).replace(/\\|\//g,"\\\\")+"'";

 with(wmi.Get("__EventFilter").SpawnInstance_())
 {            // создание экземпляра фильтра событий
  Name="monitor";
  QueryLanguage="WQL";
  Query=q;
  var mon=Put_();
 }

 with(wmi.Get("CommandLineEventConsumer").SpawnInstance_())
 {            //создание экземпляра потребителя событий
  Name="monitorEvent";
  WindowTitle="EVENT";
  CommandLineTemplate=cmd;
  WorkingDirectory="C:/";
  RunInteractively=true;
  var event=Put_();
 }

 with(wmi.Get("__FilterToConsumerBinding").SpawnInstance_())
 {            // создание экземпляра связки
  Filter=mon;
  Consumer=event;
  Put_();
 }

 </script>
</job>

скрипт выполнится и сразу же завершится,
но при изменении/добавлении/удалении файла в каталоге будет выполняться указанная команда
вместо запуска .exe, можно выполнить скрипт, отправить, email, записать лог, записать eventLog
(ActiveScriptEventConsumer, SMTPEventConsumer, LogFileEventConsumer, NTEventLogEventConsumer)

подробнее почитай
http://script-coding.com/WMI.html
http://msdn2.microsoft.com/en-us/library/aa393649.aspx

11

Re: VBScript: Слежение за изменениями файлов в директории?

Чеснтно говоря с VBScript я знаком лишь проводя аналогии от VB, а с JScript так вообще не разу, те VBScript мне ближе както.

12

Re: VBScript: Слежение за изменениями файлов в директории?

Еще, можно как сделать чтоп он подпапки тоже проверял?

13

Re: VBScript: Слежение за изменениями файлов в директории?

OFF:

Ganzales пишет:

Чеснтно говоря с VBScript я знаком лишь проводя аналогии от VB, а с JScript так вообще не разу, те VBScript мне ближе както.

Собственно, особых отличий между VBScript и JScript в трактовке WSH нет, кроме синтаксиса. Это не JavaScript. И «перевод» с одного подъязыка на другой особых проблем не составляет.

14

Re: VBScript: Слежение за изменениями файлов в директории?

А как снять подписку?

15

Re: VBScript: Слежение за изменениями файлов в директории?

И хотелось бы вернутся к VBS варианту, просто он уже близок к нужному результату.
И былобы неплохо посмотреть вариацию подписки на vbs'е.

16

Re: VBScript: Слежение за изменениями файлов в директории?

Почему на эту тему забили на всех форумах где я отписывался??))

17

Re: VBScript: Слежение за изменениями файлов в директории?

Если нужно с подпапками, можешь взять за основу, например, это:
VBScript: BackUp файлов с рекурсивным перебором каталогов.
(Вместо даты создания нужно просто обращаться к дате модификации, а вместо копирования - писать в лог.)
Заведи в скрипте массив со списком файлов, где будут храниться имена (пути) файлов и их даты модификации. При переборе файлов сверяйся с этим массивом, так будешь засекать изменённые и новые файлы (если файл есть в массиве: проверяешь дату модификации, если она изменена, изменяешь её в массиве и пишешь в лог соответствующее сообщение; если файла нет в массиве: добавляешь файл и его дату модификации в массив и пишешь в лог соответствующее сообщение). Сам перебор файлов с подкаталогами засунь в бесконечный цикл с некоторым интервалом, вот и всё (или вместо этого засунь скрипт в шедулер).

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

18

Re: VBScript: Слежение за изменениями файлов в директории?

А WMI не умеет следить за подкаталогами?

А с массивом так савсем гемор выходит, к примеру записано в массив пара элементов а в на следующем заходе уже десяток, а на следующем не одного, те непойми чего выйдет, а тут отслеживание события дает все что нужно.

И можно как отследить если делать выборку по __InstanceOperationEvent, что именно произашло?

19

Re: VBScript: Слежение за изменениями файлов в директории?

К WMI как я понля запросы шлются  T-SQL вида, следовательно должно откабатывать такой запрос

("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _
"TargetInstance ISA 'CIM_DataFile'" & _
" AND TargetInstance.Drive = 'c:'" & _
" AND TargetInstance.Path like '%temp%'")

только вот на деле не работает

20

Re: VBScript: Слежение за изменениями файлов в директории?

С массивом - особого гемора не вижу. Если нужно отслеживать ещё и удаление файлов, в скрипте можно дополнительно пройтись по массиву, проверить, все ли файлы на месте. Скрипт будет конечно не на 10 строк , но никаких существенных проблем нет.
WMI - не знаю, надо искать в MSDN и пробовать. Кроме того, твоя задача с продолжением ветки понемногу расширяется, т.к. про слежение за удалением файлов вначале вроде речи не было .

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

21

Re: VBScript: Слежение за изменениями файлов в директории?

Не, мне не нужно следить за удалением, мне важны сообщения только типа: создание, модификация.

Просто если использовать WMI то скрипт выходит гораздо гибче чем варриант с массивом, к примеру к этому я без проблем прикрутил запрет на создание файлов различных типов, дабавив всего пару строк.

22

Re: VBScript: Слежение за изменениями файлов в директории?

strDir = "\\share\Admins docs\\"
strComputer = "."
Dim Body
    Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")
    Set Flds = iConf.Fields
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTP_Server
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
    Flds.Update
    iMsg.Configuration = iConf
    iMsg.To = strTo
    iMsg.From = strFrom
    iMsg.Subject = strSubject
    iMsg.TextBody = strBody
    iMsg.Send
End Function
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMv2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'CIM_DataFile'" & _
    " AND TargetInstance.Drive = 'e:'" & _
            " AND TargetInstance.FileSize > 0" & _
    " AND TargetInstance.Path = '" & strDir & "'")
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
'    If objReceivedEvent.TargetInstance.Extension="mp3" then //Если нужно можно установить слежение за конкретный расширением.
'        MsgBox "Пользователь сохранил файл с расширением  " & objReceivedEvent.TargetInstance.Extension
'    End if
    Body = "File modifed: " & objReceivedEvent.TargetInstance.FileName & "  " & objReceivedEvent.TargetInstance.Name
        Call SendPost("SMTP", "TO", "FROM", "File modifed", body)
Loop

Скрипт следит за созданием и внесением изменений в дерриктории, а также в сабдеррикториях, не реагирует на создание пустых документов, оповещает почтовой рассылкой.

Так же можно отслеживать по расширению.

23

Re: VBScript: Слежение за изменениями файлов в директории?

Ganzales пишет:

Скрипт следит за созданием и внесением изменений в дерриктории, а также в сабдеррикториях, не реагирует на создание пустых документов, оповещает почтовой рассылкой.

На изменения в подкаталогах этот скрипт не реагирует.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

24 (изменено: Ganzales, 2007-08-27 08:58:15)

Re: VBScript: Слежение за изменениями файлов в директории?

Конечно же, сильно извеняюсь выложил не тот скрипт)

strDir = "\\test\\"
strComputer = "."
Dim Body
    Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")
    Set Flds = iConf.Fields
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSMTP_Server
    Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
    Flds.Update
    iMsg.Configuration = iConf
    iMsg.To = strTo
    iMsg.From = strFrom
    iMsg.Subject = strSubject
    iMsg.TextBody = strBody
    iMsg.Send
End Function
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMv2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'CIM_DataFile'" & _
    " AND TargetInstance.Drive = 'd:'" & _
    " AND TargetInstance.FileSize > 0" & _
    " AND TargetInstance.Path Like '" & strDir & "%'")
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
'    If objReceivedEvent.TargetInstance.Extension="mp3" then //Если нужно можно установить слежение за конкретный расширением.
'        MsgBox "Пользователь сохранил файл с расширением  " & objReceivedEvent.TargetInstance.Extension
'    End if
    Body = "File modifed: " & objReceivedEvent.TargetInstance.FileName & "  " & objReceivedEvent.TargetInstance.Name & vbCrLf & vbCrLf
    Call SendPost("SMTP", "TO", "FROM", "File modifed", body)
Loop

Вот этот следит)

25

Re: VBScript: Слежение за изменениями файлов в директории?

Чего-то всё равно не пашет. Последний скрипт я немного упростил (убрал отсылку письма, т.к. интересен собственно сам запрос WMI):

strDrive = "C:"
strDir = "\\Temp\\"
strComputer = "."
'===================================================================
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMv2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'CIM_DataFile'" & _
    " AND TargetInstance.Drive = '" & strDrive & "'" & _
    " AND TargetInstance.FileSize > 0" & _
    " AND TargetInstance.Path Like '" & strDir & "%'")
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
    strMess = objReceivedEvent.TargetInstance.FileName & ", " & objReceivedEvent.TargetInstance.Name & vbCrLf
    WScript.Echo strMess
Loop

Этот скрипт вообще ни на что не реагирует. Покрушил все файлы в C:\Temp\ - ноль эмоций, скрипт ничего не выводит .

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

26

Re: VBScript: Слежение за изменениями файлов в директории?

Странно, скрипт отробатывает, но с жуткой задержкой, по минут 5-7

27

Re: VBScript: Слежение за изменениями файлов в директории?

Написал скрипт, который отслеживает создание файлов в папке C:/WINDOWS/system32/.

Скрипт запускает процесс wmiprvse.exe, который постоянно сканирует файлы в этой папке (проверил filemon-ом). Причем в цикле. Файлов там много. Какой вообще механизм? Он что, сохраняет первоначальный список файлов и периодически сравнивает его.
Кто-нибудь знает, как работает __InstanceCreationEvent?

28

Re: VBScript: Слежение за изменениями файлов в директории?

Пример синхронного отслеживания событий с файлами TXT в папке c:\temp

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMv2") 
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'CIM_DataFile'" & _
    " AND TargetInstance.Drive = 'c:'" & _
    " AND TargetInstance.Extension = 'txt'" & _
    " AND TargetInstance.Path = '\\temp\\'")

Wscript.Echo "Ожидаем события ..."
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent

    WScript.Echo "Filename: " & objReceivedEvent.TargetInstance.FileName
    WScript.Echo "Name: " & objReceivedEvent.TargetInstance.Name
Loop

29

Re: VBScript: Слежение за изменениями файлов в директории?

Alexbootch
Скрипт выдаёт очень странную ошибку:

C:\Temp\test.vbs(3, 1) SWbemServicesEx: Ошибка источника данных

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

30

Re: VBScript: Слежение за изменениями файлов в директории?

Предыдущий вопрос снимается, решён г-ном Касперским .
Вопрос такой: а эффективно ли вообще использовать класс __InstanceOperationEvent? Что-то я не нашел, как определить, что именно за событие произошло. В классе всего три дохлых свойства, которые мало что дают: __InstanceOperationEvent.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

31

Re: VBScript: Слежение за изменениями файлов в директории?

Кроме того, не совсем понятно, какой состав событий вообще обрабатывается __InstanceOperationEvent, т.е. что там вообще могут быть за события. Достаточно вызвать контекстное меню папки Проводника, не производя никаких действий, как возникает целый шквал непонятных событий.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

32

Re: VBScript: Слежение за изменениями файлов в директории?

Согласно теме «VBScript: слежение за содержимым каталога» из Коллекции; однако новую тему создавать не стал. Собственно, вот по чему:

Примечание: отслеживание вложенных каталогов в данном случае проблематично, т.к. оператор LIKE со свойством Path в WMI-запросе, похоже, корректно не работает.

Специально для проверки создал раздел. Скопировал ~4-уровневую структуру папок (~100), файлов ~3000. Сделал обработку на __InstanceOperationEvent для экземпляров класса CIM_DataFile ежесекундно с использованием предиката Like для свойства .Path. Работает нормально с небольшими задержками. Специальных замеров не проводил, но при увеличении количества папок/файлов задержки многократно возрастают; вплоть до того, что с некоторого момента  работа скрипта, при использовании подобного механизма, становится бессмысленной из-за возросших задержек. Хотя и продолжает работать. Таким образом, использование предиката Like для обработки подпапок имеет достаточные ограничения.

Зимой, когда было больше времени, я писал скрипт, но, как обычно, не вылизал его до конца. Пожалуй, я вкратце опишу свою идею.

Подписываемся на события файлов в папке (через класс CIM_DirectoryContainsFile, а не CIM_DataFile) асинхронным (!) запросом, что-то вроде**:

objSWbemService.ExecNotificationQueryAsync objSWbemSink_CIM_DirectoryContainsFile, _
    "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE " &_
        "TargetInstance ISA 'CIM_DirectoryContainsFile' AND " &_
        "TargetInstance.GroupComponent='Win32_Directory.Name=""" & strFolder & """'"

В принципе, можно создать и постоянный подписчик, но это нецелесообразно.

Затем, через обычный механизм рекурсии objFSO.GetFolder().SubFolders… обходим все вложенные папки и делаем для них ту же операцию (мы ведь можем к одному объекту objSWbemSink_ привязать несколько запросов). Собственно, и всё.

Почти всё. Если структура папок у нас неизменна. Однако, это, как правило, не так. Подпапки (внутри той папки, за которой мы следим) могут создаваться и удаляться. И за этим нужно также следить. То есть, нужно подписываться на события экземпляров класса Win32_Directory и следить. И поменять механизм подписки, описанный выше (уже нельзя привязывать к одному objSWbemSink_ несколько запросов, поскольку отменять их по отдельности невозможно, а только все сразу командой .Cancel). И при создании вложенной папки — добавлять подписку **, при удалении — отменять слежение за этой подпапкой.

На «…подписываться на события экземпляров класса Win32_Directory и следить» я и «заморозил» работу до зимы . Как идея?

33

Re: VBScript: Слежение за изменениями файлов в директории?

alexii пишет:

Как идея?

Любопытно, но как-то страшно делать сотни подписок на события...

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

34

Re: VBScript: Слежение за изменениями файлов в директории?

The gray Cardinal пишет:

Любопытно, но как-то страшно делать сотни подписок на события...

Угу . Идея [первая - alexii] не выдержала испытания на прочность. На тех же вышеизложенных условиях, служба, реализующая WMI, отъедает 30-40% процессорного времени, сам WMI ещё 10%... Потом догадался обрубить антивирус и файерволл. Потом увеличил предикат WITHIN с 1 до 5, 10 — стало полегче. Однако уже ясно, что в реальных условиях, на серверах, где условия будут куда как серьёзнее, сей метод не годится. Позже попробую не вязать всё к одному SWbemSink'у, а каждый CIM_DirectoryContainsFile попробую прилепить к отдельному SWbemSink, но, думаю, результат будет тот же.

P.S. Свеженькое. Для отдельно взятой папки на PS: Мониторинг папки: подскажите как реализовать?. Думаю, для нашего случая, результат будет тот же.

2The gray Cardinal: опробовать сие сможете?

35

Re: VBScript: Слежение за изменениями файлов в директории?

alexii пишет:

2The gray Cardinal: опробовать сие сможете?

У меня PowerShell не установлен, к сожалению.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.