% de RAM livre de máquinas remotas

0

Lendo em superusuário / stackoverflow eu não consegui chegar a um script que realmente produza o% -free ram (como visto no gerenciador de tarefas do Windows) de de várias máquinas remotas (por exemplo, servidor1-servidor4). Aqui está o que eu tenho em termos de código, a plataforma deve ser Windows, ou CMD ou PowerShell (ou similar):

1) CMD, não conseguiu obter o% de RAM livre (ou seja, não pôde acessar o ram 'ocupado' para calcular 'busy / total * 100'. fonte ):
wmic /NODE:"servername" /USER:"yourdomain\administrator" OS GET FreePhysicalMemory

2) powershell ( fonte ), não conseguia obter a memória de máquinas remotas (por exemplo, Get-WmiObject da máquina remota):

$system = Get-WmiObject win32_OperatingSystem
$totalPhysicalMem = $system.TotalVisibleMemorySize
$freePhysicalMem = $system.FreePhysicalMemory
$usedPhysicalMem = $totalPhysicalMem - $freePhysicalMem
$usedPhysicalMemPct = [math]::Round(($usedPhysicalMem / $totalPhysicalMem) * 100,1)

qualquer ajuda apreciada

user2305193
fonte
1
Duplicata possível, stackoverflow.com/questions/12250783/… . Além disso, seu código Powershell de exemplo está tentando coletar informações de espaço em disco, o que não está incluído na sua pergunta. Se isso também é um requisito, você deve mencioná-lo. Seria útil se você adicionasse detalhes de como os comandos que você está tentando estão falhando em vez de dizer "não consegui a memória".
root
Eu olhei para esse post, no entanto, tanto quanto eu pesquisei você não pode usar Get-Counter -Counter para o cálculo% seguinte. Eu basicamente copiei e colei o código das fontes (eu esperava que um especialista pudesse me ajudar rapidamente, raciocinando que essa seria uma pergunta comum) - mas comentarei ainda mais a questão.
user2305193

Respostas:

1

Eu criei este script bastante generalizável, que dá uma porcentagem de RAM livre. Para porcentagem de ram usado simplesmente adicione $a=$b-$a.

$a=0
$b=0
$strComputer = "localhost"
$a=Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer | fl *freePhysical* | Out-String
$b=Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer | fl *totalvisiblememory* | Out-String
$a = $a -replace '\D+(\d+)','$1'
$b = $b  -replace '\D+(\d+)','$1'
[math]::Round($a/$b*10000)/100
user2305193
fonte
1

Usando o método de Conectando-se ao WMI remotamente com o PowerShell https://msdn.microsoft.com/pt-br/library/ee309377(v=vs.85).aspx

Eu usei o .NET para formatar números exemplo daqui. https://technet.microsoft.com/pt-br/library/ee692795.aspx

$Servers = @("localhost")

foreach ($Server in $Servers){

$OS = get-wmiobject -Namespace "root\cimv2" -Class Win32_OperatingSystem -Impersonation 3 -computername $Server

foreach ($Item in $OS){
        $RAM = "{0:N6}" -f ($Item.TotalVisibleMemorySize)/1kB
        $FREE = "{0:N6}" -f ($Item.FreePhysicalMemory)/1kB
        $Server + "`t" + "{0:P0}" -f ($FREE/$RAM)
        }
}

EDITAR

Para resolver problemas com formatos numéricos nas versões PS e .net, você pode usar o formato do ponto decimal ou fixo, em vez do número para corrigir. http://www.google.com/adwords

$Servers = @("localhost")

foreach ($Server in $Servers){

$OS = get-wmiobject -Namespace "root\cimv2" -Class Win32_OperatingSystem -Impersonation 3 -computername $Server

foreach ($Item in $OS){
        $RAM = "{0:D6}" -f ($Item.TotalVisibleMemorySize)/1kB
        $FREE = "{0:D6}" -f ($Item.FreePhysicalMemory)/1kB
        $Server + "`t" + "{0:P0}" -f ($FREE/$RAM)
        }
}

OU

$Servers = @("localhost")

foreach ($Server in $Servers){

$OS = get-wmiobject -Namespace "root\cimv2" -Class Win32_OperatingSystem -Impersonation 3 -computername $Server

foreach ($Item in $OS){
        $RAM = "{0:F6}" -f ($Item.TotalVisibleMemorySize)/1kB
        $FREE = "{0:F6}" -f ($Item.FreePhysicalMemory)/1kB
        $Server + "`t" + "{0:P0}" -f ($FREE/$RAM)
        }
}
Antony
fonte
não funcionou fora da caixa para mim: Cannot convert value "20'823'476.000000" to type "System.Int32". Error: "Input string was not in a correct format." At line:8 char:9 + $RAM = "{0:N6}" -f ($Item.TotalVisibleMemorySize)/1kB + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : InvalidCastFromStringToInteger
user2305193
@ user2305193 Eu atualizei a resposta para superar o seu problema.
Antony