当多个实例时,Powershell通过PID获取进程名称(带#)

时间:2015-10-29 01:48:19

标签: powershell

我正在尝试使用Get-Counter '\process(APPNAME)\% processor time但是对于许多进程APPNAME重复。我可以在APPNAME#1中使用APPNAME#2APPNAME#3Get-Counter '\process(APPNAME#2)\% processor time。但是,我无法找到如何从PID中获取“完整”的appname(即其中包含#的那个),这可能吗?

第二个答案here似乎可以解释它,但我并不完全明白他们在做什么。

2 个答案:

答案 0 :(得分:1)

很难准确地帮助您,因为计数器对文化非常敏感,而且我懒得启动我的美国虚拟机。

您可以使用以下方法找到流程的PID:

Timestamp                 CounterSamples                                                                                      
---------                 --------------                                                                                      
29/10/2015 08:31:55       \\ComputerName\processus(chrome#4)\id de processus :                                                   
                          3296   

对我而言,它给出了:

 Get-Counter '\\ComputerName\process(chrome#4)\process id'

对于英国或美国,我会尝试:

(Get-Counter '\processus(*)\id de processus').CounterSamples | % {[regex]$a = "^.*\($([regex]::Escape($_.InstanceName))(.*)\).*$";[PSCustomObject]@{InstanceName=$_.InstanceName;PID=$_.CookedValue;InstanceId=$a.Matches($($_.Path)).groups[1].value}}

这一行(你必须适应你的文化)给出一个带有PID和计数器实例Id的进程列表。

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

编辑:

所以这是一个输入PID的解决方案:

{{1}}

答案 1 :(得分:0)

你需要这样的东西,选择你需要的东西,然后把它们连在一起。

Get-Process | Select ProcessName,Id | % {$_.ProcessName + " " + $_.Id}