Condividi tramite


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

  1. Impostare il parametro IFlags sul valore di wbemFlagReturnImmediately.
  2. Effettuare la normale chiamata sincrona per SWbemServices.ExecQuery o SWbemServices.ExecNotificationQuery con il valore iFlags .
  3. 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.
  4. 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

Chiamata di un metodo