バックグラウンド 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.exeStart-Process表示のメモ帳インスタンスも提供されます。

コンソール出力に頼るべきではないことは承知していますが、私の目的には十分です。

バックグラウンド ジョブからフォアグラウンド プロセスを呼び出す方法はありますか?

答え1

この動作は仕様です。PowerShell ジョブと Windows のスケジュールされたタスクはバックグラウンド (セッション 0) で実行されており、ユーザーのデスクトップと対話する必要はありません。

PowerShell ジョブは実際には Windows のスケジュールされたタスクであり、次の場所にあります。

\Microsoft\Windows\PowerShell\スケジュールされたジョブ

デスクトップ セッションと対話するためにスケジュールされたタスクを実行する唯一の方法は、以下を設定することです。Run only when user is logged on

スイッチschtasks.exeを使うと/IT

PowerShell コマンドレットではScheduledJobOptionsこれを指定できないようです。

したがって、PowerShell ジョブに対応するスケジュールされたタスクを手動で見つけて、そのプロパティを変更してみることができます。

関連情報