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