私は、コンソール出力を提供し、スクリプトの実行中にシステムを数回再起動する 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 のスケジュールされたタスクであり、次の場所にあります。
\Microsoft\Windows\PowerShell\スケジュールされたジョブ
デスクトップ セッションと対話するためにスケジュールされたタスクを実行する唯一の方法は、以下を設定することです。Run only when user is logged on
スイッチschtasks.exe
を使うと/IT
PowerShell コマンドレットではScheduledJobOptions
これを指定できないようです。
したがって、PowerShell ジョブに対応するスケジュールされたタスクを手動で見つけて、そのプロパティを変更してみることができます。