Vous pouvez utiliser les applets de commande Process dans Windows PowerShell pour gérer des processus locaux et distants dans Windows PowerShell.
Obtention de processus (Get-Process)
Pour obtenir les processus s'exécutant sur l'ordinateur local, exécutez Get-Process sans paramètres.
Vous pouvez obtenir des processus particuliers en spécifiant leurs noms de processus ou identificateurs de processus. La commande suivante obtient le processus 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
Bien qu'il soit normal pour des applets de commande de ne pas retourner de données dans certaines situations, lorsque vous spécifiez un processus par son ID, Get-Process génère une erreur s'il ne trouve aucune correspondance, car l'intention habituelle est de récupérer un processus en cours d'exécution connu. S'il n'existe aucun processus ayant cet ID, il est probable que l'identificateur ne soit pas correct ou que le processus en question ait déjà été arrêté :
PS> Get-Process -Id 99 Get-Process : No process with process ID 99 was found. At line:1 char:12 + Get-Process <<<< -Id 99
Vous pouvez utiliser le paramètre Name de l'applet de commande Get-Process pour spécifier un sous-ensemble de processus en fonction d'un nom de processus. Le paramètre Name peut prendre différents noms dans une liste séparée par des virgules et prend en charge l'utilisation de caractères génériques, de sorte que vous puissiez taper des modèles de nom.
Par exemple, la commande suivante obtient le processus dont les noms commencent par « 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
Parce que la classe .NET System.Diagnostics.Process sert de base aux processus Windows PowerShell, elle suit certaines des conventions utilisées par System.Diagnostics.Process. L'une de ces conventions est que le nom de processus d'un fichier exécutable n'inclut jamais l'extension « .exe ».
Get-Process accepte également plusieurs valeurs pour le paramètre 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
Vous pouvez utiliser le paramètre ComputerName de Get-Process pour obtenir des processus s'exécutant sur des ordinateurs distants. Par exemple, la commande suivante obtient les processus PowerShell sur l'ordinateur local (représenté par « localhost ») et sur deux ordinateurs distants.
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
Les noms d'ordinateur ne sont pas évidents dans cet affichage, mais ils sont stockés dans la propriété MachineName des objets Process que Get-Process retourne. La commande suivante utilise l'applet de commande Format-Table pour afficher l'identificateur de processus et les propriétés ProcessName et MachineName (ComputerName) des objets Process.
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
Cette commande plus complexe ajoute la propriété MachineName à l'affichage Get-Process standard. Le backtick (`)(ASCII 96) constitue le caractère de continuation de ligne de 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
Arrêt de processus (Stop-Process)
Windows PowerShell vous permet d'obtenir la liste des processus, mais qu'en est-il de l'arrêt d'un processus ?
L'applet de commande Stop-Process accepte un nom ou un identificateur pour spécifier un processus que vous souhaitez arrêter. Votre capacité à arrêter des processus dépend de vos autorisations. Certains processus ne peuvent pas être arrêtés. Par exemple, si vous essayez d'arrêter le processus Idle, un message d'erreur s'affiche :
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
Vous pouvez également forcer une demande de confirmation avec le paramètre Confirm. Ce paramètre est particulièrement utile si vous spécifiez un nom de processus avec un caractère générique, parce que vous pouvez par erreur mettre en correspondance certains processus que vous ne souhaitez pas arrêter :
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
La manipulation de processus complexes est possible en utilisant certaines des applets de commande de filtrage d'objets. Parce qu'un objet Process a une propriété Responding qui a la valeur true (vrai) lorsqu'il ne répond plus, vous pouvez arrêter toutes les applications qui ne répondent pas avec la commande suivante :
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
Vous pouvez utiliser la même approche dans d'autres situations. Par exemple, supposez une application de zone de notification secondaire qui s'exécute automatiquement lorsque les utilisateurs démarrent une autre application. Vous pouvez trouver que son fonctionnement dans des sessions de services Terminal Server n'est pas correct, mais vouloir le conserver dans des sessions exécutées sur la console de l'ordinateur physique. Les sessions connectées au Bureau de l'ordinateur physique ont toujours l'ID de session 0, de sorte que vous pouvez arrêter toutes les instances du processus présentes dans d'autres sessions à l'aide de Where-Object et du processus, SessionId :
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
L'applet de commande Stop-Process n'a pas de paramètre ComputerName. Par conséquent, pour exécuter une commande de processus d'arrêt sur un ordinateur distant, vous devez utiliser l'applet de commande Invoke-Command. Par exemple, pour arrêter le processus PowerShell sur l'ordinateur distant Server01, tapez :
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Arrêt de toutes les autres sessions Windows PowerShell
Il peut parfois être utile de pouvoir arrêter toutes les sessions Windows PowerShell en cours d'exécution autres que la session active. Si une session utilise trop de ressources ou est inaccessible (elle peut s'exécuter à distance ou dans une autre session du Bureau), il est possible que vous ne soyez pas en mesure de l'arrêter directement. Si vous essayez d'arrêter toutes les sessions en cours d'exécution, cela peut aboutir à l'arrêt de la session active.
Chaque session Windows PowerShell a un PID de variable d'environnement qui contient l'identificateur du processus Windows PowerShell. Vous pouvez vérifier $PID par rapport à l'identificateur de chaque session et terminer uniquement les sessions Windows PowerShell dont l'identificateur est différent. La commande de pipeline suivante effectue cette opération et retourne la liste des sessions terminées (en raison de l'utilisation du paramètre 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
Démarrage, débogage, et attente de processus
Windows PowerShell propose également des applets de commande permettant de démarrer (ou redémarrer), déboguer un processus et attendre la fin d'un processus avant d'exécuter une commande. Pour plus d'informations sur ces applets de commande, consultez la rubrique d'aide de chaque applet de commande.
Voir aussi