J'essaie d'obtenir la taille de la mémoire physique à l'aide de PowerShell, mais sans get-wmiobject.
J'utilise l'applet de commande PS suivante pour obtenir la taille de la mémoire physique, mais la valeur change à chaque nouveau sondage.
(get-counter -counter "\Memory\Available Bytes").CounterSamples[0].CookedValue +
(get-counter -counter "\Memory\Committed Bytes").CounterSamples[0].CookedValue
En général, cela me donne une valeur autour de: 8605425664 octets
Je teste également la valeur que je reçois en ajoutant ces compteurs avec la valeur renvoyée par
(get-wmiobject -class "win32_physicalmemory" -namespace "root\CIMV2").Capacity
Cela me donne la valeur: 8589934592 octets
Ainsi, non seulement la mémoire physique totale calculée à partir des compteurs change, mais sa valeur diffère de la valeur WMI de quelques mégaoctets. Quelqu'un a une idée sur la façon d'obtenir la taille de la mémoire physique sans utiliser WMI?
Si vous ne voulez pas utiliser WMI, je peux suggérer systeminfo.exe. Mais, il y a peut-être une meilleure façon de le faire.
(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()
J'aimerais en prendre note pour les personnes qui font référence à l'avenir.
Je voulais éviter WMI car il utilise un protocole DCOM, exigeant que l'ordinateur distant dispose des autorisations nécessaires, qui ne peuvent être configurées que manuellement sur cet ordinateur distant.
Donc, je voulais éviter d'utiliser WMI, mais souvent, get-counter n'avait pas le compteur de performance que je voulais.
La solution que j'ai utilisée était le modèle d'information commun (CIM). Contrairement à WMI, CIM n'utilise pas DCOM par défaut. Au lieu de renvoyer des objets WMI, les applets de commande CIM renvoient des objets PowerShell.
CIM utilise le protocole Ws-MAN par défaut, mais il ne fonctionne qu'avec les ordinateurs ayant accès à Ws-Man 3.0 ou version ultérieure. Ainsi, les versions antérieures de PowerShell ne pourraient pas émettre de cmdlets CIM.
La cmdlet que j'ai finalement utilisée pour obtenir la taille totale de la mémoire physique était la suivante:
get-ciminstance -class "cim_physicalmemory" | % {$_.Capacity}
J'aimerais dire qu'au lieu d'aller avec systeminfo, cela aiderait à obtenir la mémoire physique totale en Go de la machine
Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
vous pouvez passer cette valeur à la variable et obtenir la sortie brute de la mémoire physique totale de la machine
$totalmemory = Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
$totalmemory
Peut-être pas la meilleure solution, mais cela a fonctionné pour moi.
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$VBObject=[Microsoft.VisualBasic.Devices.ComputerInfo]::new()
$SystemMemory=$VBObject.TotalPhysicalMemory
Ne compliquons pas les choses ...:
(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb
Cela vous donne le montant total de une autre classe WMI :
$cs = get-wmiobject -class "Win32_ComputerSystem"
$Mem = [math]::Ceiling($cs.TotalPhysicalMemory / 1024 / 1024 / 1024)
J'espère que cela t'aides.
Pour ceux qui viennent ici plus tard et une solution qui fonctionne:
(Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum
cela donnera la somme totale des octets.
$bytes = (Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum
$kb = $bytes / 1024
$mb = $bytes / 1024 / 1024
$gb = $bytes / 1024 / 1024 / 1024
Je l'ai testé jusqu'à Windows Server 2008 (Winver 6.0) même là, cette commande semble fonctionner