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.