WMI가 없는 PowerShell을 사용하여 총 물리적 메모리 크기를 얻으려면 어떻게 해야 합니까?
PowerShell을 사용하여 물리적 메모리 크기를 구하려고 하지만 get-wmioobject는 사용하지 않습니다.
저는 물리적 메모리 크기를 얻기 위해 다음 PS cmdlet을 사용해 왔지만 새로운 폴링마다 값이 바뀝니다.
(get-counter -counter "\Memory\Available Bytes").CounterSamples[0].CookedValue +
(get-counter -counter "\Memory\Committed Bytes").CounterSamples[0].CookedValue
일반적으로 8605425664 바이트 정도의 값을 제공합니다.
또한 반환된 값으로 이 카운터를 추가하여 얻는 값을 테스트하고 있습니다.
(get-wmiobject -class "win32_physicalmemory" -namespace "root\CIMV2").Capacity
값: 8589934592바이트
따라서 카운터에서 계산된 총 물리적 메모리가 변경될 뿐만 아니라 WMI 값과 몇 메가바이트 차이가 납니다.WMI를 사용하지 않고 물리적 메모리 크기를 얻는 방법에 대해 아는 사람?
WMI를 사용하고 싶지 않다면 systeminfo.exe를 제안해 드릴 수 있습니다.하지만, 더 좋은 방법이 있을지도 모릅니다.
(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()
일을 너무 복잡하게 만들지 말자구요...
(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb
앞으로 참고하실 분들을 위해 이 내용을 메모해두려고 합니다.
WMI는 DCOM 프로토콜을 사용하므로 원격 시스템에 필요한 권한이 있어야 하므로 해당 원격 시스템에서만 수동으로 설정할 수 있기 때문에 이를 피하고자 했습니다.
그래서 WMI를 사용하는 것을 피하고 싶었지만, get-counter를 자주 사용하면 원하는 성능 카운터가 없었습니다.
제가 사용한 솔루션은 CIM(Common Information Model)입니다. CIM은 WMI와 달리 기본적으로 DCOM을 사용하지 않습니다.CIM cmdlet은 WMI 개체를 반환하는 대신 PowerShell 개체를 반환합니다.
CIM은 기본적으로 Ws-MAN 프로토콜을 사용하지만 Ws-Man 3.0 이상에 액세스할 수 있는 컴퓨터에서만 작동합니다.따라서 이전 버전의 PowerShell에서는 CIM cmdlet을 발행할 수 없습니다.
총 물리적 메모리 크기를 얻기 위해 사용한 cmdlet은 다음과 같습니다.
get-ciminstance -class "cim_physicalmemory" | % {$_.Capacity}
이렇게 하면 시스템 정보를 사용하는 대신 GB의 기계에 있는 총 물리적 메모리를 얻을 수 있습니다.
Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
이 값을 변수에 전달하여 시스템의 총 물리적 메모리에 대한 총 출력을 얻을 수 있습니다.
$totalmemory = Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
$totalmemory
더 늦은 날부터 이곳에 오는 사람들과 하나의 실용적인 해결책:
(Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum
이렇게 하면 총 바이트 합계가 됩니다.
$bytes = (Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum
$kb = $bytes / 1024
$mb = $bytes / 1024 / 1024
$gb = $bytes / 1024 / 1024 / 1024
윈도우 서버 2008(윈버 6.0)까지 테스트했는데 이 명령어가 작동하는 것 같습니다.
다른 WMI 클래스의 총 금액은 다음과 같습니다.
$cs = get-wmiobject -class "Win32_ComputerSystem"
$Mem = [math]::Ceiling($cs.TotalPhysicalMemory / 1024 / 1024 / 1024)
도움이 되길 바랍니다.
최선의 해결책은 아니겠지만, 제게는 효과가 있었습니다.
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$VBObject=[Microsoft.VisualBasic.Devices.ComputerInfo]::new()
$SystemMemory=$VBObject.TotalPhysicalMemory
아래는 전체 물리적 메모리를 보여줍니다.
gwmi Win32_OperatingSystem | Measure-Object -Property TotalVisibleMemorySize -Sum | % {[Math]::Round($_.sum/1024/1024)}
으로.Get-CimInstance는 수동으로 추가해야 하는 각 RAM 스틱의 개별 크기를 제공합니다.그래서 더 좋습니다.Get-WMIObject가능한 경우:
(Get-WMIObject Win32_OperatingSystem).TotalVisibleMemorySize # in KB
38326300
(Get-WMIObject Win32_OperatingSystem).TotalVisibleMemorySize / 1MB # in GB
31.8008079528809
이것은 제가 만든 것은 아니지만 이것을 발견했고 사람이 읽을 수 있는 형태로 데이터를 아름답게 보여줍니다.
[Cmdletbinding()]
Param(
[string]$Computername = "."
)
cls
$PysicalMemory = Get-WmiObject -class "win32_physicalmemory" -namespace "root\CIMV2" -ComputerName $Computername
Write-Host "Memore Modules:" -ForegroundColor Green
$PysicalMemory | Format-Table Tag,BankLabel,@{n="Capacity(GB)";e={$_.Capacity/1GB}},Manufacturer,PartNumber,Speed -AutoSize
Write-Host "Total Memory:" -ForegroundColor Green
Write-Host "$((($PysicalMemory).Capacity | Measure-Object -Sum).Sum/1GB)GB"
$TotalSlots = ((Get-WmiObject -Class "win32_PhysicalMemoryArray" -namespace "root\CIMV2" -ComputerName $Computername).MemoryDevices | Measure-Object -Sum).Sum
Write-Host "`nTotal Memory Slots:" -ForegroundColor Green
Write-Host $TotalSlots
$UsedSlots = (($PysicalMemory) | Measure-Object).Count
Write-Host "`nUsed Memory Slots:" -ForegroundColor Green
Write-Host $UsedSlots
If($UsedSlots -eq $TotalSlots)
{
Write-Host "All memory slots are in use. No available slots!" -ForegroundColor Yellow
}
Get-ComputerInfo | select -Property OsTotalVisibleMemorySize
테스트되고 win32_computerSystem(cim_computerSystem)과 win32_operatingSystem(cim_operatingSystem)은 모두 가상 시스템을 원격으로 쿼리할 때 작동합니다.다른 옵션은 가짜 결과를 제공합니다.
여기에 재미있는 답이 많이 있습니다.검토해보니 다음과 같은 것이 생각났습니다.
(Get-CimInstance -ClassName "cim_physicalmemory").Capacity/1gb
원칙적으로, 그것은 필요한 스칼라 값, 즉 1kb, 1mb, 1pb 또는 1eb를 선택하는 것만으로 변환될 수 있습니다.
언급URL : https://stackoverflow.com/questions/17681234/how-do-i-get-total-physical-memory-size-using-powershell-without-wmi
'programing' 카테고리의 다른 글
| angularJS에서 내부 콜백에서 $scope 업데이트 (0) | 2023.09.20 |
|---|---|
| XMLHttpRequest 개체를 재사용하시겠습니까? 아니면 새 개체를 만드시겠습니까? (0) | 2023.09.20 |
| AngularJS : 서비스 $broadcast 및 $watch가 수신 컨트롤러에서 트리거되지 않음 (0) | 2023.09.20 |
| 오라클에서 varchar2 필드를 더 짧게 만드는 방법은? (0) | 2023.09.20 |
| 사용자 정의 wp_query에서 워드프레스 페이지(next_posts_link)가 표시되지 않음 (0) | 2023.09.20 |