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




Tabla de contenido