如何在PowerShell代码末尾以百分比形式显示CPU使用率?
获取svchost进程的CPU使用率百分比
你的原有代码存在两个问题:一是% $_.CPU语法错误(ForEach-Object(别名%)需要用花括号包裹执行逻辑);二是$_.CPU返回的是进程启动以来的累计CPU时间,并非实时使用率百分比。下面提供两种可行的实现方法:
方法一:用Get-Counter获取实时使用率(推荐)
Get-Counter可以直接获取系统计数器的实时CPU使用率数据,结果更准确:
Get-Counter "\Process(svchost*)\% Processor Time" | Select-Object -ExpandProperty CounterSamples | ForEach-Object { [PSCustomObject]@{ 进程名称 = $_.InstanceName CPU使用率百分比 = [math]::Round($_.CookedValue, 2) } }
说明:
\Process(svchost*)\% Processor Time指定获取所有svchost进程的处理器时间占比CookedValue是计数器计算后的实际使用率数值,用[math]::Round保留两位小数- 输出自定义对象,清晰展示每个svchost进程的使用率
方法二:基于Get-Process计算使用率
通过两次获取进程CPU时间的差值,结合时间间隔计算使用率:
# 首次获取进程数据和时间戳 $initialProcesses = Get-Process svchost | Select-Object Id, ProcessName, CPU, @{Name='采集时间'; Expression={Get-Date}} Start-Sleep -Seconds 1 # 等待1秒 # 二次获取并计算使用率 $initialProcesses | ForEach-Object { $latestProcess = Get-Process -Id $_.Id -ErrorAction SilentlyContinue if ($latestProcess) { $timeSpan = (Get-Date) - $_.采集时间 # 计算单核心使用率百分比,需除以CPU核心数 $cpuPercent = [math]::Round(($latestProcess.CPU - $_.CPU) / $timeSpan.TotalSeconds * 100 / $env:NUMBER_OF_PROCESSORS, 2) [PSCustomObject]@{ 进程名称 = $_.ProcessName CPU使用率百分比 = $cpuPercent } } }
说明:
- 通过两次采集的CPU时间差除以时间间隔,得到每秒CPU消耗,再除以核心数得到单核心占比
- 加入错误处理,避免进程在采集间隔内结束导致报错
内容的提问来源于stack exchange,提问作者Inferno
相关产品推荐
相关产品推荐

