Búsqueda de sitios web

Administrar procesos de Windows con PowerShell


PowerShell tiene muchas características para administrar procesos en una computadora local o remota. Usando PowerShell, puede obtener una lista de procesos en ejecución, suspender un proceso colgado, encontrar un proceso por un título de Windows, ejecutar un nuevo proceso en modo oculto o interactivo, etc.

Puede mostrar la lista de cmdlets de administración de procesos disponibles en Windows 10 de la siguiente manera:

Get-Command -Noun Process

  • Get-Process: obtenga una lista de los procesos de Windows en ejecución;

  • Start-Process: iniciar un proceso/programa;

  • Stop-Process: detener (matar) el proceso por la fuerza;

  • Proceso de depuración: depurar un proceso;

  • Wait-Process: espere hasta que finalice el proceso.

Get-Process: obtener una lista de procesos en ejecución

El cmdlet Get-Process muestra una lista de procesos que se ejecutan en una computadora local.

De forma predeterminada, se muestran estas propiedades de los procesos en ejecución:

  • Manejadores: el número de descriptores de archivo de entrada y salida (manejadores) abiertos por este proceso;

  • NPM(K): es una memoria no paginada (grupo no paginado). Este es el tamaño de los datos de proceso (en KB) que nunca se paginan en el disco;

  • PM(K): el tamaño de la memoria del proceso que se puede paginar;

  • WS(K): el tamaño de la memoria física (en KB) utilizada por el proceso (Conjunto de trabajo);

  • CPU(s) : un tiempo de CPU utilizado por el proceso (se cuenta el tiempo en todas las CPU);

  • ID: identificador de proceso único;

  • SI (ID de sesión): es el ID de sesión del proceso (0 significa que se está ejecutando para todas las sesiones, 1: se está ejecutando para el primer usuario que inició sesión, 2: se está ejecutando para el segundo usuario que inició sesión, etc.);

  • Nombre del proceso

Para enumerar todas las propiedades de varios procesos:

Get-Process cmd,excel,notep* | Format-List *

Solo puede mostrar las propiedades específicas del proceso, por ejemplo, un nombre (

ProcessName

), una hora de inicio (

StartTime

), un título de ventana de proceso (

MainWindowTitle

), un nombre de archivo ejecutable (

Path

) y un nombre de desarrollador (

Company

):

Get-Process winword, notep* | Select-Object ProcessName, StartTime, MainWindowTitle, Path, Company|ft

Para mostrar una lista de procesos de usuario en ejecución con GUI (no se mostrarán los procesos en segundo plano y del sistema):

Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle

Usando la opción IncludeUserName, puede mostrar un nombre de usuario (propietario) que ha iniciado el proceso:

Get-Process -Name winword -IncludeUserName

Usando

Where-Object

, puede seleccionar procesos de acuerdo con algunos criterios. Por ejemplo, mostremos todos los procesos que usan más de 300 MB de RAM, ordenémoslos en orden descendente por el uso de memoria y mostremos el tamaño de la memoria en MB en lugar de KB:

Get-Process| where-object {$_.WorkingSet -GT 300000*1024}|select processname,@{l="Used RAM(MB)"; e={$_.workingset / 1mb}} |sort "Used RAM(MB)" -Descending

Como dijimos anteriormente, el cmdlet Get-Process en el parámetro CPU contiene el tiempo de procesador utilizado por el proceso específico en segundos. Para mostrar el porcentaje de CPU utilizado por los procesos (similar al Administrador de tareas), use esta función:

function Get-CPUUsagePercent
{
$CPUPercent = @{
Name = 'CPUPercent'
Expression = {
$TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
[Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
}
}
Get-Process | Select-Object -Property Name, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending | Select-Object -First 20
}
Get-CPUUsagePercent

Para encontrar procesos bloqueados (que no responden), ejecute el siguiente comando:

Get-Process | where-object {$_.Responding -eq $false}

Start-Process, Stop-Process: Cómo iniciar o detener procesos con PowerShell

Para iniciar un nuevo proceso usando PowerShell, se usa este comando:

Start-Process -FilePath notepad

Si no hay ningún archivo ejecutable en el

$env:path

variable de entorno, especifique la ruta completa al archivo:

Start-Process -FilePath 'C:\distr\app.exe'

Puede ejecutar un programa y pasarle argumentos:

Start-Process -FilePath ping -ArgumentList "-n 10 10.1.56.21"

Usando la opción WindowStyle, puede configurar el modo de inicio de la ventana de proceso (normal, minimizado, maximizado, oculto). Por ejemplo, para ejecutar un programa en una ventana maximizada y esperar hasta que finalice el proceso, ejecute este comando:

Start-Process -FilePath tracert -ArgumentList "10.1.56.21" -wait -windowstyle Maximized

Con el cmdlet Stop-Process, puede detener cualquier proceso. Por ejemplo, para cerrar todos los procesos del bloc de notas en ejecución:

Stop-Process -Name notepad

De forma predeterminada, no se le solicita que confirme la finalización de un proceso. Todos los procesos que cumplan con los criterios especificados se detendrán. Para poder confirmar la detención de procesos, agregue la opción -Confirmar:

Stop-Process -Name notepad.exe -Confirm

Además, puede matar un proceso de la siguiente manera:

(Get-Process -Name cmd).Kill()

Desde PowerShell, puede forzar la detención de todas las aplicaciones que no responden al Administrador de procesos de Windows:

Get-Process | where-object {$_.Responding -eq $false}| Stop-Process

Con PowerShell, puede reiniciar automáticamente un proceso bloqueado o cerrado.

Administrar procesos en una computadora remota usando PowerShell

Puedes usar el

ComputerName

opción del cmdlet Get-Process para administrar procesos en equipos remotos (se debe habilitar y configurar WinRM).

Get-Process -ComputerName srv01, srv02, srv03| Format-Table -Property ProcessName, ID, MachineName

Nos ocupamos de las funciones Get-Process integradas para administrar procesos en computadoras remotas. Funciones remotas de PowerShell disponibles en

Invoke-Command

y

Enter-PSSession

Los cmdlets no se tratan aquí.

Si desea finalizar un proceso en una computadora remota, tenga en cuenta que el cmdlet Stop-Process no tiene el parámetro -ComputerName. Para detener un proceso en una computadora remota, puede usar el siguiente código de PowerShell:

$RemoteProcess = Get-Process -Name cmd -ComputerName srv01
Stop-Process -InputObject $RemoteProcess

Artículos relacionados