es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener el PID de procesos idénticos en ejecución y redirigir la salida al condicional “if”.

Quiero que el script encuentre dos procesos idénticos que se estén ejecutando actualmente y redirija el PID del proceso que coincida con una ruta definida en la variable $procName utilizando el comando If($_.Path -eq $procName){.

Después de identificar el proceso correcto basado en su ruta completa de archivo encontrada anteriormente, quiero utilizar su PID único para verificar si está actualmente “suspendido” o “no suspendido”.

Si todo va bien en la tubería actual, entonces utilizar el valor de salida para ejecutar uno de los dos comandos siguientes:

If($_.Path -eq $procName) {
    Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner $myPID"
} Else {
    Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner -r $myPID"
}

Mi problema es que el resultado es el mismo sin importar si el proceso está actualmente suspendido o no:

Start-Process cmd.exe -WindowStyle Maximized -ArgumentList /D /K pssuspend.exe -nobanner -r 18960

Esto es lo que tengo hasta ahora:

$procName = 'C:\Program Files (x86)\Steam\steamapps\common\rocketleague\Binaries\Win64\RocketLeague.exe'
$procID = Get-Process -Name 'RocketLeague' | Select-Object -Property Id,Path | ForEach-Object {
    If($_.Path -eq $procName){
        $myPID = $_.Id
        If(Get-ChildItem | Where-Object -FilterScript {$_.Responding -eq $false}) {
            Write-Host "Start-Process cmd.exe -WindowStyle Maximized -ArgumentList ""/D /K pssuspend.exe -nobanner $myPID"""
            } Else {
            Write-Host "Start-Process cmd.exe -WindowStyle Maximized -ArgumentList ""/D /K pssuspend.exe -nobanner -r $myPID"""
        }
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar dos procesos idénticos que se estén ejecutando actualmente y redireccionar el PID del proceso que coincide con una ruta definida en la variable $procName, puedes usar el siguiente comando:

    $procID = Get-Process -Name 'ProcessName' | Where-Object { $_.Path -eq $procName } | Select-Object -ExpandProperty Id
    

    Esto obtendrá el proceso con el nombre ‘ProcessName’ y cuya ruta coincida con la variable $procName, y seleccionará solo su propiedad de ID.

    Luego, para comprobar si está actualmente suspendido o no, puedes usar el siguiente comando:

    $isSuspended = (Get-Process -Id $procID).Threads | Where-Object { $_.WaitReason -eq 'Suspended' }
    

    Esto obtendrá el proceso con el ID almacenado en $procID, obtendrá todos sus subprocesos y filtrará cualquier subproceso que tenga un WaitReason de ‘Suspended’. Si hay subprocesos suspendidos, $isSuspended los contendrá.

    Finalmente, puedes ejecutar uno de los dos comandos según el valor de salida, de la siguiente manera:

    if ($isSuspended) {
        Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner -r $procID"
    } else {
        Start-Process cmd.exe -WindowStyle Maximized -ArgumentList "/D /K pssuspend.exe -nobanner $procID"
    }
    

    Esto comprobará si $isSuspended contiene algún subproceso y ejecutará el comando correspondiente en consecuencia. El comando para reanudar el proceso es pssuspend.exe -nobanner -r $procID, que incluye la bandera -r para indicar una operación de reanudación.

Comments are closed.