2016-08-27 14 views
0

私は1つのメインファイルでジョブとして実行する必要がある別々のファイルに機能を持っています。スクリプトの相対パスをpowershellジョブに渡す

私はこれらの関数の引数を渡すことができる必要があります。

今、私の問題は、完全にひどい方法で機能ファイルのパスをジョブに渡す方法を考え出すことです。

私もスクリプトを参照する必要があります(「スクリプトがsomefunc.ps1を使用しています」適切でないだけと言う静的なコメントを持つ)

私は読みやすくするために、ファイルの先頭に定義された機能を持っている必要があります相対パス(これらはすべて同じフォルダにあります)。

私はenv:を使用してスクリプトのパスを保存していますが、これを行うには5か所のようにスクリプトを参照する必要があります。

これは私が持っているものです。

testJobsMain.ps1:

#Store path of functions in env so jobs can find them 
$env:func1 = "$PSScriptRoot\func1.ps1" 
$env:func2 = "$PSScriptRoot\func2.ps1" 

$arrOutput = @() 
$Jobs = @() 
foreach($i in ('aaa','bbb','ccc')) { 

    $Import = {. $env:func1} 
    $Execute = {func1 -myArg $Using:i} 

    $Jobs += Start-Job -InitializationScript $Import -ScriptBlock $Execute 
} 

$JobsOutput = $Jobs | Wait-Job | Receive-Job 
$JobsOutput 

$Jobs | Remove-Job 
#Clean up env 
Remove-Item env:\func1 
$arrOutput 

func1.ps1

function func1($myArg) { write-output $myArg } 

func2.ps1

function func2($blah) { write-output $blah } 

答えて

0

あなたは単純に配列を作ることができますパスの、そしてパス[スタート] - [ジョブから-ArgumentListのparamでそれらのすべてのパス/の1:

#func1.ps1 
function add($inp) { 
    return $inp + 1 
} 

#func2.ps1 
function add($inp) { 
    return $inp + 2 
} 

$paths = "$PSScriptRoot\func1.ps1", "$PSScriptRoot\func2.ps1" 

$i = 0 
ForEach($singlePath in $paths) { 
    $Execute = { 
     Param(
      [Parameter(Mandatory=$True, Position=1)] 
      [String]$path 
     ) 
     Import-Module $path 
     return add 1 
    } 
    Start-Job -Name "Job$i" -ScriptBlock $Execute -ArgumentList $singlePath 
    $i++ 
} 

for ($i = 0; $i -lt 2; $i++) { 
    Wait-Job "Job$i" 
    [int]$result = Receive-Job "Job$i" 
} 

を名前を持つすべてのものを$ Iイテレータをスキップすることができ、PowerShellは自動的にジョブに名前を付け、イースリー予測可能になります。ジョブ1、JOB2 ...だから、コードをもっときれいにするでしょう。