Effectuer un appel semi-synchrone avec VBScript

Certaines méthodes WMI peuvent retourner des collections volumineuses, ce qui entraîne l’arrêt de la réponse des scripts. Dans le script, l’accès semi-synchrone est la valeur par défaut, et Windows Management Instrumentation (WMI) définit wbemFlagReturnImmediately pour les appels qui peuvent retourner des collections volumineuses d’objets volumineuses telles que les méthodes SWbemServices suivantes : InstancesOf, SubclassesOf, ExecQuery, AssociatorsOf et ReferencesTo.

L’accès semi-synchrone qui utilise wbemFlagReturnImmediately défini dans le paramètre IFlags est également la valeur par défaut pour les appels qui peuvent retourner des ensembles d’objets volumineux pour les méthodes SWbemObject suivantes : Instances_, Subclasses_, Associators_ et References_.

Pour réduire l’utilisation de la ressource mémoire WMI lors du traitement d’une grande collection d’objets, incluez la valeur de wbemFlagForwardOnly dans le paramètre IFlags. L’utilisation de wbemFlagForwardOnly amène WMI à créer un énumérateur avant uniquement qui n’autorise pas le rembobinage de la collection et l’accès aux éléments à nouveau.

WMI élimine la mémoire de chaque objet à mesure que l’instruction For Each traite un objet. Vous ne pouvez pas appeler la méthode Count pour une collection lorsque l’indicateur wbemFlagForwardOnly a été défini pour l’appel qui a obtenu la collection. Notez que dans le cadre du paramètre IFlags, wbemFlagReturnImmediately et wbemFlagForwardOnly sont définis par défaut pour la méthode SWbemServices.ExecNotificationQuery.

La procédure suivante décrit comment utiliser VBScript pour effectuer un appel semi-synchrone.

Pour effectuer un appel semi-synchrone dans VBScript

  1. Définissez le paramètre IFlags sur la valeur de wbemFlagReturnImmediately.
  2. Effectuez l’appel synchrone normal pour SWbemServices.ExecQuery ou SWbemServices.ExecNotificationQuery avec la valeur iFlags .
  3. Si vous souhaitez traiter les objets retournés par l’appel comme une collection, utilisez une syntaxe d’énumération telle que VBScript For Each. À mesure que chaque objet est retourné, il est traité en tant qu’élément suivant dans la collection.
  4. Créez un énumérateur avant uniquement en combinant la valeur de wbemFlagReturnImmediately avec la valeur de wbemFlagForwardOnly. La valeur décimale de cette opération OR est 48. Ces constantes sont définies dans la bibliothèque de types wbemdisp.tlb pour Visual Basic. La plupart des langages de script utilisent la valeur numérique ou définissent une constante. Pour plus d’informations, consultez WbemFlagEnum.

L’exemple de code suivant montre comment effectuer un appel de méthode semi-synchrone. Pour plus d’informations, consultez Appel d’une méthode.

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

Appel d’une méthode