2016-08-29 14 views
0

私は複数のジョブを持っており、すべてのジョブに対していくつかのものを設定する同じ初期化スクリプトが必要です。いくつかの引数を初期化スクリプトに渡したいと思いますが、残念ながら-ArgumentListを使って渡された引数は、実際のジョブスクリプトでのみアクセス可能なようです。ジョブ初期化スクリプトへの引数の受け渡し

はここだけで、実際のスクリプトでアクセス可能な引数を示しています例です:

function StartJob([ScriptBlock] $script, [string] $name, [ScriptBlock] $initialization_script = $null, $argument = $null) 
{ 
    Start-Job -ScriptBlock $script -Name $name -InitializationScript $initialization_script -ArgumentList $argument | Out-Null 
} 

[ScriptBlock] $initialization_script = 
{ 
    # The argument given to StartJob should be accessible here 
    param($test) 
    echo "Test: $test" 
} 

[ScriptBlock] $actual_script = 
{ 
    param($test) 
    echo "Test: $test" 
} 

StartJob $actual_script "Test job" $initialization_script "Have this string in the `$initialization_script" 

@(Get-Job).ForEach({ 
    # Wait for the job to finish, remove it and output its results 
    Write-Host "$($_.Name) results:" 
    Receive-Job -Job $_ -Wait -AutoRemoveJob | Write-Host 
}) 

どのように私は$initialization_scriptに渡される引数にアクセスすることができるだろうか?

+0

私はあなたができるとは思いません。目的は何ですか? –

+0

@ MathiasR.Jessen作業ディレクトリのすべてのジョブに対してロードするモジュールがありますが、新しいジョブは現在の作業ディレクトリが何であるか分かりません。あるいは、すべてのスクリプト自体でモジュールをインポートすることもできますが、それは非常にきれいな解決策のようには見えません。 – tambre

+0

個人的意見:あなただけを保存するラッパーです。 Out-Nullは無駄です。コピー/貼り付けができます。 –

答えて

0

AFAIK初期化スクリプトにパラメータを渡すことはできません。 Initスクリプトは、既知のリソースをロードするために再利用可能なscripblockになるように設計されています。一度定義できないものは、そのジョブのスクリプトブロックに固有のもので、initには属しません。スクリプト。あなたはモジュール(.psm1と多分.psd1)を持っている場合は、モジュールのいずれかのフォルダに置く

  • (パスの$env:PSModulePathを参照)ので、単にあなたの中にImport-Module MyImportantModuleを書くことができます:あなたは、いくつかの選択肢を持っています初期化スクリプト。

  • 上記のソリューションを使用できない場合は、実際のスクリプトにパラメータを追加して、パスに通常の引数として渡します。

    [ScriptBlock] $actual_script = 
    { 
        # The argument given to StartJob should be accessible here 
        param($test, $ModulePath) 
    
        #Import-Module $ModulePath 
    
        echo "Test: $test" 
    } 
    
    Start-Job -ScriptBlock $actual_script -Name "Test job" -ArgumentList "First argument", "c:\mymodule.ps1" 
    
  • それともそれはダイナミックですので、あなたのスクリプトで初期化スクリプトブロックを生成することがありました:

    $ModulePath = "c:\mymodule.ps1" 
    
    $init = @" 
    
    #Import-Module "$ModulePath" 
    #Something-Else 
    
    "@ 
    
    $initsb = [scriptblock]::Create($init) 
    
+0

モジュールのインポートやその他のリソース読み込みは、初期化スクリプトに値(外部の$ PSScriptRootやcwdなど)を渡す必要がある理由の理由です。PSModulePathはモジュールがグローバルclobberは大丈夫です。 – user2864740

関連する問題