Назад | Перейти на главную страницу

Как я могу вызвать процесс переднего плана из фонового задания 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.exe через Start-Process также предоставляет скрытый экземпляр блокнота.

Хотя я знаю, что мне, вероятно, не следует полагаться на вывод консоли, он достаточно хорош для моих целей.

Есть ли способ вызвать процесс переднего плана из фонового задания?

Такое поведение является особенностью. Задания PowerShells и запланированные задачи Windows выполняются в фоновом режиме (сеанс 0) и должны / не взаимодействовать с рабочим столом пользователя.

Задания PowerShell - это просто запланированные задачи Windows, вы можете найти их по адресу:

\ Microsoft \ Windows \ PowerShell \ ScheduledJobs

Единственный способ запустить запланированные задачи для взаимодействия с сеансом рабочего стола - это установить: Run only when user is logged on

С участием schtasks.exe вы бы использовали /IT переключатель

В ScheduledJobOptions в командлетах PowerShell, похоже, не позволяют указать это.

Таким образом, вы можете попытаться вручную найти запланированные задачи, соответствующие вашему заданию PowerShell, и изменить это свойство.