Como posso chamar um processo em primeiro plano de uma tarefa em segundo plano do PowerShell?

2

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 que ele possa 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, enquanto isso faz 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 um intrínseco do PowerShell; simplesmente iniciar notepad.exe via Start-Process também fornece uma instância oculta do bloco de notas.

Embora saiba que eu provavelmente não deveria confiar na saída do console, é bom o suficiente para os meus propósitos.

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

    
por vmrob 23.06.2015 / 00:44

1 resposta

1

Esse comportamento é por design. Os trabalhos do PowerShells e as tarefas agendadas do Windows estão sendo executados em segundo plano (Sessão 0) e não devem interagir com a área de trabalho do usuário.

Os trabalhos do PowerShell são realmente 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.exe você usaria a /IT switch

O ScheduledJobOptions nos cmdlets do PowerShell parece não permitir que você especifique isso.

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

    
por 23.06.2015 / 05:12