この質問とこの質問を見ましたが、問題の解決策が見つかりませんでした。
状況は次のとおりです。スクリプト (.ps1) ファイルに DoWork と DisplayMessage の 2 つの関数があります。コードは次のとおりです。
### 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 ###
3 つのバックグラウンド ジョブを作成し (3 つの要素を持つ $array を使用)、イベントを使用してバックグラウンド ジョブからホストにメッセージを渡します。PowerShellホストが「処理開始」と「処理終了」を1回、「作業開始」と「作業終了」をそれぞれ3回表示することを期待します。しかし、代わりに、コンソールに「作業の開始」/「作業の終了」が表示されません。
イベントも powershell のジョブとして扱われるため、Get-Job を実行すると、イベント ジョブに関連する次のエラーが表示されます。
{'DisplayMessage' という用語は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスが正しいことを確認してから、もう一度やり直してください。}
私の質問: Start-Job を呼び出している場所から同じスクリプトで定義された関数 (私の場合は DisplayMessage) をどのように再利用 (または参照) できますか? 出来ますか?-InitializationScript を使用して関数/モジュールを Start-Job に渡すことができることはわかっていますが、DisplayMessage 関数をスクリプトで 1 回、InitializationScript で 1 回、2 回記述したくありません。