使用 VBScript 進行半同步呼叫

某些 WMI 方法可能會傳回大型集合,導致腳本停止回應。 在腳本中,半同步存取是預設值,而 Windows Management Instrumentation (WMI) 會針對可傳回大型物件集合的 呼叫設定 wbemFlagReturnImmediately ,例如下列 SWbemServices 方法: InstancesOfSubclassesOfExecQueryAssociatorsOfReferencesTo

IFlags參數中使用wbemFlagReturnImmediately設定的半同步存取,也是可針對下列SWbemObject方法傳回大型物件集之呼叫的預設值:Instances_Subclasses_Associators_References_

若要在處理大型物件集合時減少 WMI 記憶體資源使用量,請在IFlags參數中包含wbemFlagForwardOnly的值。 使用 wbemFlagForwardOnly 會導致 WMI 建立順向列舉值,不允許倒轉集合並再次存取專案。

WMI 會消除每個物件的記憶體,因為 For Each 語句會處理物件。 在取得集合的呼叫上設定wbemFlagForwardOnly旗標時,您無法呼叫集合的Count方法。 請注意,IFlags參數預設會針對SWbemServices.ExecNotificationQuery方法設定wbemFlagReturnImmediatelywbemFlagForwardOnly

下列程式描述如何使用 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

呼叫方法