Durchführen eines halbsynchronen Aufrufs mit VBScript

Einige WMI-Methoden können große Sammlungen zurückgeben, was dazu führt, dass Skripts nicht mehr reagieren. Im Skript ist der halbsynchrone Zugriff die Standardeinstellung, und die Windows-Verwaltungsinstrumentation (WMI) legt wbemFlagReturnImmediately für Aufrufe fest, die große Objektsammlungen wie die folgenden SWbemServices-Methoden zurückgeben können: InstancesOf, SubclassesOf, ExecQuery, AssociatorsOf und ReferencesTo.

Der halbsynchrone Zugriff, der wbemFlagReturnImmediately verwendet und im IFlags-Parameter festgelegt ist, ist zugleich die Standardeinstellung für Aufrufe, die große Objektsätze für die folgenden SWbemObject-Methoden zurückgeben können: Instances_, Subclasses_, Associators_ und References_.

Zum Reduzieren der WMI-Speicherressourcenauslastung bei der Verarbeitung einer großen Sammlung von Objekten schließen Sie den Wert von wbemFlagForwardOnly in den IFlags-Parameter ein. Die Verwendung von wbemFlagForwardOnly bewirkt, dass WMI einen Forward-Only-Enumerator erstellt, der ein Zurückgehen in der Sammlung und den erneuten Zugriff auf Elemente nicht zulässt.

WMI entfernt den Arbeitsspeicher für jedes Objekt, während die For Each-Anweisung ein Objekt verarbeitet. Sie können die Count-Methode für eine Sammlung nicht aufrufen, wenn das wbemFlagForwardOnly-Flag für den Aufruf festgelegt wurde, der die Sammlung abgerufen hat. Beachten Sie, dass für den IFlags-Parameter wbemFlagReturnImmediately und wbemFlagForwardOnly für die SWbemServices.ExecNotificationQuery-Methode standardmäßig festgelegt sind.

Im folgenden Verfahren wird beschrieben, wie Sie VBScript verwenden, um einen halbsynchronen Aufruf auszuführen.

So führen Sie einen halbsynchronen Aufruf in VBScript aus

  1. Legen Sie den IFlags-Parameter auf den Wert von wbemFlagReturnImmediately fest.
  2. Führen Sie den normalen synchronen Aufruf für SWbemServices.ExecQuery oder SWbemServices.ExecNotificationQuery mit dem iFlags-Wert aus.
  3. Wenn Sie die vom Aufruf zurückgegebenen Objekte als Sammlung behandeln möchten, verwenden Sie eine Enumerationssyntax wie For Each in VBScript. Jedes Objekt wird bei der Rückgabe als nächstes Element in der Sammlung verarbeitet.
  4. Erstellen Sie einen Forward-Only-Enumerator, indem Sie den Wert von wbemFlagReturnImmediately mit dem Wert von wbemFlagForwardOnly kombinieren. Der Dezimalwert dieses OR-Vorgangs ist 48. Diese Konstanten sind in der Typbibliothek wbemdisp.tlb für Visual Basic definiert. Die meisten Skriptsprachen verwenden den numerischen Wert oder definieren eine Konstante. Weitere Informationen finden Sie unter WbemFlagEnum.

Im folgenden Codebeispiel wird gezeigt, wie Sie einen halbsynchronen Methodenaufruf ausführen. Weitere Informationen finden Sie unter Aufrufen einer Methode.

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

Aufrufen einer Methode