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.