Condividi tramite


Gestione dei processi con i Process Cmdlets

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