5

我想为我拥有进程 ID 的进程获取特定的计数器。但是我想不出一种方法来使用 where-object 来匹配计数器的过程。像

Where Gc '\process(*)\id process -eq 456 gc '\process($name)\working set'

因此,使用进程 ID 来检索名称并获取工作集(或类似的东西)。

4

4 回答 4

8

为具有相同进程名称的多个实例的进程获取正确的性能计数器路径似乎有点令人费解:

$proc_id=6580
$proc_path=((Get-Counter "\Process(*)\ID Process").CounterSamples | ? {$_.RawValue -eq $proc_id}).Path
Get-Counter ($proc_path -replace "\\id process$","\% Processor Time")

Timestamp                 CounterSamples
---------                 --------------
11/20/2014 5:39:15 PM     \\myhost\process(conhost#2)\% processor time :
                          0
于 2014-11-21T01:44:02.087 回答
6

您可以获取进程名称的计数器,因此首先使用其 Id 获取进程名称,然后将进程名称嵌入计数器中。例如:

$id = # your process id
$proc = (Get-Process -Id $id).Name
Get-Counter -Counter "\Process($proc)\% Processor Time"
于 2012-06-17T07:37:41.087 回答
2

如果您想要一个还包括具有多个实例 ID 的进程的解决方案,您可以使用:

$p = $((Get-Counter '\Process(*)\ID Process' -ErrorAction SilentlyContinue).CounterSamples | % {[regex]$a = "^.*\($([regex]::Escape($_.InstanceName))(.*)\).*$";[PSCustomObject]@{InstanceName=$_.InstanceName;PID=$_.CookedValue;InstanceId=$a.Matches($($_.Path)).groups[1].value}})
# In french, use '\processus(*)\id de processus' for the counter name
$id = # your process id
$p1 = $p | where {$_.PID -eq $id}
Get-Counter -Counter "\Process($($p1.InstanceName+$p1.InstanceId))\% Processor Time"
# In french, use "\Processus($($p1.InstanceName+$p1.InstanceId))\% temps processeur" for the counter name

或者,如果您避免使用 Get-Counter 并等待采样间隔,请尝试使用 WMI:

$id = YourProcessIdHere
(gwmi -class Win32_PerfRawData_PerfProc_Process -Namespace "root\CIMV2" | ? {$_.IdProcess -eq $id}).Name;
于 2015-10-29T11:18:29.587 回答
1

可以使用 Get-Process commandlet 直接获取一些性能信息,而无需解析实例 ID。

对于内存工作集的情况,只需过滤您想要使用的进程 id 的输出where-object,然后选择您感兴趣的参数:

get-process | where-object{ $_.id -eq 456 } | select name,workingset
于 2012-06-17T05:12:07.793 回答