Partilhar via


Fazendo uma chamada semissíncrona com VBScript

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

O acesso semissíncrono que utiliza o parâmetro wbemFlagReturnImmediately definido em IFlags é também o padrão para chamadas que são capazes de retornar grandes conjuntos de objetos para os seguintes métodos SWbemObject: Instances_, Subclasses_, Associators_e References_.

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

O WMI elimina a memória de cada objeto à medida que a instrução For Each processa um objeto. Não é permitido chamar o método Count para uma coleção quando a bandeira wbemFlagForwardOnly foi definida na chamada que obteve a coleção. Note que o parâmetro IFlags tem wbemFlagReturnImmediately e wbemFlagForwardOnly definido 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 iFlags.
  3. Se você quiser tratar os objetos retornados pela chamada como uma coleção, use uma sintaxe de enumeração como VBScript For Each. À medida que cada objeto é retornado, ele é processado como o próximo item da coleção.
  4. Crie um enumerador unidirecional combinando o valor de wbemFlagReturnImmediately com o valor de wbemFlagForwardOnly. O valor decimal desta operação OR é 48. Essas constantes são definidas na biblioteca de tipos wbemdisp.tlb para Visual Basic. A maioria das linguagens de script usa o valor numérico ou define uma constante. Para obter mais informações, consulte WbemFlagEnum.

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

Chamando um método