Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 Get-Process
senza parametri.
È possibile ottenere processi specifici specificando i relativi nomi di processo o ID processo. Il comando seguente ottiene 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 restituisca dati in alcune situazioni, quando si specifica un processo in base al relativo ProcessId, Get-Process
genera un errore se non trova corrispondenze, perché la finalità abituale 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 cmdlet Get-Process
per specificare un subset di processi in base al nome del processo. Il parametro Name può accettare più nomi in un elenco delimitato da virgole e supporta l'uso di caratteri jolly, in modo da poter digitare modelli di nome.
Ad esempio, il comando seguente ottiene 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 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 il .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 usare il parametro ComputerName di Get-Process
per ottenere processi nei computer remoti. Ad esempio, il comando seguente ottiene 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 di processo di cui Get-Process
restituisce. Il comando seguente usa il cmdlet Format-Table
per visualizzare le proprietà Id, ProcessName e MachineName (ComputerName) degli oggetti di 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 Get-Process
standard.
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 cmdlet Stop-Process
accetta un nome o ID per specificare un processo da arrestare. La possibilità di arrestare i processi dipende dalle autorizzazioni. Alcuni processi non possono essere arrestati. Ad esempio, se si tenta di 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 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 complessa dei processi è possibile usando alcuni dei cmdlet di filtro degli oggetti. Poiché un oggetto Process ha una proprietà Responding 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
È possibile usare lo stesso approccio in altre situazioni. Si supponga, ad esempio, che un'applicazione di 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 cmdlet Stop-Process
non dispone di un parametro ComputerName. Pertanto, per eseguire un comando di arresto del processo in un computer remoto, è necessario usare il cmdlet Invoke-Command
. Ad esempio, per arrestare il processo di 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 è inaccessibile (potrebbe essere in esecuzione in remoto o in un'altra sessione desktop), potrebbe non essere possibile arrestarla direttamente. Tuttavia, se si tenta di arrestare tutte le sessioni in esecuzione, la sessione corrente potrebbe essere terminata.
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 delle 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 dei cmdlet per ogni cmdlet.
Vedere anche
- Get-Process
- Stop-Process
- Avvia-Processo
- attesa-processo
- Processo di Debug
- Invoca-Comando