Como posso invocar um processo em primeiro plano a partir de um trabalho do PowerShell em segundo plano?

Como posso invocar um processo em primeiro plano a partir de um trabalho do PowerShell em segundo plano?

Estou trabalhando em um script do PowerShell que fornece saída do console e reinicia o sistema várias vezes durante a operação do script. Assim que é iniciado, ele se registra como um Trabalho Agendado para poder continuar de onde parou após a reinicialização:

$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

No entanto, embora isso faça o que eu quero, ele faz isso em segundo plano, quando eu preferiria que a janela do PowerShell estivesse visível. Também não parece ser intrínseco do PowerShell; simplesmente iniciar notepad.exevia Start-Processtambém fornece uma instância oculta do bloco de notas.

Embora eu esteja ciente de que provavelmente não deveria confiar na saída do console, ela é boa o suficiente para meus propósitos.

Existe uma maneira de invocar um processo em primeiro plano a partir de um trabalho em segundo plano?

Responder1

Esse comportamento ocorre por design. Os trabalhos do PowerShell e as tarefas agendadas do Windows estão em execução em segundo plano (Sessão 0) e devem/não interagir com a área de trabalho do usuário.

Os trabalhos do PowerShell são, na verdade, apenas tarefas agendadas do Windows. Você pode encontrá-los em:

\Microsoft\Windows\PowerShell\ScheduledJobs

A única maneira de executar tarefas agendadas para interagir com a sessão da área de trabalho é definir:Run only when user is logged on

Com schtasks.exevocê usaria o /ITinterruptor

Os ScheduledJobOptionscmdlets do PowerShell não parecem permitir que você especifique isso.

Portanto, você pode tentar encontrar manualmente as tarefas agendadas correspondentes ao seu trabalho do PowerShell e alterar essa propriedade.

informação relacionada