Puede utilizar los cmdlets Process para administrar procesos locales y remotos en Windows PowerShell.
Obtener procesos (Get-Process)
Para obtener los procesos que se ejecutan en el equipo local, ejecute un cmdlet Get-Process sin parámetros.
Puede obtener procesos concretos especificando sus nombres o sus identificadores. El comando siguiente obtiene el proceso 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
Aunque es normal que los cmdlets no devuelvan datos en algunas situaciones, cuando se especifica un proceso por su ProcessId, Get-Process genera un error si no encuentra coincidencias, ya que lo que intenta normalmente es recuperar un proceso conocido que se esté ejecutando. Si no hay ningún proceso con ese Id., lo más probable es que el Id. no sea el correcto o que el proceso en cuestión ya se haya cerrado:
PS> Get-Process -Id 99 Get-Process : No process with process ID 99 was found. At line:1 char:12 + Get-Process <<<< -Id 99
Puede usar el parámetro Name del cmdlet Get-Process para especificar un subconjunto de procesos según el nombre de proceso. El parámetro Name puede tomar varios nombres en una lista separada por comas y admite el uso de caracteres comodín, por lo que se pueden escribir patrones de nombre.
Por ejemplo, el comando siguiente obtiene procesos cuyos nombres empiezan por "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
Como la base para los procesos de Windows PowerShell es la clase System.Diagnostics.Process de .NET, Windows PowerShell sigue algunas de las convenciones que utiliza System.Diagnostics.Process. Una de estas convenciones es que el nombre de proceso correspondiente a un archivo ejecutable no puede contener nunca ".exe" al final del nombre del ejecutable.
Get-Process también acepta varios valores para el parámetro 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
Puede utilizar el parámetro ComputerName de Get-Process para obtener procesos en equipos remotos. Por ejemplo, el comando siguiente obtiene los procesos de PowerShell en el equipo local (representado por "localhost") y en dos equipos remotos.
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
Los nombres de equipo no son evidentes en esta presentación, pero se almacenan en la propiedad MachineName de los objetos de proceso que Get-Process devuelve. El comando siguiente utiliza el cmdlet Format-Table para mostrar las propiedades de proceso ID, ProcessName y MachineName (ComputerName) de los objetos de proceso.
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
Este comando más complejo agrega la propiedad MachineName a la presentación de Get-Process estándar. El carácter de acento grave (`) (ASCII 96) es el carácter de continuación de 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
Detener procesos (Stop-Process)
Windows PowerShell proporciona flexibilidad a la hora de crear listas de procesos pero, ¿y para detener procesos?
El cmdlet Stop-Process toma un nombre o un identificador para especificar un proceso que se desea detener. La capacidad del usuario para detener procesos depende de los permisos que tenga. Algunos procesos no se pueden detener. Por ejemplo, si intenta detener el proceso inactivo, aparecerá un error:
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
También puede forzar la solicitud de confirmación con el parámetro Confirm. Este parámetro resulta especialmente útil si incluye un carácter comodín al especificar el nombre del proceso, ya que puede buscar por equivocación algunos procesos que no desea detener:
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
Se pueden manipular procesos complejos usando algunos de los cmdlets para filtrar objetos. Dado que un objeto Process tiene una propiedad Responding con el valor True cuando ya no responde, puede detener todas las aplicaciones que dejen de responder con el siguiente comando:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
Puede aplicar el mismo enfoque en otras situaciones. Por ejemplo, supongamos que una aplicación secundaria del área de notificación se ejecuta automáticamente cuando los usuarios inician otra aplicación. Es posible que esta función no funcione correctamente en sesiones de Terminal Services, pero puede que desee que se mantenga en sesiones que se ejecuten en la consola del equipo físico. Las sesiones conectadas al escritorio de un equipo físico tienen siempre el identificador de sesión 0; por tanto, puede detener todas las instancias del proceso que se encuentren en otras sesiones usando Where-Object y el proceso, SessionId:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
El cmdlet Stop-Process no tiene el parámetro ComputerName. Por lo tanto, para ejecutar un comando de detención de proceso en un equipo remoto, es necesario usar el cmdlet Invoke-Command. Por ejemplo, para detener el proceso de PowerShell en el equipo remoto Server01, escriba:
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Detener todas las demás sesiones de Windows PowerShell
En algunas ocasiones, puede resultar útil poder detener todas las sesiones de Windows PowerShell que se estén ejecutando, menos la sesión actual. Si una sesión está utilizando demasiados recursos o no es posible tener acceso a ella (puede estar ejecutándose de forma remota o en otra sesión del escritorio), es posible que no pueda detenerla directamente. No obstante, si intenta detener todas las sesiones que se están ejecutando, es posible que lo que termine sea la sesión actual.
Cada sesión de Windows PowerShell tiene un PID de variable de entorno que contiene el Id. del proceso de Windows PowerShell. Puede comparar el $PID con el Id. de cada sesión y terminar únicamente las sesiones de Windows PowerShell que tengan un Id. distinto. El siguiente comando de canalización realiza esta tarea y devuelve una lista de las sesiones terminadas (debido a que se usa el parámetro 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
Iniciar, depurar y esperar la finalización de procesos
Windows PowerShell también incluye cmdlets para iniciar (o reiniciar), depurar y esperar la finalización de un proceso antes de que se ejecute un comando. Para obtener información acerca de estos cmdlets, vea el tema de Ayuda de cada cmdlet.
Vea también