2017-08-03 6 views
1

まず、PowerShellインスタンスを作成して、自分の機能を開始できるようにしました。そのスクリプト:Powershell-Instancesを複数のループ内で作成して管理する

$list = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 
$row = $list.Rows[1] 

$code = { 
    param($var) 
    $var[0] +"\"+ $var[1] 
    #Stuff that has to be done 
} 

$newPS = [PowerShell]::Create().AddScript($code).AddArgument($row) 
$job = $newPS.BeginInvoke() 

while (-not $job.IsCompleted) {} 

$result = $newPS.EndInvoke($job) 
$newPS.Dispose() 

$result 

これまでのところとても良いです。 しかし、今私は次のレベルに到達し、私のDatatableのすべての要素のPowershellインスタンスを作成しようとしています。これは次のようなものです:

$list = [System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources() 

$code = { 
    param($var) 
    $var[0] +"\"+ $var[1] 
    #Stuff that has to be done 
    #Start-Sleep -s 1 
    } 


$PSCount= 1 

#start der Funktion 
foreach($row in $list) 
    { 
    $newPS[$PSCount] = [PowerShell]::Create().AddScript($code).AddArgument($row) 
    $job[$PSCount] = $newPS[$PSCount].BeginInvoke() 
    $PSCount++ 
    } 



#warten bis alle Jobs kompletiert sind 
#Ergebnisse verarbeiten und PS-Instanzen beenden 
for($i=1; $i -eq $PSCount; $i++) 
    { 
    while (-not $job[$i].IsCompleted) {} 

    $result = $newPS[$i].EndInvoke($job[$i]) 
    $newPS[$i].Dispose() 
    $result[0] 
    } 

しかし、私はインデックスを作成できません。

New-Variable -name "newPS$PSCount" -value '[PowerShell]::Create().AddScript($code).AddArgument($row)' 

しかし、私は、メソッド「BeginInvokeメソッド()」や変数自体を呼び出す方法を知らない:私はまた、代わりに配列を作るのPowerShellの変数を連結してみました。

+0

2つ以上の要素を持つ配列として '$ newPs'と' $ job'を初期化しましたか? '$ PSCount = 0'で始まり、' $ newPS + = ... 'で2つの配列に追加することをお勧めします – arco444

+0

ここで最終目標は何ですか?同じrunspaceでN個のpowershellインスタンスを非同期に呼び出すことは、N回の反復ループで作業を行うよりも、メモリとプロセッサの負荷が大きくなります。 –

+0

@ arco444:驚くべきことに、問題を解決しました。どうもありがとうございました。 –

答えて

0

arco444と同様に、$newPS$jobに初期化し、$newPS += ...のような配列を追加して問題を解決しました。

関連する問題