我正在编写一个 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 作业相对应的计划任务并更改该属性。