<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: Слежение за изменениями файлов в директории?]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=563&amp;type=atom" />
	<updated>2008-08-04T09:47:07Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=563</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=13014#p13014" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>2The gray Cardinal</strong>: опробовать сие сможете?</p></blockquote></div><p>У меня PowerShell не установлен, к сожалению.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-08-04T09:47:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=13014#p13014</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=13013#p13013" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>The gray Cardinal пишет:</cite><blockquote><p>Любопытно, но как-то страшно делать сотни подписок на события...</p></blockquote></div><p>Угу <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. Идея <em>[первая - alexii]</em> не выдержала испытания на прочность. На тех же вышеизложенных условиях, служба, реализующая WMI, отъедает 30-40% процессорного времени, сам WMI ещё 10%... Потом догадался обрубить антивирус и файерволл. Потом увеличил предикат WITHIN с 1 до 5, 10 — стало полегче. Однако уже ясно, что в реальных условиях, на серверах, где условия будут куда как серьёзнее, сей метод не годится. Позже попробую не вязать всё к одному SWbemSink&#039;у, а каждый CIM_DirectoryContainsFile попробую прилепить к отдельному SWbemSink, но, думаю, результат будет тот же.</p><p>P.S. Свеженькое. Для отдельно взятой папки на PS: <a href="http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=3683910&amp;SiteID=40">Мониторинг папки: подскажите как реализовать?</a>. Думаю, для нашего случая, результат будет тот же.</p><p><strong>2The gray Cardinal</strong>: опробовать сие сможете?</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2008-08-04T09:28:26Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=13013#p13013</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=12993#p12993" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Как идея?</p></blockquote></div><p>Любопытно, но как-то страшно делать сотни подписок на события...</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-08-01T18:20:44Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=12993#p12993</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=12975#p12975" />
			<content type="html"><![CDATA[<p>Согласно <a href="http://forum.script-coding.com/viewtopic.php?pid=5363#p5363">теме «VBScript: слежение за содержимым каталога»</a> из Коллекции; однако новую тему создавать не стал. Собственно, вот по чему:<br /></p><div class="quotebox"><blockquote><p>Примечание: отслеживание вложенных каталогов в данном случае проблематично, т.к. оператор LIKE со свойством Path в WMI-запросе, похоже, корректно не работает.</p></blockquote></div><p>Специально для проверки создал раздел. Скопировал ~4-уровневую структуру папок (~100), файлов ~3000. Сделал обработку на __InstanceOperationEvent для экземпляров класса CIM_DataFile ежесекундно <em>с использованием предиката Like</em> для свойства .Path. Работает нормально с небольшими задержками. Специальных замеров не проводил, но при увеличении количества папок/файлов задержки многократно возрастают; вплоть до того, что с некоторого момента&nbsp; работа скрипта, при использовании подобного механизма, становится бессмысленной из-за возросших задержек. Хотя и <em>продолжает работать</em>. Таким образом, использование предиката Like для обработки подпапок имеет достаточные ограничения.</p><p>Зимой, когда было больше времени, я писал скрипт, но, как обычно, не вылизал его до конца. Пожалуй, я вкратце опишу свою идею.</p><p>Подписываемся на события файлов в папке (через класс CIM_DirectoryContainsFile, а не CIM_DataFile) асинхронным (!) запросом, что-то вроде**:<br /></p><div class="codebox"><pre><code>objSWbemService.ExecNotificationQueryAsync objSWbemSink_CIM_DirectoryContainsFile, _
    &quot;SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE &quot; &amp;_
        &quot;TargetInstance ISA &#039;CIM_DirectoryContainsFile&#039; AND &quot; &amp;_
        &quot;TargetInstance.GroupComponent=&#039;Win32_Directory.Name=&quot;&quot;&quot; &amp; strFolder &amp; &quot;&quot;&quot;&#039;&quot;</code></pre></div><p>В принципе, можно создать и постоянный подписчик, но это нецелесообразно.</p><p>Затем, через обычный механизм рекурсии objFSO.GetFolder().SubFolders… обходим все вложенные папки и делаем для них <em>ту же</em> операцию (мы ведь можем к <em>одному</em> объекту objSWbemSink_ привязать несколько запросов). Собственно, и всё.</p><p>Почти всё. Если структура папок у нас неизменна. Однако, это, как правило, не так. Подпапки (внутри той папки, за которой мы следим) могут создаваться и удаляться. И за этим нужно также следить. То есть, нужно подписываться на события экземпляров класса Win32_Directory и следить. И поменять механизм подписки, описанный выше (уже нельзя привязывать к одному objSWbemSink_ несколько запросов, поскольку отменять их по отдельности невозможно, а только все сразу командой .Cancel). И при создании вложенной папки — добавлять подписку **, при удалении — отменять слежение за этой подпапкой.</p><p>На «…подписываться на события экземпляров класса Win32_Directory и следить» я и «заморозил» работу до зимы <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. Как идея?</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2008-08-01T01:21:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=12975#p12975</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=5362#p5362" />
			<content type="html"><![CDATA[<p>Кроме того, не совсем понятно, какой состав событий вообще обрабатывается __InstanceOperationEvent, т.е. что там вообще могут быть за события. Достаточно вызвать контекстное меню папки Проводника, не производя никаких действий, как возникает целый шквал непонятных событий.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-10-06T11:29:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=5362#p5362</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=5361#p5361" />
			<content type="html"><![CDATA[<p>Предыдущий вопрос снимается, решён г-ном Касперским <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" />.<br />Вопрос такой: а эффективно ли вообще использовать класс __InstanceOperationEvent? Что-то я не нашел, как определить, <strong>что именно</strong> за событие произошло. В классе всего три дохлых свойства, которые мало что дают: <a href="http://msdn2.microsoft.com/en-us/library/aa394652.aspx">__InstanceOperationEvent</a>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-10-06T10:48:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=5361#p5361</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=5356#p5356" />
			<content type="html"><![CDATA[<p><strong>Alexbootch</strong><br />Скрипт выдаёт очень странную ошибку:<br /></p><div class="quotebox"><blockquote><p>C:\Temp\test.vbs(3, 1) SWbemServicesEx: Ошибка источника данных</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-10-05T18:41:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=5356#p5356</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=5326#p5326" />
			<content type="html"><![CDATA[<p>Пример синхронного отслеживания событий с файлами TXT в папке c:\temp<br /></p><div class="codebox"><pre><code>strComputer = &quot;.&quot;
Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;c:&#039;&quot; &amp; _
    &quot; AND TargetInstance.Extension = &#039;txt&#039;&quot; &amp; _
    &quot; AND TargetInstance.Path = &#039;\\temp\\&#039;&quot;)

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

    WScript.Echo &quot;Filename: &quot; &amp; objReceivedEvent.TargetInstance.FileName
    WScript.Echo &quot;Name: &quot; &amp; objReceivedEvent.TargetInstance.Name
Loop</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Alexbootch]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5392</uri>
			</author>
			<updated>2007-10-04T21:31:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=5326#p5326</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4509#p4509" />
			<content type="html"><![CDATA[<p>Написал скрипт, который отслеживает создание файлов в папке C:/WINDOWS/system32/.</p><p>Скрипт запускает процесс wmiprvse.exe, который постоянно сканирует файлы в этой папке (проверил filemon-ом). Причем в цикле. Файлов там много. Какой вообще механизм? Он что, сохраняет первоначальный список файлов и периодически сравнивает его. <br />Кто-нибудь знает, как работает __InstanceCreationEvent?</p>]]></content>
			<author>
				<name><![CDATA[rorog]]></name>
			</author>
			<updated>2007-09-07T14:41:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4509#p4509</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4294#p4294" />
			<content type="html"><![CDATA[<p>Странно, скрипт отробатывает, но с жуткой задержкой, по минут 5-7</p>]]></content>
			<author>
				<name><![CDATA[Ganzales]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3401</uri>
			</author>
			<updated>2007-08-28T05:16:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4294#p4294</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4275#p4275" />
			<content type="html"><![CDATA[<p>Чего-то всё равно не пашет. Последний скрипт я немного упростил (убрал отсылку письма, т.к. интересен собственно сам запрос WMI):<br /></p><div class="codebox"><pre><code>strDrive = &quot;C:&quot;
strDir = &quot;\\Temp\\&quot;
strComputer = &quot;.&quot;
&#039;===================================================================
Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;&quot; &amp; strDrive &amp; &quot;&#039;&quot; &amp; _
    &quot; AND TargetInstance.FileSize &gt; 0&quot; &amp; _
    &quot; AND TargetInstance.Path Like &#039;&quot; &amp; strDir &amp; &quot;%&#039;&quot;)
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
    strMess = objReceivedEvent.TargetInstance.FileName &amp; &quot;, &quot; &amp; objReceivedEvent.TargetInstance.Name &amp; vbCrLf
    WScript.Echo strMess
Loop</code></pre></div><p>Этот скрипт вообще ни на что не реагирует. Покрушил все файлы в C:\Temp\ - ноль эмоций, скрипт ничего не выводит <img src="//forum.script-coding.com/img/smilies/hmm.png" width="15" height="15" />.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-08-27T10:56:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4275#p4275</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4263#p4263" />
			<content type="html"><![CDATA[<p>Конечно же, сильно извеняюсь выложил не тот скрипт)</p><div class="codebox"><pre><code>strDir = &quot;\\test\\&quot;
strComputer = &quot;.&quot;
Dim Body
    Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject(&quot;CDO.Message&quot;)
    Set iConf = CreateObject(&quot;CDO.Configuration&quot;)
    Set Flds = iConf.Fields
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/sendusing&quot;) = 2
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpserver&quot;) = strSMTP_Server
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout&quot;) = 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(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;d:&#039;&quot; &amp; _
    &quot; AND TargetInstance.FileSize &gt; 0&quot; &amp; _
    &quot; AND TargetInstance.Path Like &#039;&quot; &amp; strDir &amp; &quot;%&#039;&quot;)
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
&#039;    If objReceivedEvent.TargetInstance.Extension=&quot;mp3&quot; then //Если нужно можно установить слежение за конкретный расширением.
&#039;        MsgBox &quot;Пользователь сохранил файл с расширением  &quot; &amp; objReceivedEvent.TargetInstance.Extension
&#039;    End if
    Body = &quot;File modifed: &quot; &amp; objReceivedEvent.TargetInstance.FileName &amp; &quot;  &quot; &amp; objReceivedEvent.TargetInstance.Name &amp; vbCrLf &amp; vbCrLf
    Call SendPost(&quot;SMTP&quot;, &quot;TO&quot;, &quot;FROM&quot;, &quot;File modifed&quot;, body)
Loop</code></pre></div><p>Вот этот следит)</p>]]></content>
			<author>
				<name><![CDATA[Ganzales]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3401</uri>
			</author>
			<updated>2007-08-27T04:47:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4263#p4263</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4234#p4234" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Ganzales пишет:</cite><blockquote><p>Скрипт следит за созданием и внесением изменений в дерриктории, а также в сабдеррикториях, не реагирует на создание пустых документов, оповещает почтовой рассылкой.</p></blockquote></div><p>На изменения в подкаталогах этот скрипт не реагирует.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-08-24T14:55:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4234#p4234</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4225#p4225" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>strDir = &quot;\\share\Admins docs\\&quot;
strComputer = &quot;.&quot;
Dim Body
    Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject(&quot;CDO.Message&quot;)
    Set iConf = CreateObject(&quot;CDO.Configuration&quot;)
    Set Flds = iConf.Fields
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/sendusing&quot;) = 2
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpserver&quot;) = strSMTP_Server
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout&quot;) = 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(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;e:&#039;&quot; &amp; _
            &quot; AND TargetInstance.FileSize &gt; 0&quot; &amp; _
    &quot; AND TargetInstance.Path = &#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
&#039;    If objReceivedEvent.TargetInstance.Extension=&quot;mp3&quot; then //Если нужно можно установить слежение за конкретный расширением.
&#039;        MsgBox &quot;Пользователь сохранил файл с расширением  &quot; &amp; objReceivedEvent.TargetInstance.Extension
&#039;    End if
    Body = &quot;File modifed: &quot; &amp; objReceivedEvent.TargetInstance.FileName &amp; &quot;  &quot; &amp; objReceivedEvent.TargetInstance.Name
        Call SendPost(&quot;SMTP&quot;, &quot;TO&quot;, &quot;FROM&quot;, &quot;File modifed&quot;, body)
Loop</code></pre></div><p>Скрипт следит за созданием и внесением изменений в дерриктории, а также в сабдеррикториях, не реагирует на создание пустых документов, оповещает почтовой рассылкой.</p><p>Так же можно отслеживать по расширению.</p>]]></content>
			<author>
				<name><![CDATA[Ganzales]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3401</uri>
			</author>
			<updated>2007-08-24T08:20:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4225#p4225</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=3733#p3733" />
			<content type="html"><![CDATA[<p>Не, мне не нужно следить за удалением, мне важны сообщения только типа: создание, модификация.</p><p>Просто если использовать WMI то скрипт выходит гораздо гибче чем варриант с массивом, к примеру к этому я без проблем прикрутил запрет на создание файлов различных типов, дабавив всего пару строк.</p>]]></content>
			<author>
				<name><![CDATA[Ganzales]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3401</uri>
			</author>
			<updated>2007-07-27T11:38:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=3733#p3733</id>
		</entry>
</feed>
