none
Um problema e uma duvida em scritp de coleta de informação de memoria. RRS feed

  • 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 

    sábado, 12 de maio de 2012 18:36

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


    terça-feira, 15 de maio de 2012 13:08
    Moderador

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


    terça-feira, 15 de maio de 2012 13:08
    Moderador
  • Ba Fabio

    Muito obrigado, desculpe-me pela demora no retorno é que estou passando por alguns treinamentos tche o tempo ficou reduzido, mais estou de volta tche...

    quinta-feira, 17 de maio de 2012 23:02