Esecuzione di una chiamata semisynchronous con VBScript
Alcuni metodi WMI possono restituire raccolte di grandi dimensioni, causando l'arresto degli script. Nello script, l'accesso semisynchronous è l'impostazione predefinita e Strumentazione gestione Windows (WMI) imposta wbemFlagReturnImmediately per le chiamate che possono restituire raccolte di oggetti di grandi dimensioni, ad esempio i metodi SWbemServices seguenti: InstancesOf, SubclassesOf, ExecQuery, AssociatorsOf e ReferencesTo.
L'accesso semisynchronous che usa wbemFlagReturnImmediately impostato nel parametro IFlags è anche l'impostazione predefinita per le chiamate che possono restituire set di oggetti di grandi dimensioni per i metodi SWbemObject seguenti: Instances_, Subclasses_, Associators_ e References_.
Per ridurre l'utilizzo delle risorse di memoria WMI durante l'elaborazione di una raccolta di oggetti di grandi dimensioni, includere il valore di wbemFlagForwardOnly nel parametro IFlags . L'uso di wbemFlagForwardOnly fa sì che WMI crei un enumeratore forward-only che non consenta di riavvolgere la raccolta e di accedere di nuovo agli elementi.
WMI elimina la memoria per ogni oggetto perché l'istruzione For Each elabora un oggetto. Non è possibile chiamare il metodo Count per una raccolta quando il flag wbemFlagForwardOnly è stato impostato sulla chiamata che ha ottenuto la raccolta. Si noti che il parametro IFlags ha wbemFlagReturnImmediately e wbemFlagForwardOnly impostato per impostazione predefinita per il metodo SWbemServices.ExecNotificationQuery .
La procedura seguente descrive come usare VBScript per effettuare una chiamata semisynchronous.
Per effettuare una chiamata semiincrona in VBScript
- Impostare il parametro IFlags sul valore di wbemFlagReturnImmediately.
- Effettuare la normale chiamata sincrona per SWbemServices.ExecQuery o SWbemServices.ExecNotificationQuery con il valore iFlags .
- Se si desidera trattare gli oggetti restituiti dalla chiamata come raccolta, usare una sintassi di enumerazione, ad esempio VBScript For Each. Quando viene restituito ogni oggetto, viene elaborato come elemento successivo nell'insieme.
- Creare un enumeratore forward-only combinando il valore di wbemFlagReturnImmediately con il valore di wbemFlagForwardOnly. Il valore decimale di questa operazione OR è 48. Queste costanti sono definite nella libreria dei tipi wbemdisp.tlb per Visual Basic. La maggior parte dei linguaggi di scripting usa il valore numerico o definisce una costante. Per altre informazioni, vedere WbemFlagEnum.
Nell'esempio di codice seguente viene illustrato come eseguire una chiamata al metodo semisynchronous. Per altre informazioni, vedere Chiamata di un metodo.
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
Argomenti correlati