Sdílet prostřednictvím


Vytvoření polosynchronního volání pomocí jazyka VBScript

Některé metody rozhraní WMI můžou vracet velké kolekce, což způsobuje, že skripty přestanou reagovat. Ve skriptu je polosynchronní přístup výchozí, a WMI (Windows Management Instrumentation) nastaví wbemFlagReturnImmediately pro volání, která mohou vracet velké kolekce objektů, jako jsou například následující SWbemServices metody: InstancesOf, SubclassesOf, ExecQuery, AsociatorsOfa ReferencesTo.

Polosynchronní přístup, který používá nastavení wbemFlagReturnImmediately v parametru IFlags, je také výchozí pro volání, která mohou poskytovat velké sady objektů pro následující metody SWbemObject: Instances_, Subclasses_, Associators_a References_.

Chcete-li snížit využití prostředků paměti WMI při zpracování velké kolekce objektů, uveďte hodnotu wbemFlagForwardOnly v parametru IFlags. Použití wbemFlagForwardOnly způsobí, že rozhraní WMI vytvoří enumerátor jen pro předávání, který neumožňuje převinutí kolekce a opětovnému přístupu k položkám.

WMI uvolňuje paměť pro každý objekt, když příkaz For Each zpracovává objekt. Nelze volat metodu Count pro kolekci, když byl příznak wbemFlagForwardOnly nastaven na volání, které získalo kolekci. Všimněte si, že parametr IFlagswbemFlagReturnImmediately a wbemFlagForwardOnly nastaven ve výchozím nastavení pro metodu SWbemServices.ExecNotificationQuery.

Následující postup popisuje, jak pomocí jazyka VBScript provést polosynchronní volání.

Provedení polosynchronního volání v jazyka VBScript

  1. Nastavte parametr IFlags na hodnotu wbemFlagReturnImmediately.
  2. Proveďte normální synchronní volání pro SWbemServices.ExecQuery nebo SWbemServices.ExecNotificationQuery s hodnotou iFlags.
  3. Pokud chcete s objekty vrácenými voláním zacházet jako s kolekcí, použijte syntaxi výčtu, jako je VBScript for Each. Při vrácení každého objektu se zpracuje jako další položka v kolekci.
  4. Vytvořte enumerátor pouze pro průchod dopředu spojením hodnoty wbemFlagReturnImmediately s hodnotou wbemFlagForwardOnly. Desetinná hodnota této operace OR je 48. Tyto konstanty jsou definovány v knihovně typů wbemdisp.tlb pro Visual Basic. Většina skriptovacího jazyka používá číselnou hodnotu nebo definuje konstantu. Další informace naleznete v tématu WbemFlagEnum.

Následující příklad kódu ukazuje, jak provést polosynchronní volání metody. Další informace naleznete v tématu Volání 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

volání metody