Widziałem this question i this question, ale nie mogłem znaleźć rozwiązania mojego problemu.Jak wywołać funkcję powershell w skrypcie z zadania początkowego?
Oto sytuacja: Mam dwie funkcje: DoWork i DisplayMessage w pliku skryptu (.ps1). Oto kod:
### 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 ###
tworzę 3 oferty tle (przy użyciu $ tablicę z 3 elementów) i stosując zdarzenia do przekazywania wiadomości od pracy tła dla gospodarza. Spodziewam się, że host programu Powerhell wyświetli "Rozpoczęcie przetwarzania" i "Przetwarzanie zakończy się" 1 raz i "Rozpoczęcie pracy" i "Zakończenie pracy" trzy razy. Ale zamiast tego nie wyświetla się "Uruchomienie pracy"/"Kończenie pracy" w konsoli.
zdarzeń jest również traktowane jako zadanie w PowerShell, więc kiedy robię Get-Job, widzę następujący błąd związany z pracą zdarzenia:
{Termin „DisplayMessage” nie jest uznawane za nazwa funkcji cmdlet, , pliku skryptu lub obsługiwanego programu. Sprawdź pisownię nazwy , czy ścieżka została włączona, upewnij się, że ścieżka jest poprawna i spróbuj ponownie}
Moje pytanie. W jaki sposób można ponownie wykorzystać (lub odniesienia) funkcja (DisplayMessage w moim case) zdefiniowane w tym samym skrypcie, skąd wywołuję Start-Job? Czy to możliwe? Wiem, że możemy użyć -InitializationScript do przekazania funkcji/modułów do Start-Job, ale nie chcę pisać funkcji DisplayMessage dwa razy, jeden w skrypcie i inny w InitializationScript.
Dzięki. Wiem, że Start-Job nie może wchodzić w interakcje z zewnętrznymi funkcjami, stąd te pytania. Ponadto wiem, że Write-Host nie może bezpośrednio wyprowadzać na konsolę, dlatego używam zdarzenia, aby to zrobić.W moim przypadku jestem w stanie napisać do hosta, ale tylko wtedy, gdy użyję "Write-Host" bezpośrednio w zdarzeniu, ale nie przy wywołaniu go z funkcji. – digitguy
Okey, myślę, że przegapiłem twoje pytanie, przepraszam za to. :) Zobacz nową treść na końcu mojego pytania. Czy to twój obecny problem? –
Tak, masz rację. Pierwsze działa, ale drugie nie. – digitguy