Ich arbeite an einem PowerShell-Skript, das Konsolenausgaben bereitstellt und das System während der Ausführung des Skripts mehrmals neu startet. Sobald es gestartet ist, registriert es sich als geplanter Job, sodass es nach Neustarts dort weitermachen kann, wo es aufgehört hat:
$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
Dies tut zwar, was ich will, aber es geschieht im Hintergrund, obwohl ich es vorziehen würde, dass das PowerShell-Fenster sichtbar ist. Es scheint auch kein wesentlicher Bestandteil von PowerShell zu sein; das einfache Starten notepad.exe
über Start-Process
bietet ebenfalls eine versteckte Notizblockinstanz.
Obwohl ich mir bewusst bin, dass ich mich wahrscheinlich nicht auf die Konsolenausgabe verlassen sollte, ist sie für meine Zwecke gut genug.
Gibt es eine Möglichkeit, einen Vordergrundprozess von einem Hintergrundjob aus aufzurufen?
Antwort1
Dieses Verhalten ist beabsichtigt. PowerShell-Jobs und geplante Windows-Aufgaben werden im Hintergrund ausgeführt (Sitzung 0) und sollten/tun nicht mit dem Desktop des Benutzers interagieren.
PowerShell-Jobs sind eigentlich nur geplante Windows-Aufgaben. Sie finden sie unter:
\Microsoft\Windows\PowerShell\ScheduledJobs
Die einzige Möglichkeit zum Ausführen geplanter Aufgaben zur Interaktion mit der Desktopsitzung besteht in der Festlegung von:Run only when user is logged on
Mit schtasks.exe
dem /IT
Schalter
Die ScheduledJobOptions
PowerShell-Cmdlets erlauben dies scheinbar nicht.
Sie können also versuchen, die geplanten Aufgaben, die Ihrem PowerShell-Job entsprechen, manuell zu finden und diese Eigenschaft zu ändern.