Usuário com melhor resposta
Um problema e uma duvida em scritp de coleta de informação de memoria.

Pergunta
-
Ba galera
Estou passando por um problema com o codigo abaixo tche, quando o mesmo é executado o resultado não é apresentado de forma redonda, por exemplo maquinas com 1 G de memoria, estão apresentando a informação neste formato 1,006 MB, 1,0013 MB, 1.024 MB ( hora com virgua e hora com ponto), e em alguns casos 996 MB, 998MB, 999MB, este é o problema caso exista uma solução para este problema, a dulvida é, como posso fazer tche para que quando ele encontre o valor corretor e formatado da memoria ele apresente no msg (equipamento com XXG ou XX MB de memoria fisica), sendo que o XX é o valor da memoria de forma correta tche.
Valeu galera, segue o codigo.
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") Set colItems = objWMIService.ExecQuery("Select * FROM Win32_PerfFormattedData_PerfOS_Memory ") For Each objItem In colItems strLinePercentCommittedBytesInUse = strLinePercentCommittedBytesInUse & " " & objItem.PercentCommittedBytesInUse Next ' Total de memoria --------------------------------------- strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colSettings = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each objComputer in colSettings iTotalMemoria=objComputer.TotalPhysicalMemory Next 'Free Memory strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colSettings = objWMIService.ExecQuery _ ("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colSettings iTotalFree = objOperatingSystem.FreePhysicalMemory Next strsys = "TotalPhysicalMemory" Set CompSys = objwmiservice.execquery("SELECT " & strsys & " FROM Win32_ComputerSystem") For Each objItem In CompSys MemoriaTotal = FormatValue(objitem.TotalPhysicalMemory) Next strsysfree = "FreePhysicalMemory" Set CompSysfree = objwmiservice.execquery("SELECT " & strsysfree & " FROM Win32_OperatingSystem") For Each objItemfree In CompSysfree MemoriaLivre = round(objitemfree.FreePhysicalMemory / 1024 / 1024,2)& " GB" Next Msg = "Demostrativo de Memoria" & Chr(10) Msg = Msg & "*****************************************************" & Chr(10) Msg = Msg & "Memoria Total:" & vbTab &MemoriaTotal & Chr(10) Msg = Msg & "Memoria livre:" & vbTab &MemoriaLivre & Chr(10) Msg = Msg & "Percentual em uso:" & vbTab &strLinePercentCommittedBytesInUse & " %" & Chr(10) msgbox msg,60,"Área de TI - Suporte RTV" Set WshShell = WScript.CreateObject("WScript.Shell") Function FormatValue(objFormatMem) If objFormatMem <> 0 Then If CDbl(objFormatMem) < 1024 ^ 3 Then If CDbl(objFormatMem) < 1024 ^ 2 Then Mem_Divisor = 1024 Mem_Unit = " KB" Else Mem_Divisor = 1024 ^ 2 Mem_Unit = " MB" End If Else Mem_Divisor = 1024 ^ 3 Mem_Unit = " GB" End If If Mem_Divisor = 1024 Then FormatValue = FormatNumber(objFormatMem / Mem_Divisor, 0) & Mem_Unit ElseIf Mem_Divisor = 1024 ^ 2 Then FormatValue = FormatNumber(objFormatMem / Mem_Divisor, 0) & Mem_Unit Else FormatValue = FormatNumber(objFormatMem / Mem_Divisor, 0) & Mem_Unit End If Else FormatValue = "-" End If End Function
- Tipo Alterado Fábio JrModerator quarta-feira, 16 de maio de 2012 02:02 É pergunta
Respostas
-
Marcelo,
Substitua a função FormatValue por esta:
Function FormatValue(objFormatMem) If objFormatMem <> 0 Then x = 2 ^ int( round(Log(objFormatMem/1000000)/log(2)) ) IF x< 1000 then FormatValue = x & " MB" else FormatValue = x / 1024 & " GB" end if Else FormatValue = "-" End If End Function
Este calculo de arrendondamento foi eu quem criou, eu testei pouco esta função.
Fábio de Paula Junior
- Editado Fábio JrModerator terça-feira, 15 de maio de 2012 13:59 Obs.
- Sugerido como Resposta Fábio JrModerator quarta-feira, 16 de maio de 2012 02:14
- Marcado como Resposta Wagner dos Santos VasconcellosModerator quinta-feira, 17 de maio de 2012 10:40
- Não Marcado como Resposta Marcelo TI quinta-feira, 17 de maio de 2012 23:01
- Marcado como Resposta Marcelo TI quinta-feira, 17 de maio de 2012 23:01
Todas as Respostas
-
Marcelo,
Substitua a função FormatValue por esta:
Function FormatValue(objFormatMem) If objFormatMem <> 0 Then x = 2 ^ int( round(Log(objFormatMem/1000000)/log(2)) ) IF x< 1000 then FormatValue = x & " MB" else FormatValue = x / 1024 & " GB" end if Else FormatValue = "-" End If End Function
Este calculo de arrendondamento foi eu quem criou, eu testei pouco esta função.
Fábio de Paula Junior
- Editado Fábio JrModerator terça-feira, 15 de maio de 2012 13:59 Obs.
- Sugerido como Resposta Fábio JrModerator quarta-feira, 16 de maio de 2012 02:14
- Marcado como Resposta Wagner dos Santos VasconcellosModerator quinta-feira, 17 de maio de 2012 10:40
- Não Marcado como Resposta Marcelo TI quinta-feira, 17 de maio de 2012 23:01
- Marcado como Resposta Marcelo TI quinta-feira, 17 de maio de 2012 23:01
-