Gestion des processus avec les applets de commande Process
Cet exemple s’applique uniquement à Windows PowerShell 5.1.
Les applets de commande Process de PowerShell permettent de gérer des processus locaux et distants dans PowerShell.
Obtention des processus
Pour obtenir les processus en cours d’exécution sur l’ordinateur local, exécutez l’applet de commande Get-Process
sans paramètres.
Vous pouvez obtenir des processus particuliers en spécifiant leur nom ou leur ID. La commande suivante obtient le processus Idle :
Get-Process -id 0
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 0 0 16 0 0 Idle
S’il est normal que des applets de commande ne retournent aucune donnée dans certaines situations, lorsque vous spécifiez un processus par son ProcessId, Get-Process
génère une erreur si elle ne trouve aucune correspondance, car l’objectif consiste généralement à récupérer un processus en cours d’exécution connu. Si aucun processus ne correspond à cet ID, il est probable que celui-ci est incorrect ou que son exécution est déjà terminée :
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 basé sur le nom de processus. Le paramètre Name peut prendre plusieurs noms dans une liste de valeurs séparées par des virgules. Comme il prend en charge l’utilisation de caractères génériques, vous pouvez entrer des modèles de noms.
Par exemple, la commande suivante obtient les processus dont les noms commencent par « 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
Étant donné que la classe System.Diagnostics.Process de .NET constitue la base des processus 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 exécutable n’inclut jamais .exe
à la fin du nom.
L’applet de commande Get-Process
accepte également plusieurs valeurs pour le paramètre 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
Vous pouvez utiliser le paramètre ComputerName de l’applet de commande Get-Process
pour obtenir des processus 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.
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 de processus retournés par l’applet de commande Get-Process
. La commande suivante utilise l’applet de commande Format-Table
pour afficher les propriétés ID, ProcessName et MachineName (ComputerName) des objets de processus.
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 standard de 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
Arrêt des processus
PowerShell offre une flexibilité certaine pour l’affichage des processus, mais qu’en est-il de l’arrêt d’un processus ?
L’applet de commande Stop-Process
prend un nom ou un ID pour spécifier un processus à arrêter. Votre capacité à arrêter des processus dépend des autorisations dont vous disposez. Certains processus ne peuvent pas être arrêtés. Par exemple, si vous essayez d’arrêter le processus inactif, vous obtenez une erreur :
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 l’affichage d’une invite avec le paramètre Confirm. Ce paramètre est particulièrement utile si vous utilisez un caractère générique quand vous spécifiez le nom du processus, car vous pouvez accidentellement établir une correspondance avec des processus que vous ne souhaitez pas arrêter :
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
Une manipulation de processus complexes est possible en utilisant certaines applets de commande de filtrage d’objet. Étant donné qu’un objet Process a une propriété Responding dont la valeur est true quand 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, supposons qu’une application de zone de notification secondaire s’exécute automatiquement quand des utilisateurs démarrent une autre application. Il est possible que vous constatiez que cela ne fonctionne pas correctement dans les sessions des services Terminal Server, mais que vous souhaitiez conserver cette approche dans les sessions qui s’exécutent sur la console de l’ordinateur physique. Les sessions connectées au bureau de l’ordinateur physique ayant toujours un ID de session 0, vous pouvez arrêter toutes les instances du processus figurant dans d’autres sessions à l’aide de l’applet de commande 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 d’arrêt de processus 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 Serveur01, tapez :
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Arrêt de toutes les autres sessions PowerShell
Il est parfois utile de pouvoir arrêter toutes les sessions PowerShell en cours d’exécution autres que la session active. Si une session utilise trop de ressources ou n’est pas accessible (par exemple, si elle s’exécute à distance ou dans une autre session de bureau), il se peut que vous ne puissiez pas l’arrêter directement. Toutefois, si vous essayez d’arrêter toutes les sessions en cours d’exécution, il se peut que la session active s’arrête à la place.
Chaque session PowerShell a un PID de variable d’environnement qui contient l’ID du processus Windows PowerShell. Vous pouvez contrôler la valeur de $PID par rapport à l’ID de chaque session, et arrêter uniquement les sessions Windows PowerShell dont l’ID diffère. 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) :
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
PowerShell comprend également des applets de commande permettant de démarrer (ou redémarrer) un processus, de déboguer un processus, et d’attendre qu’un processus s’achève avant d’exécuter une commande. Pour plus d’informations sur ces applets de commande, voir la rubrique d’aide sur chacune d’elles.