使用 VBScript 進行半同步呼叫
某些 WMI 方法可能會傳回大型集合,導致腳本停止回應。 在腳本中,半同步存取是預設模式,並且 Windows Management Instrumentation(WMI)會為能夠傳回大型物件集合的呼叫設定 wbemFlagReturnImmediately,例如以下 SWbemServices 方法:InstancesOf、SubclassesOf、ExecQuery、AssociatorsOf和 ReferencesTo。
使用 wbemFlagReturnImmediately 在 IFlags 參數中設定的半同步存取,也是呼叫的預設值,這些呼叫也可以針對下列 SWbemObject 方法傳回大型物件集:Instances_、Subclasses_、Associators_和 References_。
若要減少處理大量物件集合時的 WMI 記憶體資源使用量,請在 IFlags 參數中包含 wbemFlagForwardOnly 的值。 使用 wbemFlagForwardOnly 會導致 WMI 建立一個只能順向存取的列舉器,無法倒帶集合重新存取項目。
WMI 會消除每個物件的記憶體,因為 For Each 語句的 會處理物件。 當您在呼叫取得集合時設定了 wbemFlagForwardOnly 旗標,您無法呼叫集合的 Count 方法。 請注意,IFlags 參數在 SWbemServices.ExecNotificationQuery 方法中預設設定為 wbemFlagReturnImmediately 和 wbemFlagForwardOnly。
下列程式描述如何使用 VBScript 進行半同步呼叫。
在 VBScript 中進行半同步呼叫
- 將 IFlags 參數設定為 wbemFlagReturnImmediately值。
- 使用 iFlags 值,對 SWbemServices.ExecQuery 或 SWbemServices.ExecNotificationQuery 進行一般同步呼叫。
- 如果您想要將呼叫傳回的對象視為集合,請使用列舉語法,例如 VBScript For Each。 當每個物件被傳回時,它會被處理成集合中的下一個項目。
- 藉由結合 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
相關主題