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


Создание полусинхронного вызова с помощью 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 For Each. По мере возврата каждого объекта он обрабатывается как следующий элемент в коллекции.
  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

Вызов метода