Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell获取具有进程id的特定进程计数器_Powershell_Process_Counter - Fatal编程技术网

Powershell获取具有进程id的特定进程计数器

Powershell获取具有进程id的特定进程计数器,powershell,process,counter,Powershell,Process,Counter,我想为我有进程id的进程获取特定计数器。然而,我想不出一种方法来使用where对象来匹配计数器的进程。 像 因此,使用进程id来检索名称并获取工作集(或类似的内容)。可以直接使用get process commandlet获取一些性能信息,而无需解析实例id 对于内存工作集,只需使用where object,过滤您想要的进程id的输出,然后选择您感兴趣的参数: get-process | where-object{ $_.id -eq 456 } | select name,workingset

我想为我有进程id的进程获取特定计数器。然而,我想不出一种方法来使用where对象来匹配计数器的进程。 像

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

可以直接使用get process commandlet获取一些性能信息,而无需解析实例id

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

get-process | where-object{ $_.id -eq 456 } | select name,workingset

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

$id = # your process id
$proc = (Get-Process -Id $id).Name
Get-Counter -Counter "\Process($proc)\% Processor Time"

对于具有相同进程名称的多个实例的进程,要获得正确的性能计数器路径似乎有点费解:

$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

如果您想要一个还包括具有多个实例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;

在Windows 2003中工作非常好,因为工作集-私有不存在!您可以将其包装在foreach调用中,通过管道输入您的进程ID,并获取每个进程的信息。如果您需要一个示例,请告诉我。@KenJ我添加的答案适用于一个流程的多个实例。第一个筛选器可以是:
Get Counter'\process($InstanceName*)\ID process'..
。这也会稍微快一点,特别是对于许多进程。在实例名称是彼此前缀的奇数情况下,仍然需要二次匹配(尽管可以简化)。
$id = YourProcessIdHere
(gwmi -class Win32_PerfRawData_PerfProc_Process -Namespace "root\CIMV2" | ? {$_.IdProcess -eq $id}).Name;