Esta es la solución más acertada que encomtrarás brindar, pero primero mírala pausadamente y valora si es compatible a tu proyecto.
Una manera fácil de incluir funciones locales en un trabajo en segundo plano:
$init=[scriptblock]::create(@"
function DoWork $function:DoWork
"@)
Start-Job -Name "DoActualWork" $ScriptBlock -ArgumentList $array -InitializationScript $init | Out-Null
Los trabajos en segundo plano se ejecutan en un proceso separado, por lo que los trabajos que crea con Start-Job
no puede interactuar con funciones a menos que las incluya en el $scriptblock
.
Aunque haya incluido la función en el $scripblock
, Write-Host
no enviaría su contenido a la consola hasta que usara Get-Job | Receive-Job
para recibir el resultado de los trabajos.
EDITAR El problema es que tu DisplayMessage
la función está en un ámbito de secuencia de comandos local mientras que su controlador de eventos se ejecuta en un ámbito principal diferente (como global, que es el ámbito de la sesión), por lo que no puede encontrar su función. Si crea la función en el ámbito global y la llama desde el ámbito global, funcionará.
He modificado su secuencia de comandos para hacer esto ahora. También modifiqué para bloquear el script y desregistré los eventos cuando el script está listo para que no reciba 10 mensajes cuando ejecute el script varias veces 🙂
Sin título1.ps1
function DoWork
Receive-Job
function global:DisplayMessage([string]$message)
Write-Host $message -ForegroundColor Red
DoWork
Get-EventSubscriber | Unregister-Event
Prueba
PS > .Untitled1.ps1
Processing Starts
Starting work 1
Starting work 2
Ending work 1
Ending work 2
Starting work 3
Ending work 3
Processing Ends
Recuerda algo, que te damos el privilegio decir si te fue útil.