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

如何从Get-Counter对象中提取单个CPU使用率数值?

提取指定PID进程的CPU使用率纯数值(整数形式)

问题分析

你的现有代码通过Select-Object创建了自定义属性对象,返回的是带属性结构的结果而非纯数值。要获取纯值,需要直接提取计算后的结果,同时还要确保最终输出为整数形式。

方案1:改进现有代码,提取纯数值并转为整数

直接使用-ExpandProperty参数提取自定义属性的值,再转为整数:

$ProcessPID = "<目标进程PID>"
$ProcessName = (Get-Process -Id $ProcessPID).Name
$CpuCores = (Get-WmiObject Win32_ComputerSystem).NumberOfLogicalProcessors
$Samples = Get-Counter "\Process($ProcessName*)\% Processor Time" | Select-Object -ExpandProperty CounterSamples

# 提取数值并转为整数(保留两位小数可去掉外层[int])
[int][Decimal]::Round(($Samples.CookedValue / $CpuCores), 0)

如果需要保留两位小数(比如6.98),去掉外层的[int]即可:

[Decimal]::Round(($Samples.CookedValue / $CpuCores), 2)

方案2:通过PID直接匹配计数器实例(避免同名进程干扰)

如果存在多个同名进程,\Process($ProcessName*)\% Processor Time会返回多个实例,此时需要精准匹配目标PID对应的实例。可以通过Win32_PerfFormattedData_PerfProc_Process类直接获取,该类的IDProcess属性与PID直接对应:

$ProcessPID = "<目标进程PID>"
$CpuCores = (Get-WmiObject Win32_ComputerSystem).NumberOfLogicalProcessors

# 获取目标进程的CPU使用率原始值,计算后转为整数
$cpuUsage = [int][Decimal]::Round(
    (Get-WmiObject Win32_PerfFormattedData_PerfProc_Process -Filter "IDProcess = $ProcessPID").PercentProcessorTime / $CpuCores,
    0
)

# 输出纯数值
$cpuUsage

关键说明

  • Select-Object -ExpandProperty:直接提取属性的值,而非返回包含该属性的对象。
  • Win32_PerfFormattedData_PerfProc_Process:比Get-Counter更直接关联PID,避免同名进程的实例混淆问题。
  • [Decimal]::Round(..., 0):将计算结果四舍五入为整数,满足整数形式输出的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:33:12