如何从后台 PowerShell 作业调用前台进程?

如何从后台 PowerShell 作业调用前台进程?

我正在编写一个 PowerShell 脚本,该脚本提供控制台输出并在脚本运行期间多次重新启动系统。一旦启动,它就会将自己注册为计划作业,以便它可以在重新启动后从中断的地方继续:

$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

但是,虽然这确实可以满足我的要求,但它是在后台执行的,而我希望 PowerShell 窗口可见。这似乎也不是 PowerShell 的内在特性;只需通过启动即可notepad.exe提供Start-Process隐藏的记事本实例。

虽然我知道我可能不应该依赖控制台输出,但它对我的目的来说已经足够了。

有没有办法从后台作业调用前台进程?

答案1

此行为是设计使然。PowerShell 作业和 Windows 计划任务在后台运行(会话 0),不应/不会与用户桌面交互。

PowerShell 作业实际上只是 Windows 计划任务,您可以在以下位置找到它们:

\微软\Windows\PowerShell\ScheduledJobs

运行计划任务与桌面会话交互的唯一方法是设置:Run only when user is logged on

schtasks.exe可以使用/IT开关

PowerShell cmdletScheduledJobOptions似乎不允许您指定这一点。

因此,您可以尝试手动找到与您的 PowerShell 作业相对应的计划任务并更改该属性。

相关内容