Поделиться через


Создание полусинхронного вызова с помощью VBScript

Некоторые методы WMI могут возвращать большие коллекции, что приводит к остановке реагирования скриптов. В скрипте полусинхронный доступ по умолчанию. Инструментарий управления Windows (WMI) задает wbemFlagReturnImmediately для вызовов, которые могут возвращать большие коллекции объектов, такие как следующие методы SWbemServices: InstancesOf, SubclassesOf, ExecQuery, AssociatorsOfи ReferencesTo.

Полусинхронный доступ, использующий wbemFlagReturnImmediately в параметре IFlags, также используется по умолчанию для вызовов, которые могут возвращать большие наборы объектов для следующих методов SWbemObject: Instances_, Subclasses_, Associators_и References_.

Чтобы уменьшить использование ресурсов памяти WMI при обработке большого набора объектов, добавьте значение wbemFlagForwardOnly в параметр IFlags. Использование wbemFlagForwardOnly приводит к тому, что WMI создает перечислитель только вперед, который не позволяет перематывать назад коллекцию и повторно получать доступ к элементам.

WMI устраняет память для каждого объекта, так как оператор For Each обрабатывает объект. Вы не можете вызвать метод Count для коллекции, если на вызове, получившем коллекцию, был установлен флаг wbemFlagForwardOnly. Обратите внимание, что параметр IFlags имеет значения wbemFlagReturnImmediately и wbemFlagForwardOnly, установленные по умолчанию для метода SWbemServices.ExecNotificationQuery.

В следующей процедуре описывается, как использовать VBScript для выполнения полусинхронного вызова.

Для выполнения полусинхронного вызова в VBScript

  1. Задайте для параметра IFlags значение wbemFlagReturnImmediately.
  2. Выполните обычный синхронный вызов SWbemServices.ExecQuery или SWbemServices.ExecNotificationQuery со значением iFlags .
  3. Если вы хотите рассматривать объекты, возвращаемые вызовом как коллекцию, используйте синтаксис перечисления, например VBScript Для каждой. По мере возврата каждого объекта он обрабатывается как следующий элемент в коллекции.
  4. Создайте перечислитель только для пересылки путем объединения значения wbemFlagReturnImmediately со значением wbemFlagForwardOnly. Десятичное значение этой операции OR равно 48. Эти константы определяются в библиотеке типов wbemdisp.tlb для Visual Basic. Большинство языков сценариев используют числовое значение или определяют константу. Дополнительные сведения см. в WbemFlagEnum.

В следующем примере кода показано, как вызвать полусинхронный метод. Дополнительные сведения см. в статье Вызов метода.

wbemFlagReturnImmediately = 16
wbemFlagForwardOnly = 32
IFlags = wbemFlagReturnImmediately + wbemFlagForwardOnly
WScript.Echo IFlags
Set objWMIService = GetObject("winmgmts:root\cimv2")
' Query for all the Win32_Process objects on the 
'     local computer and use forward-only enumerator
Set colProcesses = objWMIService.ExecQuery("SELECT Name FROM Win32_Process",,IFlags)
' Receive each object as it arrives
For Each objProcess in colProcesses
    WScript.Echo objProcess.Name
Next

вызов метода