Fazer uma chamada semissíncrona com VBScript

Alguns métodos do WMI podem retornar grandes coleções, fazendo com que os scripts parem de responder. No script, o acesso semissíncrono é o padrão e a WMI (Instrumentação de Gerenciamento do Windows) define wbemFlagReturnImmediately para chamadas que podem retornar grandes coleções de objetos, como os seguintes métodos de SWbemServices: InstancesOf, SubclassesOf, ExecQuery, AssociatorsOf e ReferencesTo.

O acesso semissíncrono que usa wbemFlagReturnImmediately definido no parâmetro IFlags também é o padrão para chamadas que podem retornar conjuntos de objetos grandes para os seguintes métodos SWbemObject: Instances_, Subclasses_, Associators_ e References_.

Para reduzir o uso de recursos de memória pelo WMI ao processar uma grande coleção de objetos, inclua o valor de wbemFlagForwardOnly no parâmetro IFlags. O uso de wbemFlagForwardOnly faz com que o WMI crie um enumerador somente de encaminhamento que não permita retroceder a coleção e acessar itens novamente.

O WMI elimina a memória de cada objeto à medida que a instrução For Each processa um objeto. Não é possível chamar o método Count em uma coleção quando o sinalizador wbemFlagForwardOnly foi definido na chamada que obteve a coleção. Observe que o parâmetro IFlags tem wbemFlagReturnImmediately e wbemFlagForwardOnly definidos por padrão para o método SWbemServices.ExecNotificationQuery.

O procedimento a seguir descreve como usar o VBScript para fazer uma chamada semissíncrona.

Para fazer uma chamada semissíncrona no VBScript

  1. Defina o parâmetro IFlags como o valor de wbemFlagReturnImmediately.
  2. Faça a chamada síncrona normal para SWbemServices.ExecQuery ou SWbemServices.ExecNotificationQuery com o valor de iFlags.
  3. Se você quiser tratar os objetos retornados pela chamada como uma coleção, use uma sintaxe de enumeração como a For Each do VBScript. Conforme cada objeto é retornado, ele é processado como o próximo item na coleção.
  4. Crie um enumerador somente de encaminhamento combinando o valor de wbemFlagReturnImmediately com o valor de wbemFlagForwardOnly. O valor decimal dessa operação OR é 48. Essas constantes são definidas na biblioteca de tipos wbemdisp.tlb do Visual Basic. A maioria das linguagens de script usa o valor numérico ou define uma constante. Para obter mais informações, confira WbemFlagEnum.

O exemplo de código a seguir mostra como fazer uma chamada de método semissíncrona. Para obter mais informações, consulte Chamar um 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

Chamar um método