Saltar al contenido

¿Cómo llamar a una función de PowerShell dentro del script desde Start-Job?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *