Esecuzione di una chiamata semisincrona con VBScript
L'esecuzione degli script potrebbe interrompersi a causa del fatto che alcuni metodi WMI possono restituire raccolte di grandi dimensioni. Nello script, l'accesso semisincrono è 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 seguenti metodi di SWbemServices: InstancesOf, SubclassesOf, ExecQuery, AssociatorsOfe ReferencesTo.
L'accesso semisincrono 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 diSWbemObjectseguenti: 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 impostati per impostazione predefinita per il metodo SWbemServices.ExecNotificationQuery.
La procedura seguente descrive come usare VBScript per eseguire una chiamata semisincrona.
Per effettuare una chiamata semiincrona in VBScript
- Impostare il parametro IFlags al valore di wbemFlagReturnImmediately.
- Eseguire la normale chiamata sincrona per SWbemServices.ExecQuery o SWbemServices.ExecNotificationQuery con il valore iFlags.
- Se si desidera considerare gli oggetti restituiti dalla chiamata come raccolta, utilizzare una sintassi di enumerazione, ad esempio VBScript For Each. Quando viene restituito, ogni oggetto viene elaborato come elemento successivo dell'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 semisincrona. Per ulteriori informazioni, vedere Chiamare 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