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.

Voir aussi