使用 VBScript 进行半同步调用

某些 WMI 方法可能返回大型集合,导致脚本停止响应。 在脚本中,默认采用半同步访问,Windows Management Instrumentation (WMI) 为可返回大型对象集合的调用设置 wbemFlagReturnImmediately,例如下面的 SWbemServices 方法:InstancesOfSubclassesOfExecQueryAssociatorsOfReferencesTo

对于可为以下 SWbemObject 方法返回大型对象集的调用,也默认进行使用 IFlags 参数中设置的 wbemFlagReturnImmediately 的半同步访问:Instances_Subclasses_Associators_References_

若要在处理大型对象集合时减少 WMI 内存资源的使用,请在 IFlags 参数中包含 wbemFlagForwardOnly 的值。 使用 wbemFlagForwardOnly 会导致 WMI 创建一个仅向前的枚举器,该枚举器不允许再次回退集合和访问项。

当 For Each 语句处理对象时,WMI 会消除每个对象的内存。 在获取集合的调用上设置了 wbemFlagForwardOnly 标志后,无法为集合调用 Count 方法。 请注意,IFlags 参数为 SWbemServices.ExecNotificationQuery 方法默认设置了 wbemFlagReturnImmediately 和 wbemFlagForwardOnly。

以下过程介绍如何使用 VBScript 进行半同步调用。

在 VBScript 中进行半同步调用

  1. 将 IFlags 参数设置为 wbemFlagReturnImmediately 的值。
  2. 使用 iFlags 值对 SWbemServices.ExecQuerySWbemServices.ExecNotificationQuery 进行正常同步调用。
  3. 如果要将调用返回的对象视为集合,请使用枚举语法,例如 VBScript For Each。 返回每个对象时,对象将作为集合中的下一项进行处理。
  4. 将 wbemFlagReturnImmediately 的值与 wbemFlagForwardOnly 的值相结合,创建仅向前的枚举器。 此 OR 操作的十进制值为 48。 这些常量是在 Visual Basic 的 wbemdisp.tlb 类型库中定义的。 大多数脚本语言使用数值或定义一个常量。 有关详细信息,请参阅 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

调用方法