Udostępnij za pośrednictwem


Wykonywanie wywołania semisynchronicznego za pomocą języka VBScript

Niektóre metody WMI mogą zwracać duże kolekcje, co może powodować zatrzymanie działania skryptów. W skrypcie dostęp semisynchroniczny jest domyślny, a Instrumentacja Zarządzania Windows (WMI) ustawia wbemFlagReturnImmediately dla wywołań, które mogą zwracać duże kolekcje obiektów, takie jak następujące metody SWbemServices: InstancesOf, SubclassesOf, ExecQuery, AssociatorsOfi ReferencesTo.

Dostęp półsynchroniczny używający wbemFlagReturnImmediately ustawiony w parametrze IFlags jest również domyślnym ustawieniem wywołań. Może on zwracać duże zestawy obiektów dla następujących metod SWbemObject: Instances_, Subclasses_, Associators_i References_.

Aby zmniejszyć użycie zasobów pamięci WMI podczas przetwarzania dużej kolekcji obiektów, uwzględnij wartość wbemFlagForwardOnly w parametrze IFlags. Użycie wbemFlagForwardOnly powoduje utworzenie modułu wyliczającego tylko do przodu, który nie zezwala na ponowne przewijanie kolekcji i uzyskiwanie dostępu do elementów.

Usługa WMI eliminuje pamięć dla każdego obiektu, ponieważ instrukcja Dla każdego przetwarza obiekt. Nie można wywołać metody Count dla kolekcji, gdy flaga wbemFlagForwardOnly została ustawiona na wywołanie, które uzyskało kolekcję. Należy pamiętać, że parametr IFlags ma wbemFlagReturnImmediately i wbemFlagForwardOnly ustawione domyślnie dla metody SWbemServices.ExecNotificationQuery.

W poniższej procedurze opisano, jak używać języka VBScript do wykonywania wywołania semisynchronicznego.

Aby wykonać wywołanie semisynchroniczne w języku VBScript

  1. Ustaw parametr IFlags na wartość wbemFlagReturnImmediately.
  2. Utwórz normalne wywołanie synchroniczne dla SWbemServices.ExecQuery lub SWbemServices.ExecNotificationQuery z wartością iFlags.
  3. Jeśli chcesz traktować obiekty zwracane przez wywołanie jako kolekcję, użyj składni wyliczenia, takiej jak VBScript Dla każdego. Gdy każdy obiekt jest zwracany, jest przetwarzany jako następny element w kolekcji.
  4. Utwórz moduł wyliczający tylko do przodu, łącząc wartość wbemFlagReturnImmediately z wartością wbemFlagForwardOnly. Wartość dziesiętna tej operacji OR wynosi 48. Te stałe są definiowane w bibliotece typów wbemdisp.tlb dla języka Visual Basic. Większość języków skryptowych używa wartości liczbowej lub definiuje stałą. Aby uzyskać więcej informacji, zobacz WbemFlagEnum.

W poniższym przykładzie kodu pokazano, jak wykonać wywołanie metody semisynchronicznej. Aby uzyskać więcej informacji, zapoznaj się z sekcją Wywoływanie metody.

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

Wywoływanie metody