¿Cómo puedo invocar un proceso en primer plano desde un trabajo de PowerShell en segundo plano?

¿Cómo puedo invocar un proceso en primer plano desde un trabajo de PowerShell en segundo plano?

Estoy trabajando en un script de PowerShell que proporciona salida de consola y reinicia el sistema varias veces durante la operación del script. Tan pronto como comienza, se registra como un trabajo programado para poder continuar donde lo dejó después del reinicio:

$JobArgs = @(
    $ScriptPath
    ($ArgumentList -join ' ')
)

$JobScript = {
    param(
        [string] $ScriptPath,
        [string] $Arguments
    )

    $PSArgs = @(
        '-NoExit'
        '-NoLogo'
        '-NoProfile'
        "-File $ScriptPath $Arguments"
    )

    Start-Process powershell.exe -ArgumentList $PSArgs -Wait
}

$AtLogonTrigger = New-JobTrigger -AtLogOn -User $LoginUser

$JobProperties = @{
    'Name'               = $JobName
    'Trigger'            = $AtLogonTrigger
    'ScheduledJobOption' = New-ScheduledJobOption -RunElevated
    'ScriptBlock'        = $JobScript
    'ArgumentList'       = $JobArgs
}

$Job = Register-ScheduledJob @JobProperties -ErrorAction Stop

Sin embargo, si bien esto hace lo que quiero, lo hace en segundo plano cuando prefiero que la ventana de PowerShell esté visible. Tampoco parece ser algo intrínseco de PowerShell; simplemente comenzar notepad.exea través de Start-Processtambién proporciona una instancia de bloc de notas oculta.

Si bien soy consciente de que probablemente no debería confiar en la salida de la consola, es lo suficientemente buena para mis propósitos.

¿Existe alguna manera de invocar un proceso en primer plano desde un trabajo en segundo plano?

Respuesta1

Este comportamiento es por diseño. Los trabajos de PowerShells y las tareas programadas de Windows se ejecutan en segundo plano (sesión 0) y no deben interactuar con el escritorio del usuario.

Los trabajos de PowerShell son en realidad solo tareas programadas de Windows; puede encontrarlas en:

\Microsoft\Windows\PowerShell\ScheduledJobs

La única forma de ejecutar tareas programadas para interactuar con la sesión de escritorio es configurar:Run only when user is logged on

Con schtasks.exeusted usaría el /ITinterruptor

Los ScheduledJobOptionscmdlets de PowerShell no parecen permitirle especificar esto.

Por lo tanto, podría intentar encontrar manualmente las tareas programadas correspondientes a su trabajo de PowerShell y cambiar esa propiedad.

información relacionada