1 (изменено: bnp322, 2010-11-03 09:55:39)

Тема: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

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

strDir = "c:\temp" ' каталог, за которым следим
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 & """'"

' Выводим сообщение о запуске сканера
Wscript.Echo "Запущен сканер создания файла в папке " & strDir

' Запускаем бесконечный цикл ожидания
While 1
    WScript.Sleep 1000
Wend

' Процедура-обработчик события OnObjectReady объекта sWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
    strResult = Date & " " & Time & vbCrLf &_
        "Создан файл: " &  oOutParams.TargetInstance.PartComponent
    Wscript.Echo strResult
End Sub

Всем хорош, но его конечный результат:

Создан файл: \\TEX\root\cimv2:CIM_DataFile.Name="C:\\temp\\temp.txt"

Как сделать результат в виде:

Создан файл: temp.txt

Или даже:

Создан файл: C:\temp\temp.txt

2

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Можно, как вариант, использовать старые добрые регулярные выражения:

' Процедура-обработчик события OnObjectReady объекта sWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)
    strResult = Date & " " & Time & vbCrLf &_
        "Создан файл: " &  oOutParams.TargetInstance.PartComponent
    objRegExp.Pattern = "("".*\"")"
     Set objMatches = objRegExp.Execute(strResult)
    Wscript.Echo objMatches.Item(0)
End Sub

Но что-то мне подсказывает, что можно все сделать все гораздо проще порывшись в документации по WMI

Нас невозможно сбить с пути, нам пофигу куда идти.

3

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Как-то так:

Sub test()
Dim str As String
str = "Создан файл: \\TEX\root\cimv2:CIM_DataFile.Name=""C:\\temp\\temp.txt"""
MsgBox str
str = Replace(Mid(str, InStr(str, "CIM_DataFile.Name") + 19, Len(str) - InStr(str, "CIM_DataFile.Name") - 19), "\\", "\")
MsgBox str
End Sub

4

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Проще, проще…

WScript.Echo objService.Get(oOutParams.TargetInstance.PartComponent).Name

5

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

скрипт пишет (по ответу  DnsIs):

требуется объект: objRegExp

6 (изменено: bnp322, 2010-11-03 13:08:27)

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

  Да, все отлично! Спасибо!

С  этим работает:

WScript.Echo objService.Get(oOutParams.TargetInstance.PartComponent).Name

7 (изменено: bnp322, 2010-11-03 13:46:54)

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

И можно еще...
А как получить адекватный сетевой путь, к новым файлам
И как без пути !

Что оперативно почитать чтоб понять основы vbs, а то их (скрипты) даже изменить не получается.

8

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Что значит «адекватный сетевой путь»?!

bnp322 пишет:

И как без пути

Обозрите свойства класса: CIM_DataFile.

9

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

bnp322 пишет:

Что оперативно почитать чтоб понять основы vbs, а то их (скрипты) даже изменить не получается.

«Оперативно только кошки родятся», перефразируя мою бабушку. Вообще же — вот: Windows Script Host: коллекция ссылок, обзор некоторых книг есть здесь: CMD/BAT: Коллекция ссылок.

10

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Обозрите свойства класса: CIM_DataFile.

Но там нет ни одного слова из  objService.Get(oOutParams.TargetInstance.PartComponent).Name

Как читать то описания, если оно непонятно для чего, хотелось бы понятнее.

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

а путь типа \\comp\shara\temp\temp.txt

11

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

bnp322, прочтите справку по BBCode и используйте тэги. Например, цитирование оформляется тэгом «quote». Также не помешало бы прочесть на будущее и Правила форума, как оформлять посты. Я исправил Ваш первый пост, но делать это постоянно не могу.

CIM_DataFile — это описание класса, который будет возвращён в результате исполнения метода:

objService.Get(oOutParams.TargetInstance.PartComponent)

Соответственно:

objService.Get(oOutParams.TargetInstance.PartComponent).Name

даст свойство «.Name» этого класса:

Name
Data type: string
Access type: Read-only

Inherited name that is the key of a logical file instance within a file system (provide full path names). This property is inherited from CIM_ManagedSystemElement.

Example: "c:\winnt\system\win.ini"

А, например:

objService.Get(oOutParams.TargetInstance.PartComponent).Drive & objService.Get(oOutParams.TargetInstance.PartComponent).Path

даст имя диска и путь. Правильнее, конечно, не запрашивать объект два раза, а сделать, например, так:

With objService.Get(oOutParams.TargetInstance.PartComponent)
    WScript.Echo .Drive & .Path
End With

или, скажем, обратиться через присвоение временной переменной:

Set objSWbemObjectEx = objService.Get(oOutParams.TargetInstance.PartComponent)
WScript.Echo objSWbemObjectEx.Name
WScript.Echo objSWbemObjectEx.Drive & objSWbemObjectEx.Path
Set objSWbemObjectEx = Nothing

12

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

bnp322 пишет:

а путь типа \\comp\shara\temp\temp.txt

Как будет работать с сетевыми путями пока возможности проверить нет. Пробуйте сами.

13

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Спасибо!
Если не трудно, то где растолковывается о

objSWbemObjectEx

objService.Get

Многочисленные параметры oOutParams.TargetInstance.PartComponent

14

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Интересно! 
Есть Drive, есть, Path и есть Name которое фактически равно Drive + Path + имя, а как получают лишь имя?

15

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

bnp322 пишет:

Если не трудно, то где растолковывается о

Ссылки и порядок обучения здесь. Полное описание — WMI SDK — в MSDN.

bnp322 пишет:

…а как получают лишь имя?

Смотрим опять же в CIM_DataFile, берём и склеиваем свойства «.FileName» и «.Extension»:

WScript.Echo objSWbemObjectEx.FileName & "." & objSWbemObjectEx.Extension

16

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

То, что я хотел получилось вот так:

strDir = "c:\temp" ' каталог, за которым следим
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

' Процедура-обработчик события OnObjectReady объекта sWbemSink
Sub Sink_OnObjectReady(oOutParams, oContext)


strMessage = objService.Get(oOutParams.TargetInstance.PartComponent).FileName _
& "." & objService.Get(oOutParams.TargetInstance.PartComponent).Extension

Wscript.Echo strMessage


End Sub

Но тут есть проблема, если файл еще копируется, то возникает ошибка.
Как в текущий скрипт встроить еще и цикл, который будет проверять файлы на неизменность в течении ~10 сек и лишь затем переходить к анализу новизны.

На форуме я нашел похожий скрипт, а как их объединить ...

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 = '\\1\\'")
Wscript.Echo "Поиск ..."
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent 
    WScript.Echo "File modifed: " & objReceivedEvent.TargetInstance.FileName
Loop

17

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

bnp322 пишет:

если файл еще копируется,

Как и чем копируется файл? У меня такой ошибки не возникало ни разу, т.е. уведомление о событии возникало только после закрытия файла (не важно, при создании, копировании или перемещении).

18

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

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

Ошибки нет, но сообщение "выскакивает" до окончания копирования.

Файлы .avi, .mkv

Я пробовал использовать еще 1 скрипт с форума (он еще и копирует) - он действительно выдает ошибку.

19

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Исходя из содержания скрипта:
WScript.CreateObject

Он все делает правильно, остается добавить анализ на изменение объектов

20

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Забыл написать: для оформления кода используется тэг «code», а не «quote». Ссылки оформляются тэгом «url». Я исправил Ваши посты.

21

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

alexii пишет:
bnp322 пишет:

если файл еще копируется,

Как и чем копируется файл? У меня такой ошибки не возникало ни разу, т.е. уведомление о событии возникало только после закрытия файла (не важно, при создании, копировании или перемещении).

Уведомление о событии возникает в начале копирования !

22

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Подтверждаю: я был не прав, уведомление о новом файле возникает до закрытия файла. У меня это начало проявляться, когда я начал копировать файлы объёмами выше гигабайта (очевидно, что для сети, с её более низкой пропускной способностью, проявится и на меньших объёмах).

Однако: я не подтверждаю появления какой-либо ошибки на выложенном Вами выше и несколько адаптированном мною под себя коде (для целей отладки я завершаю отслеживание после появления первого же файла):

Option Explicit

Dim objSWbemServicesEx
Dim objSWbemSink

Dim strFolder
Dim boolDone


Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objSWbemSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")

strFolder = "c:\Temp"

objSWbemServicesEx.ExecNotificationQueryAsync objSWbemSink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
    "TargetInstance ISA 'CIM_DirectoryContainsFile' AND " & _
    "TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & Replace(strFolder, "\", "\\\\") & """'"

boolDone = False

Do
    WScript.Sleep 1000
Loop Until boolDone

objSWbemSink.Cancel

Set objSWbemSink       = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub SINK_OnObjectReady(objSWbemObject, objSWbemAsyncContext)
    With objSWbemServicesEx.Get(objSWbemObject.TargetInstance.PartComponent)
        WScript.Echo .FileName & "." & .Extension
    End With
        
    boolDone = True
End Sub
'=============================================================================

Какая именно ошибка у Вас возникала? Либо Вы что-то сразу пытались сделать с файлом, а код не привели?

23

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

bnp322 пишет:

Ошибки нет, но сообщение "выскакивает" до окончания копирования.

Я пробовал использовать еще 1 скрипт с форума (он еще и копирует) - он действительно выдает ошибку.

Ошибка была на другом скрите! Извиняюсь, насчет ошибки я ввел в заблуждение!

24 (изменено: dognike, 2012-03-19 17:39:18)

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Помогите, пожалуйста, модифицировать скриптик так, чтобы при запуске(каждое утро) параметр
strDir = "каталог" ' каталог, за которым следим, strDir менялся на V:\Post\Store\год\месяц\дата, год = 2012, месяц = 03, день = 19 - в таком формате.
И, чтоб сканила по маске, а именно на файлы mz*.*
Помогите, пожалуйста. Спасибо!!

25 (изменено: Vasek, 2012-03-29 15:08:29)

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

Если вам надо подставить время то воспользуйтесь примером:



strServer = "."

Set objWMI = GetObject("winmgmts://" & strServer & "/root\cimv2")
Set objInstances = objWMI.InstancesOf("Win32_LocalTime",48)

For Each objInstance in objInstances
   WScript.Echo objInstance.getObjectText_
Next

Если вам нужно подставить в WQL запрос маску 'mz*.*' то вам нужно использовать оператор like '%mz%[.]%' - но тут может быть проблемка ведь в имени файла может быть несколько точек,
можно конечно попытаться подставить место последнего '%' несколько '???' или '?????' вообщем попробовать задать шаблон для расширения если конечно они у вас регламентированной длинны.

26

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

подскажите пожалуйста

- как остановить скрипт
- возможно ли сделать вместо обычного сообщения всплывающее сообщение из трея?
- как прикрутить логирование

27

Re: VBScript: Помогите модифицировать скрипт слежения за созданием файлов

в общем получилось вот так

strDir = "c:\ta" ' каталог, за которым следим
strComputer = "." ' имя компьютера; "." означает текущий компьютер
strDirSlash = Replace(strDir, "\", "\\\\")
strNamespace = "Root\CIMV2"

Set objService = GetObject("WinMgmts:\\" & strComputer & "\" & strNamespace)
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
Set fso = CreateObject("Scripting.FileSystemObject")

objService.ExecNotificationQueryAsync objSink, _
    "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " &_
    "Targetinstance ISA 'CIM_DirectoryContainsFile' and " &_
    "TargetInstance.GroupComponent= " &_
    "'Win32_Directory.Name=""" & strDirSlash & """'"

While 1
    WScript.Sleep 3000
Wend

Sub Sink_OnObjectReady(oOutParams, oContext)
    Set Hh = CreateObject("Internet.HHCtrl")
    Hh.TextPopup "Принят новый файл: " & vbCrLf & objService.Get(oOutParams.TargetInstance.PartComponent).Name, "Courier New,22", 1, 1, 1, 1
    WScript.Sleep 1000
    Set Hh = Nothing
    AddLog(objService.Get(oOutParams.TargetInstance.PartComponent).Name)
End Sub


Function AddLog(str)
    if fso.FileExists("sync_m_" & date & ".htm") then 
        Set objTextFile = fso.OpenTextFile("sync_m_" & date & ".htm", 8, True)
    else 
        Set objTextFile = fso.OpenTextFile("sync_m_" & date & ".htm", 2, True)
    end if
    objTextFile.WriteLine("<font size=3>" & Now & " - " & Str & "</font></br>")
    objTextFile.Close
End Function

в итоге - встплывающие сообщения есть (пусть и не из трея)
лог сделан


ЗЫ но как оказалось нужно на рабочем столе пользователя динамически отражать последние 5 файлов которые ему пришли... думаю как сделать