如何从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
相关产品推荐
相关产品推荐

