You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中Get-Counter获取进程CPU使用率数值异常咨询

PowerShell Get-Counter CPU使用率数值不符问题解析与解决方案

一、数值差异的原因

Get-Counter返回的\Process(*)\% Processor Time计数器,统计的是进程在所有逻辑处理器上占用的总CPU时间占比,数值范围是0到逻辑核心数×100。你有16个逻辑核心,所以该计数器的最大值为1600。

而任务管理器显示的单个进程CPU使用率,是该进程占用的CPU时间占系统总可用CPU资源的比例,也就是Get-Counter返回值 ÷ 逻辑核心数。你拿到的90除以16约为5.6%,和任务管理器的10%接近(采样时间点不同会导致数值波动),本质是两者的统计维度不同。

二、正确解读与转换方法

要将Get-Counter的数值转换为和任务管理器一致的结果,只需除以逻辑核心数:

# 获取系统逻辑核心数
$coreCount = (Get-WmiObject Win32_ComputerSystem).NumberOfLogicalProcessors
# 目标进程名称,替换为你需要监控的进程名
$targetProcess = "yourProcessName"
# 获取CPU计数器原始值
$cpuCounter = Get-Counter "\Process($targetProcess)\% Processor Time"
$rawValue = $cpuCounter.CounterSamples.CookedValue
# 转换为任务管理器风格的使用率
$convertedValue = $rawValue / $coreCount
Write-Host "进程CPU使用率(任务管理器风格): $($convertedValue.ToString("F2"))%"

三、替代CPU使用率记录方案

如果觉得Get-Counter的逻辑过于繁琐,可使用以下两种更直观的方案:

1. 使用Get-Process计算实时使用率

Get-Process的CPU属性是进程累计占用的CPU秒数,通过两次采样的差值计算实时使用率:

$processName = "yourProcessName"
$coreCount = (Get-WmiObject Win32_ComputerSystem).NumberOfLogicalProcessors

# 第一次采样
$firstSample = Get-Process $processName
Start-Sleep -Seconds 1
# 第二次采样
$secondSample = Get-Process $processName

# 计算实时使用率
$cpuUsage = (($secondSample.CPU - $firstSample.CPU) / $coreCount / 1) * 100
Write-Host "实时CPU使用率: $($cpuUsage.ToString("F2"))%"

2. 使用CIM直接获取标准化数值

通过Win32_PerfFormattedData_PerfProc_Process类可以直接拿到和任务管理器逻辑一致的使用率:

$processName = "yourProcessName"
# 注意:进程名如果有空格,需要用原始格式(比如"chrome#1"这类),可通过Get-CimInstance Win32_PerfFormattedData_PerfProc_Process查看
$processData = Get-CimInstance Win32_PerfFormattedData_PerfProc_Process -Filter "Name='$processName'"
Write-Host "CPU使用率: $($processData.PercentProcessorTime)%"

内容的提问来源于stack exchange,提问作者Golden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:55:35