저는 콘솔 출력을 제공하고 스크립트 작업 중에 시스템을 여러 번 다시 시작하는 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\ScheduledJobs
데스크톱 세션과 상호 작용하기 위해 예약된 작업을 실행하는 유일한 방법은 다음을 설정하는 것입니다.Run only when user is logged on
당신 과 함께 스위치를 schtasks.exe
사용합니다/IT
PowerShell cmdlet 에서는 ScheduledJobOptions
이를 지정할 수 없는 것 같습니다.
따라서 PowerShell 작업에 해당하는 예약된 작업을 수동으로 찾고 해당 속성을 변경할 수 있습니다.