Gestione dei processi con i cmdlet process

Questo esempio si applica solo a Windows PowerShell 5.1.

È possibile usare i cmdlet Process in PowerShell per gestire processi locali e remoti in PowerShell.

Recupero di processi

Per ottenere i processi in esecuzione nel computer locale, eseguire un oggetto Get-Process senza parametri.

È possibile recuperare processi specifici specificandone il nome o l'ID. Il comando seguente consente di recuperare il processo 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

Anche se è normale che i cmdlet non restituiscono dati in alcune situazioni, quando si specifica un processo dal relativo ProcessId, Get-Process genera un errore se non trova corrispondenze, perché la finalità consueta consiste nel recuperare un processo in esecuzione noto. Se non è presente alcun processo con tale ID, è probabile che l'ID non sia corretto o che il processo di interesse sia già terminato:

Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process  <<<< -Id 99

È possibile usare il parametro Name del Get-Process cmdlet per specificare un subset di processi in base al nome del processo. Il parametro Name può ottenere più nomi in un elenco con valori delimitati da virgole e supporta l'uso dei caratteri jolly, pertanto è possibile digitare modelli di nomi.

Il comando seguente recupera ad esempio i processi i cui nomi iniziano con "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

Poiché la classe .NET System.Diagnostics.Process è la base per i processi di PowerShell, segue alcune delle convenzioni usate da System.Diagnostics.Process. Una di queste convenzioni è che il nome del processo per un eseguibile non include mai l'oggetto .exe alla fine del nome eseguibile.

Get-Process accetta anche più valori per il parametro 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

È possibile utilizzare il parametro ComputerName di Get-Process per ottenere i processi nei computer remoti. Il comando seguente recupera ad esempio i processi di PowerShell nel computer locale (rappresentato da "localhost") e in due computer remoti.

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

I nomi dei computer non sono evidenti in questa visualizzazione, ma vengono archiviati nella proprietà MachineName degli oggetti processo restituiti Get-Process . Il comando seguente usa il Format-Table cmdlet per visualizzare le proprietà PROCESS ID, ProcessName e MachineName (ComputerName ) degli oggetti 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

Questo comando più complesso aggiunge la proprietà MachineName alla visualizzazione standard 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

Arresto dei processi

PowerShell offre flessibilità per elencare i processi, ma cosa significa arrestare un processo?

Il Stop-Process cmdlet accetta un nome o un ID per specificare un processo che si vuole arrestare. La possibilità di arrestare i processi dipende dalle autorizzazioni di cui si dispone. Alcuni processi non possono essere arrestati. Se ad esempio si prova ad arrestare il processo inattivo, viene visualizzato un errore:

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

È anche possibile forzare la richiesta di conferma con il parametro Confirm. Questo parametro è particolarmente utile se si usa un carattere jolly quando si specifica il nome del processo, perché è possibile che si corrisponda accidentalmente ad alcuni processi che non si vuole arrestare:

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 manipolazione di un processo complesso è possibile con alcuni cmdlet per i filtri degli oggetti. Poiché un oggetto Process ha una proprietà Responding che è true quando non risponde più, è possibile arrestare tutte le applicazioni non rispondenti con il comando seguente:

Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process

Lo stesso approccio è applicabile anche ad altre situazioni. Si supponga ad esempio che un'applicazione dell'area di notifica secondaria venga eseguita automaticamente quando gli utenti avviano un'altra applicazione. È possibile che ciò non funzioni correttamente nelle sessioni di Servizi terminal, ma si vuole comunque mantenerlo nelle sessioni eseguite nella console del computer fisico. Le sessioni connesse al desktop del computer fisico hanno sempre un ID sessione pari a 0, quindi è possibile arrestare tutte le istanze del processo presenti in altre sessioni usando Where-Object e il processo SessionId:

Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process

Il Stop-Process cmdlet non ha un parametro ComputerName . Pertanto, per eseguire un comando di arresto del processo in un computer remoto, è necessario usare il Invoke-Command cmdlet . Per arrestare ad esempio arrestare il processo PowerShell nel computer remoto Server01, digitare:

Invoke-Command -ComputerName Server01 {Stop-Process Powershell}

Arresto di tutte le altre sessioni di PowerShell

Può talvolta essere utile arrestare tutte le sessioni di PowerShell in esecuzione diverse dalla sessione corrente. Se una sessione usa troppe risorse o non è accessibile (perché in esecuzione in modalità remota o in un'altra sessione desktop), potrebbe risultare impossibile arrestarla direttamente. Se si prova ad arrestare tutte le sessioni in esecuzione, invece, la sessione corrente può essere arrestata.

Ogni sessione di PowerShell ha una variabile di ambiente PID che contiene l'ID del processo di Windows PowerShell. È possibile controllare il $PID in base all'ID di ogni sessione e terminare solo le sessioni di Windows PowerShell con un ID diverso. Il comando della pipeline seguente esegue questa operazione e restituisce l'elenco di sessioni terminate (a causa dell'uso del parametro 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

Avvio, debug e attesa di processi

PowerShell include anche cmdlet per avviare (o riavviare), eseguire il debug di un processo e attendere il completamento di un processo prima di eseguire un comando. Per informazioni su questi cmdlet, vedere l'argomento della Guida corrispondente per ciascun cmdlet.

Vedi anche