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

Obtendo processos (Get-Process)

Para obter os processos em execução no computador local, execute Get-Process sem parâmetros.

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

PS> 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 quando não encontra correspondências, porque normalmente a intenção é recuperar um processo em execução conhecido. Se não houver um processo com essa Id, é provável que o Id esteja incorreta ou que o processo já tenha sido encerrado:

PS> 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 cmdlet Get-Process para especificar um subconjunto de processos baseado no nome do processo. O parâmetro Name pode ter vários nomes em uma lista separada por vírgula e oferece suporte ao uso de curingas, para que você possa digitar padrões de nome.

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

PS> 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 System.Diagnostics.Process do .NET é a fundação para os processos do Windows PowerShell, ele segue algumas das convenções utilizadas por System.Diagnostics.Process. Uma dessas convenções é que o nome do processo para um executável nunca incluirá o ".exe" no final do nome do executável.

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

PS> 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.

PS> 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 de computadores não são evidentes nesta exibição, mas eles são armazenados na propriedade MachineName dos objetos de processo que Get-Process retorna. O comando a seguir usa o cmdlet Format-Table para exibir as propriedades ID de processo, ProcessName e MachineName (ComputerName) dos objetos de processo.

PS> 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 de Get-Process. O caractere de crase (`) (ASCII 96) é o caractere de continuação do Windows PowerShell.

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

Parando processos (Stop-Process)

O Windows PowerShell oferece flexibilidade na listagem de processos, mas e quanto à sua interrupção?

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

PS> 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

Também é possível forçar a solicitação com o parâmetro Confirm. Ele é particularmente útil se você utilizar um caractere curinga quando especificar o nome do processo, uma vez que você pode acidentalmente encontrar alguns processos com nomes parecidos e que não devem ser parados:

PS> 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 complexa de processos é possível com o uso de alguns cmdlets de filtragem de objetos. Como o objeto Process possui uma propriedade Responding que é verdadeira quando ele não está mais respondendo, você pode parar todos os aplicativos não responsivos com o seguinte comando:

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

É possível usar a mesma abordagem em outras situações. Por exemplo, suponha que um aplicativo secundário da área de notificação seja executado automaticamente quando os usuários iniciam outro aplicativo. Talvez você descubra que isso não funciona corretamente em sessões dos Serviços de Terminal, mas ainda assim deseje mantê-lo em sessões executadas no console do computador físico. As sessões conectadas à área de trabalho do computador físico têm uma ID de sessão igual a 0, de modo que 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 cmdlet Stop-Process não tem um parâmetro ComputerName. Portanto, para executar um comando de processo de parada em um computador remoto, use o cmdlet Invoke-Command. 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 Windows PowerShell

Ocasionalmente, a capacidade de parar todas as sessões do Windows PowerShell em execução diferentes da sessão atual pode ser útil. Caso uma sessão esteja usando muitos recursos ou esteja inacessível (ela pode ter execução remota ou estar em outra sessão da área de trabalho), talvez você não seja capaz de pará-la diretamente. Se você tentar parar todas as sessões em execução, no entanto, a sessão atual poderá ser interrompida.

Cada sessão do Windows PowerShell possui um PID de variável de ambiente que contém a Id do processo do Windows PowerShell. Você pode verificar a $PID em relação à Id de cada sessão e interromper somente as sessões do Windows PowerShell que possuam uma Id diferente. O comando de pipeline a seguir faz isso e retorna a lista das sessões encerradas (por causa do uso do parâmetro PassThru):

PS> 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 Windows PowerShell também apresenta cmdlets para iniciar (ou reiniciar) um processo, depurá-lo e aguardar a conclusão de um processo antes de executar um comando. Para obter informações sobre esses cmdlets, consulte o tópico da Ajuda de cada cmdlet.

See Also




Sumário