È 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