Ho visto this question e this question ma non sono riuscito a trovare una soluzione al mio problema.Come chiamare una funzione di PowerShell all'interno dello script da Start-Job?
Quindi, ecco la situazione: Ho due funzioni DoWork e DisplayMessage in un file di script (.ps1). Ecco il codice:
### START OF SCRIPT ###
function DoWork
{
$event = Register-EngineEvent -SourceIdentifier NewMessage -Action {
DisplayMessage($event.MessageData)
}
$scriptBlock = {
Register-EngineEvent -SourceIdentifier NewMessage -Forward
$message = "Starting work"
$null = New-Event -SourceIdentifier NewMessage -MessageData $message
### DO SOME WORK HERE ###
$message = "Ending work"
$null = New-Event -SourceIdentifier NewMessage -MessageData $message
Unregister-Event -SourceIdentifier NewMessage
}
DisplayMessage("Processing Starts")
$array = @(1,2,3)
foreach ($a in $array)
{
Start-Job -Name "DoActualWork" $ScriptBlock -ArgumentList $array | Out-Null
}
#$jobs = Get-Job -Name "DoActualWork"
While (Get-Job -Name "DoActualWork" | where { $_.State -eq "Running" })
{
Start-Sleep 1
}
DisplayMessage("Processing Ends")
Get-Job -Name "DoActualWork" | Receive-Job
}
function DisplayMessage([string]$message)
{
Write-Host $message -ForegroundColor Red
}
DoWork
### END OF SCRIPT ###
sto creando 3 processi in background (utilizzando $ array con 3 elementi) e l'utilizzo di eventi per passare i messaggi provenienti da processi in background per l'host. Mi aspetto che l'host di PowerShell visualizzi "Processing Starts" e "Processing Ends" 1 volta e "Starting work" e "Ending work" 3 volte ciascuno. Ma invece non ricevo "Starting work"/"Ending work" visualizzato in console.
evento viene trattato come un lavoro in PowerShell, così quando faccio Get-Job, posso vedere seguente errore associato al lavoro evento:
{Il termine 'DisplayMessage' non è riconosciuto come il nome di un cmdlet, funzione , file di script o programma eseguibile. Controllare l'ortografia del nome , o se un percorso è stato incluso, verificare che il percorso sia corretto e riprovare}
La mia domanda:. Come possiamo riutilizzare (o di riferimento) una funzione (DisplayMessage nel mio caso) definito nello stesso script da dove sto chiamando Start-Job? È possibile? So che possiamo usare -InitializationScript per passare funzioni/moduli a Start-Job, ma non voglio scrivere la funzione DisplayMessage due volte, una in script e un'altra in InitializationScript.
Grazie. So che Start-Job non può interagire con le funzioni esterne, quindi queste domande. Inoltre, so che Write-Host non può essere inviato direttamente alla console, ecco perché sto usando l'evento per farlo.Nel mio caso, sono in grado di scrivere sull'host ma solo se uso "Write-Host" direttamente nell'evento ma non quando lo richiamo da una funzione. – digitguy
Okey, credo di aver omesso la tua domanda, mi dispiace per quello. :) Guarda il nuovo contenuto alla fine della mia domanda. È il tuo problema attuale? –
Sì, hai ragione. Il primo funziona, ma quest'ultimo no. – digitguy