none
Uso de Memoria e quantidade livre RRS feed

  • Pergunta

  • Ba galera

    Dei uma procurada no forum e nao consegui encontrar e na net também não achei ainda, alguem consegue me ajudar, estou necessitando de um codigo que apresente quando de memoria esta em uso no momento que o script for executado, e quando de memoria livre tem disponivel em valor e em %, gostaria de um resultado desta forma se possivel.

    em uso        livre         %

    1.2Gb          2.8Gb      76%

    valeu galera.

    terça-feira, 28 de fevereiro de 2012 02:05

Respostas

  • Marcelo,

    Vc está pegando os valores corretos só que depois vc está utilizando uma função chamada formatvalue que está formatando de uma forma "errada" para você (está certo pra quem fez a função, acho que ele queria arrendondar).

    Mudei a parte onde ele pega a memória livre, veja que dividi duas vezes por 1024 (para transformar em GB) e utilizo a função Round para mostrar apenas duas casas após a virgula.

    ' seu script ---------------------------------------
    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)
    Next
    
    'Aqui junta tudo
    wscript.echo "Total" & vbtab & "memoria livre" & vbTab & "percentual em uso"
    WScript.Echo MemoriaTotal & vbtab & MemoriaLivre & vbTab &strLinePercentCommittedBytesInUse & "%"
    
    
    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 
    


    Fábio de Paula Junior

    • Sugerido como Resposta Fábio JrModerator quinta-feira, 1 de março de 2012 15:57
    • Marcado como Resposta Marcelo TI sexta-feira, 2 de março de 2012 10:06
    quarta-feira, 29 de fevereiro de 2012 23:40
    Moderador

Todas as Respostas

  • Marcelo,

    No link abaixo tem scripts que lista memória disponivel e total de memória, para a porcentagem basta vc calcular.

    Tente juntar tudo e poste aqui o resultado.

    WMI Tasks: Computer Hardware

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa394587(v=vs.85).aspx


    Fábio de Paula Junior

    terça-feira, 28 de fevereiro de 2012 13:32
    Moderador
  • Fabio

    Obrigado pelo link tche, ja consegui montar o memoria em uso, com a classe win32_perfformattedData_PerfOS_Meory, e ficou assim.

    Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
    
    Set colItems = GetObject("WinMgmts:root/cimv2").ExecQuery("Select * FROM Win32_PerfFormattedData_PerfOS_Memory ") 
    For Each objItem In colItems    
     strLinePercentCommittedBytesInUse = strLinePercentCommittedBytesInUse & " " & objItem.PercentCommittedBytesInUse 
    Next 
    
    WScript.Echo strLinePercentCommittedBytesInUse & "%"
    WScript.Quit 

    Ainda não consegui fazer ele mostrar os items com estas informações, vc tem alguma ideia para compartilhar.

    em uso        livre 

    1.2Gb          2.8Gb 

    quarta-feira, 29 de fevereiro de 2012 22:36
  • Marcelo,

    Vc não usou nada daquele link que passei? Lá tinha 90%.

    Juntei mais uma parte, tenta juntar o restante, se não der certo posta aqui como ficou eu ajudo com o restante.

    ' seu script ---------------------------------------
    Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
    
    Set colItems = GetObject("WinMgmts:root/cimv2").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
    
    
    
    'Aqui junta tudo
    wscript.echo "Total" & vbtab & "percentual em uso"
    WScript.Echo iTotalMemoria & vbtab & strLinePercentCommittedBytesInUse & "%"


    Fábio de Paula Junior

    quarta-feira, 29 de fevereiro de 2012 23:05
    Moderador
  • Ba Fabião ta no forum ainda, obrigado tche.

    Dei uma nova trabalha e ficou assim:

    ' seu script ---------------------------------------
    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 = FormatValue(objitemfree.FreePhysicalMemory)
    Next
    
    'Aqui junta tudo
    wscript.echo "Total" & vbtab & "memoria livre" & vbTab & "percentual em uso"
    WScript.Echo MemoriaTotal & vbtab & MemoriaLivre & vbTab &strLinePercentCommittedBytesInUse & "%"
    
    
    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, 1) & Mem_Unit
    		End If
    	Else
    		FormatValue = "-"
    	End If
    End Function

    Porem estou com um problema, a resposta esta assim:

    Total       memoria livre           percentual em uso
    3,9 GB         1 MB                      39%

    só que minha maquina tem 4 G e eu estou usando 2.43 G na memria livre deveria estar entao 1.57 G e nao 1 MB, o que devo usar não é o FreePhysicalMemory ?

    obrigado tche.

    quarta-feira, 29 de fevereiro de 2012 23:26
  • Marcelo,

    Vc está pegando os valores corretos só que depois vc está utilizando uma função chamada formatvalue que está formatando de uma forma "errada" para você (está certo pra quem fez a função, acho que ele queria arrendondar).

    Mudei a parte onde ele pega a memória livre, veja que dividi duas vezes por 1024 (para transformar em GB) e utilizo a função Round para mostrar apenas duas casas após a virgula.

    ' seu script ---------------------------------------
    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)
    Next
    
    'Aqui junta tudo
    wscript.echo "Total" & vbtab & "memoria livre" & vbTab & "percentual em uso"
    WScript.Echo MemoriaTotal & vbtab & MemoriaLivre & vbTab &strLinePercentCommittedBytesInUse & "%"
    
    
    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 
    


    Fábio de Paula Junior

    • Sugerido como Resposta Fábio JrModerator quinta-feira, 1 de março de 2012 15:57
    • Marcado como Resposta Marcelo TI sexta-feira, 2 de março de 2012 10:06
    quarta-feira, 29 de fevereiro de 2012 23:40
    Moderador
  • Mudei também uma linha da função, assim ele deve mostrar 4Gb.

    Fábio de Paula Junior

    quarta-feira, 29 de fevereiro de 2012 23:41
    Moderador
  • Ba Fabio trilegal tche e agora o resultado saiu certinho ele só deixou de escrever na memoria livre o Unit que ele usou ou seja KB, MB ou GB.
    quinta-feira, 1 de março de 2012 15:54
  • É só cancatenar a unidade na própria linha, como vai sempre dividir por /1024/1024 então é sempre GB

    MemoriaLivre = round(objitemfree.FreePhysicalMemory / 1024 / 1024,2) & " GB"


    Fábio de Paula Junior

    quinta-feira, 1 de março de 2012 15:58
    Moderador
  • Ba Fabio obrigado mais um vez, tenha um otimo dia tche.
    sexta-feira, 2 de março de 2012 10:07