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.exe
a través de Start-Process
tambié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.exe
usted usaría el /IT
interruptor
Los ScheduledJobOptions
cmdlets 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.