Realización de una llamada semisíncrona con VBScript

Algunos métodos WMI pueden devolver colecciones grandes, lo que provoca que los scripts dejen de responder. En el script, el acceso semisincrónico es el predeterminado, y Windows Management Instrumentation (WMI) establece wbemFlagReturnImmediately para las llamadas que pueden devolver grandes colecciones de objetos, como los siguientes métodos SWbemServices: InstancesOf, SubclassesOf, ExecQuery, AssociatorsOf, y ReferencesTo.

El acceso semisincrónico que utiliza wbemFlagReturnImmediately establecido en el parámetro IFlags también es el predeterminado para las llamadas que pueden devolver grandes conjuntos de objetos para los siguientes métodos SWbemObject: Instances_, Subclasses_, Subclasses_ y References_.

Para reducir el uso de recursos de memoria WMI al procesar una gran colección de objetos, incluya el valor de wbemFlagForwardOnly en el parámetro IFlags. El uso de wbemFlagForwardOnly hace que WMI cree un enumerador de solo avance que no permita rebobinar la colección y volver a acceder a los elementos.

WMI elimina la memoria de cada objeto a medida que la instrucción For Each procesa un objeto. No se puede llamar al método Count para una colección cuando se estableció la marca wbemFlagForwardOnly en la llamada que obtuvo la colección. Tenga en cuenta que el parámetro IFlags tiene wbemFlagReturnImmediately y wbemFlagForwardOnly establecido de forma predeterminada para el método SWbemServices.ExecNotificationQuery.

En el procedimiento siguiente se describe cómo usar VBScript para realizar una llamada semisincrónica.

Para realizar una llamada semisincrónica en VBScript

  1. Establezca el parámetro IFlags en el valor de wbemFlagReturnImmediately.
  2. Realice la llamada sincrónica normal para SWbemServices.ExecQuery o SWbemServices.ExecNotificationQuery con el valor iFlags.
  3. Si quiere tratar los objetos devueltos por la llamada como una colección, use una sintaxis de enumeración como VBScript For Each. A medida que se devuelve cada objeto, se procesa como el siguiente elemento de la colección.
  4. Cree un enumerador de solo avance combinando el valor de wbemFlagReturnImmediately con el valor de wbemFlagForwardOnly. El valor decimal de esta operación OR es 48. Estas constantes se definen en la biblioteca de tipos wbemdisp.tlb para Visual Basic. La mayoría de los lenguajes de scripting usan el valor numérico o definen una constante. Para obtener más información, vea WbemFlagEnum.

En el ejemplo de código siguiente se muestra cómo realizar una llamada de método semisincrónico. Para obtener más información, vea Llamada a un método.

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

Llamada a un método