È possibile utilizzare il cmdlet Process in Windows PowerShell per gestire processi locali e remoti.

Recupero dei processi (Get-Process)

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

È possibile ottenere determinati processi specificando i relativi nomi o ID. Il comando seguente consente di ottenere il processo 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

Sebbene sia normale che i cmdlet non restituiscano dati in alcune situazioni, quando si specifica un processo in base al relativo ProcessId, Get-Process genererà un errore se non vengono trovate corrispondenze poiché l'intento è in genere quello di recuperare un processo in esecuzione già noto. Se non è disponibile nessun processo con tale Id, è probabile che l'Id non sia corretto oppure che il processo di interesse sia già terminato:

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

È possibile utilizzare il parametro Name del cmdlet Get-Process per specificare un sottoinsieme di processi basato sui nomi. Il parametro Name può accettare più nomi in un elenco delimitato da virgole e supporta l'utilizzo di caratteri jolly, pertanto è possibile digitare modelli di nome.

Ad esempio, nel comando seguente vengono ottenuti i processi i cui nomi iniziano con "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

La classe System.Diagnostics.Process di .NET rappresenta la base dei processi di Windows PowerShell, pertanto è conforme ad alcune delle convenzioni utilizzate da System.Diagnostics.Process. Una di tali convenzioni prevede che il nome del processo di un eseguibile non deve mai includere l'estensione ".exe" alla fine del nome dell'eseguibile.

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

È possibile utilizzare il parametro ComputerName del cmdlet Get-Process per ottenere i processi in computer remoti. Ad esempio, nel comando seguente vengono ottenuti i processi di PowerShell nel computer locale (rappresentato da "localhost") e in due computer remoti.

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

I nomi dei computer non sono visibili in questa visualizzazione, ma vengono archiviati nella proprietà MachineName degli oggetti processo restituiti da Get-Process. Nel comando seguente viene utilizzato il cmdlet Format-Table per visualizzare l'ID processo e le proprietà ProcessName e MachineName (ComputerName) degli oggetti processo.

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

Questo comando più complesso aggiunge la proprietà MachineName alla visualizzazione standard di Get-Process. Il carattere di apice inverso (`)(ASCII 96) è il carattere di continuazione di 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

Arresto dei processi (Stop-Process)

Windows PowerShell assicura la massima flessibilità non solo per la visualizzazione dell'elenco dei processi, ma anche per l'arresto di un processo.

Il cmdlet Stop-Process accetta infatti il nome o l'ID per la specifica di un processo che si desidera arrestare. La possibilità di arrestare processi dipende dalle autorizzazioni disponibili. Alcuni processi non possono essere arrestati. Se ad esempio si tenta di arrestare il processo Idle, verrà visualizzato un errore:

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

È inoltre possibile utilizzare il parametro Confirm per forzare la visualizzazione del messaggio di conferma. Questo parametro è particolarmente utile se si utilizza un carattere jolly per la specifica del nome del processo perché è possibile che nella corrispondenza vengano accidentalmente inclusi alcuni processi che non si desidera arrestare:

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

Per la modifica dei processi complessi è possibile utilizzare alcuni cmdlet di filtraggio degli oggetti. Poiché un oggetto Process è caratterizzato da una proprietà Responding il cui valore è true quando il processo non risponde più, è possibile arrestare tutte le applicazioni che non rispondono utilizzando il seguente comando:

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

Lo stesso approccio può essere utilizzato anche in altre situazioni. Si supponga ad esempio che un'applicazione secondaria dell'area di notifica venga eseguita automaticamente quando gli utenti avviano un'altra applicazione. È possibile che tale applicazione non venga eseguita correttamente nelle sessioni Servizi terminal ma che si desideri mantenerla nelle sessioni in esecuzione nella console del computer fisico. Le sessioni connesse al desktop del computer fisico sono caratterizzate dall'ID 0, pertanto è possibile arrestare tutte le istanze del processo presenti in altre sessioni utilizzando 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. Di conseguenza, per eseguire un comando di arresto del processo in un computer remoto è necessario utilizzare il cmdlet Invoke-Command. Ad esempio per arrestare il processo di PowerShell sul computer remoto Server01, digitare:

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

Arresto di tutte le altre sessioni di Windows PowerShell

Talvolta può risultare utile poter arrestare tutte le sessioni di Windows PowerShell in esecuzione ad eccezione di quella corrente. Se una sessione utilizza un numero eccessivo di risorse oppure è inaccessibile, perché viene eseguita in remoto o in un'altra sessione desktop, potrebbe non essere possibile arrestarla direttamente. Se si tenta di arrestare tutte le sessioni in esecuzione, è possibile tuttavia che venga terminata la sessione corrente.

A ogni sessione di Windows PowerShell è associato un PID della variabile di ambiente che include l'ID del processo di Windows PowerShell. È possibile verificare $PID in base all'ID di ogni sessione e terminare solo le sessioni di Windows PowerShell con un ID diverso. Il seguente comando della pipeline consente di eseguire questa operazione e restituisce l'elenco delle sessioni terminate perché include il parametro 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

Avvio, debug e attesa dei processi

Windows PowerShell dispone anche di cmdlet per l'avvio (o il riavvio), il debug e l'attesa per il completamento di un processo prima dell'esecuzione di un comando. Per informazioni su questi cmdlet, vedere l'argomento relativo a ciascun cmdlet nella Guida sui cmdlet.

Vedere anche




Argomenti della Guida