如何使用PowerShell查找CPU和RAM的使用情况?

我试图让PowerShell给我的内存和CPU使用率,但我无法弄清楚什么样的WMI类使用。 我的电脑有两个处理器,所以有两个处理器的信息是有用的。

Get-WmiObject win32_processor | select LoadPercentage |fl 

这给你CPU负载。

(如EBGreenbuild议)编辑:

 Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average | Select Average 

您也可以使用Get-Counter cmdlet(PowerShell 2.0):

 Get-Counter '\Memory\Available MBytes' Get-Counter '\Processor(_Total)\% Processor Time' 

要获取内存计数器的列表:

 Get-Counter -ListSet *memory* | Select-Object -ExpandProperty Counter 

我使用以下PowerShell代码片段获取本地或远程系统的CPU使用情况:

 Get-Counter -ComputerName localhost '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples | Select-Object -Property instancename, cookedvalue| Sort-Object -Property cookedvalue -Descending| Select-Object -First 20| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100).toString('P')}} -AutoSize 

相同的脚本,但使用续行格式化:

 Get-Counter -ComputerName localhost '\Process(*)\% Processor Time' ` | Select-Object -ExpandProperty countersamples ` | Select-Object -Property instancename, cookedvalue ` | Sort-Object -Property cookedvalue -Descending | Select-Object -First 20 ` | ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100).toString('P')}} -AutoSize 

在4核心系统上,它将返回如下结果:

 InstanceName CPU ------------ --- _total 399.61 % idle 314.75 % system 26.23 % services 24.69 % setpoint 15.43 % dwm 3.09 % policy.client.invoker 3.09 % imobilityservice 1.54 % mcshield 1.54 % hipsvc 1.54 % svchost 1.54 % stacsv64 1.54 % wmiprvse 1.54 % chrome 1.54 % dbgsvc 1.54 % sqlservr 0.00 % wlidsvc 0.00 % iastordatamgrsvc 0.00 % intelmefwservice 0.00 % lms 0.00 % 

ComputerName参数将接受服务器列表,所以通过一些额外的格式化,您可以在每台服务器上生成一个顶级进程的列表。 就像是:

 $psstats = Get-Counter -ComputerName utdev1,utdev2,utdev3 '\Process(*)\% Processor Time' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty countersamples | %{New-Object PSObject -Property @{ComputerName=$_.Path.Split('\')[2];Process=$_.instancename;CPUPct=("{0,4:N0}%" -f $_.Cookedvalue);CookedValue=$_.CookedValue}} | ?{$_.CookedValue -gt 0}| Sort-Object @{E='ComputerName'; A=$true },@{E='CookedValue'; D=$true },@{E='Process'; A=$true } $psstats | ft @{E={"{0,25}" -f $_.Process};L="ProcessName"},CPUPct -AutoSize -GroupBy ComputerName -HideTableHeaders 

这将导致$ psstatsvariables与原始数据和以下显示:

  ComputerName: utdev1 _total 397% idle 358% 3mws 28% webcrs 10% ComputerName: utdev2 _total 400% idle 248% cpfs 42% cpfs 36% cpfs 34% svchost 21% services 19% ComputerName: utdev3 _total 200% idle 200% 

要将输出连续输出到文件(这里每隔五秒)并以Unixdate作为文件名保存到CSV文件中:

 while ($true) { [int]$date = get-date -Uformat %s $exportlocation = New-Item -type file -path "c:\$date.csv" Get-Counter -Counter "\Processor(_Total)\% Processor Time" | % {$_} | Out-File $exportlocation start-sleep -s 5 }