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 ProcessGet-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|ftPara 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, mainWindowtitleUsando la opción IncludeUserName, puede mostrar un nombre de usuario (propietario) que ha iniciado el proceso:
Get-Process -Name winword -IncludeUserNameUsando
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)" -DescendingComo 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-CPUUsagePercentPara 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 notepadSi no hay ningún archivo ejecutable en el
$env:pathvariable 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 MaximizedCon 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 notepadDe 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 -ConfirmAdemá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-ProcessCon PowerShell, puede reiniciar automáticamente un proceso bloqueado o cerrado.
Administrar procesos en una computadora remota usando PowerShell
Puedes usar el
ComputerNameopció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, MachineNameNos ocupamos de las funciones Get-Process integradas para administrar procesos en computadoras remotas. Funciones remotas de PowerShell disponibles en
Invoke-Commandy
Enter-PSSessionLos 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





