Atualizar dados do WMI em scripts
Em scripts de monitoramento, você pode evitar chamadas sucessivas para GetObject usando um objeto SWbemRefresher. O objeto SWbemRefresher é um contêiner que pode conter vários objetos WMI cujos dados podem ser atualizados em uma chamada.
O uso de um objeto SWbemRefresher é necessário para obter dados precisos das classes de desempenho WMI, como a Win32_PerfFormattedData_PerfDisk_LogicalDisk ou outras classes pré-instaladas derivadas de Win32_Perf.
O procedimento a seguir descreve como atualizar dados em scripts.
Para atualizar dados em scripts
Chame CreateObject para criar um objeto atualizador SWbemRefresher.
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Conecte-se ao namespace WMI. Para usar classes de desempenho Win32_Perf pré-instaladas, conecte-se a root\cimv2.
Set objServicesCimv2 = GetObject("winmgmts:\\" _ & strComputer & "\root\cimv2")
Adicione um único objeto (chame SWbemRefresher.Add) ou uma coleção (chame SWbemRefresher.AddEnum) ao atualizador.
Use as classes de dados pré-calculadas derivadas de Win32_PerfFormattedData, por exemplo, Win32_PerfFormattedData_PerfDisk_LogicalDisk em vez de Win32_PerfRawData_PerfDisk_LogicalDisk. Caso contrário, você deverá calcular os valores de todas as propriedades que não sejam simples contadores.
Set objRefreshableItem = _ objRefresher.AddEnum(objServicesCimv2 , _ "Win32_PerfFormattedData_PerfProc_Process")
Atualize os dados uma vez para obter os dados iniciais de desempenho.
Chame o método SWbemRefresher.Refresh ou o método SWbemObjectEx.Refresh_ genérico.
objRefresher.Refresh
Se você estiver monitorando o desempenho e tiver uma coleção no objeto atualizador, percorra os objetos da coleção.
For Each Process in objRefreshableItem.ObjectSet If Process.PercentProcessorTime > 1 then WScript.Echo Process.Name & vbnewLine _ & Process.PercentProcessorTime & "%" End If Next
Limpe os itens do atualizador chamando SWbemRefresher.DeleteAll ou remova itens específicos chamando SwbemRefresher.Remove.
O exemplo de código VBScript a seguir mostra como atualizar um único objeto no computador local. O script cria um contêiner de atualização e adiciona a instância de um enumerador para instâncias de Win32_PerfFormattedData_PerfProc_Process. A chamada Refresh é feita três vezes para demonstrar as alterações na propriedade PercentProcessorTime para processos que usam mais de um por cento de tempo do processador.
On Error Resume Next
strComputer = "."
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set objServicesCimv2 = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
If Err = 0 Then
Set objRefreshableItem = _
objRefresher.AddEnum(objServicesCimv2 ,"Win32_PerfFormattedData_PerfProc_Process")
objRefresher.Refresh
' Loop through the processes three times to locate
' and display all the process currently using
' more than 1 % of the process time. Refresh on each pass.
For i = 1 to 3
Wscript.Echo "Refresh number " & i
objRefresher.Refresh
For Each Process in objRefreshableItem.ObjectSet
If Process.PercentProcessorTime > 1 then
WScript.Echo Process.Name & vbnewLine & Process.PercentProcessorTime & "%"
End If
Next
Next
Else
WScript.Echo Err.Description
End If
A propriedade Index do SWbemRefreshableItem retornado representa o índice do objeto na coleção do atualizador. Você pode chamar a propriedade SWbemRefreshableItem.IsSet para determinar se um item em um atualizador é um único item ou uma coleção. Para acessar um único item, use a propriedade SWbemRefreshableItem.Object. Se você não fizer a chamada para SWbemRefreshableItem.Object, o script falhará quando você tentar acessar o objeto. Para acessar uma coleção, use a propriedade SWbemRefreshableItem.ObjectSet.
Tópicos relacionados