我正在編寫一個 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
viaStart-Process
也提供了一個隱藏的記事本實例。
雖然我知道我可能不應該依賴控制台輸出,但它對於我的目的來說已經足夠了。
有沒有辦法從後台作業呼叫前台進程?
答案1
此行為是設計使然。 PowerShell 作業和 Windows 排程任務在背景執行(會話 0),並且應該/不與使用者桌面互動。
PowerShell 作業實際上只是 Windows 排程任務,您可以在下列位置找到它們:
\Microsoft\Windows\PowerShell\ScheduledJobs
運行計劃任務以與桌面會話互動的唯一方法是設定:Run only when user is logged on
與schtasks.exe
你一起使用/IT
開關
PowerShell cmdlet 中的ScheduledJobOptions
似乎不允許您指定這一點。
因此,您可以嘗試手動尋找與您的 PowerShell 作業相對應的排程任務並變更該屬性。