Определить количество процессов с одинаковым именем - PullRequest
7 голосов
/ 08 июля 2011

Есть идеи, как написать функцию, которая возвращает количество запущенных экземпляров процесса?

Возможно, что-то вроде этого?

function numInstances([string]$process)
{
    $i = 0
    while(<we can get a new process with name $process>)
    {
        $i++
    }

    return $i
}

Редактировать: начал писать функцию ... Он работает для одного экземпляра, но входит в бесконечный цикл, если запущено более одного экземпляра:

function numInstances([string]$process)
{
$i = 0
$ids = @()
while(((get-process $process) | where {$ids -notcontains $_.ID}) -ne $null)
    {
    $ids += (get-process $process).ID
    $i++
    }

return $i
}

Ответы [ 5 ]

12 голосов
/ 08 июля 2011
function numInstances([string]$process)
{
    @(get-process -ea silentlycontinue $process).count
}

EDIT : добавлено автоматическое продолжение и приведение массива для работы с нулем и одним процессом.

9 голосов
/ 08 июля 2011

Это работает для меня:

function numInstances([string]$process)
{
    @(Get-Process $process -ErrorAction 0).Count
}

# 0
numInstances notepad

# 1
Start-Process notepad
numInstances notepad

# many
Start-Process notepad
numInstances notepad

Выход:

0
1
2

Хотя это и просто, в этом решении есть два важных момента: 1) использовать -ErrorAction 0 (0 - это то же самое, что и SilentlyContinue), чтобы оно работало хорошо, когда нет указанных процессов; 2) использовать оператор массива @(), чтобы он работал при наличии единственного экземпляра процесса.

6 голосов
/ 08 июля 2011

Гораздо проще использовать встроенный объект группы командлетов:

 get-process | Group-Object -Property ProcessName
4 голосов
/ 08 марта 2017

Есть хороший однострочный: (ps).count

0 голосов
/ 29 июля 2018

(Get-Process | Where-Object {$ _. Name -eq 'Chrome'}). Count

Это вернет вам количество запущенных процессов с одинаковыми именами.Вы можете добавить фильтры для дальнейшего форматирования ваших данных.

...