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




Table des matières