Gerenciando processos com cmdlets Process

Este exemplo só se aplica ao Windows PowerShell 5.1.

Você pode usar os cmdlets Process no PowerShell para gerenciar processos locais e remotos no PowerShell.

Obter processos

Para executar os processos no computador local, execute um Get-Process sem parâmetros.

Você pode obter processos específicos especificando seus nomes de processo ou IDs de processo. O comando a seguir obtém o processo Ocioso:

Get-Process -id 0
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         16     0               0 Idle

Embora seja normal que os cmdlets não retornem dados em algumas situações, quando você especifica um processo por seu ProcessId, Get-Process gera um erro se ele não encontrar correspondências, porque a intenção usual é recuperar um processo em execução conhecido. Se não houver nenhum processo com esse ID, é provável que o ID esteja incorreto ou que o processo de interesse já tenha saído:

Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process  <<<< -Id 99

Você pode usar o parâmetro Name do Get-Process cmdlet para especificar um subconjunto de processos com base no nome do processo. O parâmetro Name pode ter vários nomes em uma lista separada por vírgulas e oferece suporte ao uso de curingas, para que você possa digitar padrões de nome.

Por exemplo, o comando a seguir obtém o processo cujos nomes começam com "ex".

Get-Process -Name ex*
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    234       7     5572      12484   134     2.98   1684 EXCEL
    555      15    34500      12384   134   105.25    728 explorer

Como a classe .NET System.Diagnostics.Process é a base para os processos do PowerShell, ela segue algumas das convenções usadas por System.Diagnostics.Process. Uma dessas convenções é que o nome do processo para um executável nunca inclui o .exe no final do nome executável.

Get-Process também aceita vários valores para o parâmetro Name.

Get-Process -Name exp*,power*
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    540      15    35172      48148   141    88.44    408 explorer
    605       9    30668      29800   155     7.11   3052 powershell

Você pode usar o parâmetro ComputerName de Get-Process para obter processos em computadores remotos. Por exemplo, o comando a seguir obtém os processos do PowerShell no computador local (representado por "localhost") e em dois computadores remotos.

Get-Process -Name PowerShell -ComputerName localhost, Server01, Server02
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    258       8    29772      38636   130            3700 powershell
    398      24    75988      76800   572            5816 powershell
    605       9    30668      29800   155     7.11   3052 powershell

Os nomes dos computadores não são evidentes nesta exibição, mas são armazenados na propriedade MachineName dos objetos de processo que Get-Process retornam. O comando a seguir usa o Format-Table cmdlet para exibir as propriedades ID do processo, ProcessName e MachineName (ComputerName) dos objetos do processo.

Get-Process -Name PowerShell -ComputerName localhost, Server01, Server01 |
    Format-Table -Property ID, ProcessName, MachineName
  Id ProcessName MachineName
  -- ----------- -----------
3700 powershell  Server01
3052 powershell  Server02
5816 powershell  localhost

Este comando mais complexo adiciona a propriedade MachineName à exibição padrão Get-Process .

Get-Process powershell -ComputerName localhost, Server01, Server02 |
    Format-Table -Property Handles,
        @{Label="NPM(K)";Expression={[int]($_.NPM/1024)}},
        @{Label="PM(K)";Expression={[int]($_.PM/1024)}},
        @{Label="WS(K)";Expression={[int]($_.WS/1024)}},
        @{Label="VM(M)";Expression={[int]($_.VM/1MB)}},
        @{Label="CPU(s)";Expression={if ($_.CPU -ne $()){$_.CPU.ToString("N")}}},
        Id, ProcessName, MachineName -auto
Handles  NPM(K)  PM(K) WS(K) VM(M) CPU(s)  Id ProcessName  MachineName
-------  ------  ----- ----- ----- ------  -- -----------  -----------
    258       8  29772 38636   130         3700 powershell Server01
    398      24  75988 76800   572         5816 powershell localhost
    605       9  30668 29800   155 7.11    3052 powershell Server02

Parar processos

O PowerShell oferece flexibilidade para listar processos, mas que tal parar um processo?

O Stop-Process cmdlet usa um Name ou Id para especificar um processo que você deseja parar. Sua capacidade de parar processos depende de suas permissões. Alguns processos não podem ser interrompidos. Por exemplo, se você tentar parar o processo ocioso, você receberá um erro:

Stop-Process -Name Idle
Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error:
 Access is denied
At line:1 char:13
+ Stop-Process  <<<< -Name Idle

Você também pode forçar a solicitação com o parâmetro Confirmar . Este parâmetro é particularmente útil se você usar um curinga ao especificar o nome do processo, porque você pode acidentalmente corresponder a alguns processos que não deseja parar:

Stop-Process -Name t*,e* -Confirm
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "explorer (408)".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):n
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "taskmgr (4072)".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):n

A manipulação de processos complexos é possível usando alguns dos cmdlets de filtragem de objetos. Como um objeto Process tem uma propriedade Responding que é true quando não está mais respondendo, você pode parar todos os aplicativos que não respondem com o seguinte comando:

Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process

Você pode usar a mesma abordagem em outras situações. Por exemplo, suponha que um aplicativo de área de notificação secundária é executado automaticamente quando os usuários iniciam outro aplicativo. Você pode achar que isso não funciona corretamente em sessões de serviços de terminal, mas você ainda deseja mantê-lo em sessões que são executadas no console do computador físico. As sessões conectadas à área de trabalho do computador físico sempre têm uma ID de sessão de 0, portanto, você pode parar todas as instâncias do processo que estão em outras sessões usando Where-Object e o processo, SessionId:

Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process

O Stop-Process cmdlet não tem um parâmetro ComputerName . Portanto, para executar um comando stop process em um computador remoto, você precisa usar o Invoke-Command cmdlet. Por exemplo, para parar o processo do PowerShell no computador remoto Server01, digite:

Invoke-Command -ComputerName Server01 {Stop-Process Powershell}

Parando todas as outras sessões do PowerShell

Ocasionalmente, pode ser útil poder interromper todas as sessões do PowerShell em execução diferentes da sessão atual. Se uma sessão estiver usando muitos recursos ou estiver inacessível (pode estar sendo executada remotamente ou em outra sessão da área de trabalho), talvez não seja possível interrompê-la diretamente. No entanto, se você tentar interromper todas as sessões em execução, a sessão atual poderá ser encerrada.

Cada sessão do PowerShell tem uma variável de ambiente PID que contém a Id do processo do Windows PowerShell. Você pode verificar a $PID em relação à Id de cada sessão e encerrar apenas sessões do Windows PowerShell que tenham uma Id diferente. O seguinte comando pipeline faz isso e retorna a lista de sessões encerradas (devido ao uso do parâmetro PassThru ):

Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} |
    Stop-Process -PassThru
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    334       9    23348      29136   143     1.03    388 powershell
    304       9    23152      29040   143     1.03    632 powershell
    302       9    20916      26804   143     1.03   1116 powershell
    335       9    25656      31412   143     1.09   3452 powershell
    303       9    23156      29044   143     1.05   3608 powershell
    287       9    21044      26928   143     1.02   3672 powershell

Iniciando, depurando e aguardando processos

O PowerShell também vem com cmdlets para iniciar (ou reiniciar), depurar um processo e aguardar a conclusão de um processo antes de executar um comando. Para obter informações sobre esses cmdlets, consulte o tópico de ajuda do cmdlet para cada cmdlet.

Consulte também