2017-06-02 14 views
3

実行する方法はありますか並列プログラミングされた機能PowerShell?以下のような並列機能を実行する

何か:それは同じスクリプトファイル内で宣言された関数です「RunUnitTests」と「RunBuilder」を、認識していない文句を言うので

Function BuildParallel($configuration) 
{ 
    $buildJob = { 
     param($configuration) 
     Write-Host "Building with configuration $configuration." 
     RunBuilder $configuration; 
    } 

    $unitJob = { 
     param() 
     Write-Host "Running unit." 
     RunUnitTests; 
    } 

    Start-Job $buildJob -ArgumentList $configuration 
    Start-Job $unitJob 

    While (Get-Job -State "Running") 
    { 
     Start-Sleep 1 
    } 

    Get-Job | Receive-Job 
    Get-Job | Remove-Job 
} 

は動作しません。どうやらこれは、スクリプトブロックが新しいコンテキストであり、同じファイルで宣言されたスクリプトについて何も知らないために起こります。

私はスタート-仕事に-InitializationScriptを使用するように試みることができるが、両方RunUnitTestsとRunBuilderは同じファイルで宣言または他のファイルから参照より多くの機能を呼び出し、そう...私はそこだと確信していますそれは単なるモジュラープログラミング(関数、ルーチン、すべてのもの)なので、これを行う方法です。

答えて

1

これらの機能を別々のファイルに用意し、必要に応じてドットソーシングによって現在のコンテキストにインポートすることができます。私はPowershellのプロファイルでこれを行います。私のカスタム関数のいくつかは利用可能です。

. C:\some\path\RunUnitTests.ps1 
+0

しかし、私はのScriptBlockや関数の内部で自動的に認識されることを使用する必要があります:あなたは、インポート一つのファイルを望んでいた場合

$items = Get-ChildItem "$PSprofilePath\functions" $items | ForEach-Object { . $_.FullName } 

、それだけだろうか? – Luis

+0

ScriptBlock/jobは独自のコンテキストで実行されるため、各スクリプトブロックの先頭で実行して、関数をそのジョブのコンテキストにインポートします。 –

+0

ありがとう、それはうまく動作します! – Luis

関連する問題