如何從後台 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.exeviaStart-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 作業相對應的排程任務並變更該屬性。

相關內容