VBScript を使用して半同期呼び出しを行う

一部の WMI メソッドでは大規模なコレクションが返され、スクリプトで応答が停止される可能性があります。 スクリプトでは、半同期アクセスが既定であり、Windows Management Instrumentation (WMI) は、次の SWbemServices メソッドなど、大規模なオブジェクト コレクションを返す可能性がある呼び出しに対して wbemFlagReturnImmediately を設定します: InstancesOfSubclassesOfExecQueryAssociatorsOfReferencesTo

IFlags パラメータに設定されている wbemFlagReturnImmediately を使用する半同期アクセスは、次の SWbemObject メソッドに対して大きなオブジェクト セットを返す可能性がある呼び出しの既定値でもあります: Instances_Subclasses_Associators_References_

オブジェクトの大規模なコレクションを処理する際の WMI メモリ リソースの使用量を減らすには、iFlags パラメータに wbemFlagForwardOnly の値を含めます。 wbemFlagForwardOnly を使用すると、WMI によって、コレクションの巻き戻しと項目への再アクセスを許可しない順方向専用の列挙子が作成されます。

For Each ステートメントでオブジェクトが処理されるため、WMI では各オブジェクトのメモリが削除されます。 コレクションを取得した呼び出しに wbemFlagForwardOnly フラグが設定されている場合は、コレクションの Count メソッドを呼び出すことはできません。 IFlags パラメータには、SWbemServices.ExecNotificationQuery メソッドに対して wbemFlagReturnImmediatelywbemFlagForwardOnly が既定で設定されていることに注意してください。

次の手順では、VBScript を使用して半同期呼び出しを行う方法について説明します。

VBScript で半同期呼び出しを行うには

  1. IFlags パラメータを wbemFlagReturnImmediately の値に設定します。
  2. iFlags 値を使用して SWbemServices.ExecQuery または SWbemServices.ExecNotificationQuery に対して通常の同期呼び出しを行います。
  3. 呼び出しによって返されたオブジェクトをコレクションとして扱う場合は、VBScript の For Each などの列挙型の構文を使用します。 各オブジェクトは返されると、コレクション内の次の項目として処理されます。
  4. wbemFlagReturnImmediately の値と wbemFlagForwardOnly の値を組み合わせて、順方向専用の列挙子を作成します。 この OR 演算の 10 進値は 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

メソッドの呼び出し