0

ドメイン内のすべてのサーバーに接続するスクリプトがあります。次に、スクリプトは各サーバーをループして、ローカル管理者とグループのネストされたメンバーを取得し、それらをPSObjectに配置して、後でPSObjectをCSVにエクスポートできるようにします。

ここで、パラメーターを渡すstart-jobを使用して関数を呼び出す方法と、既存のスクリプト内でその関数からの出力を利用できる方法について混乱しています。

だから私が次のことをすると仮定しましょう:

function addnumbers{
param([int]$a, [int]$b)
[int]$c = $a + $b
$myobj = new-object PSObject
$myobj += $c
return $myobj
}

$exportdetail = @()

[int[]]$numbers = @(1,2,3,4)

foreach ($number in $numbers)
{
   $newobj = new-object PSObject
   $newobj = addnumbers $number
   $exportdetail += $newobj        
}

 $exportdetail | export-csv -notype "c:\export.csv"

ループをスレッド化するために、次のようにします。

    function addnumbers{
param([int]$a, [int]$b)
[int]$c = $a + $b
$myobj = new-object PSObject
$myobj += $c
return $myobj
}

$exportdetail = @()

[int[]]$numbers = @(1,2,3,4)

foreach ($number in $numbers)
{
   $ScriptBlock {
   param($num)
   $newobj = new-object PSObject
   $newobj = addnumbers $num
   }
   start-job -ScriptBlock $ScriptBlock -ArgumentList $number
   $exportdetail += $newobj        
}

 $exportdetail | export-csv -notype "c:\export.csv"

それらのオブジェクトは、exportdetail全体オブジェクトに更新されますか?

コードを実行すると、個々のスレッドが開始されますが、データは返されません。

4

1 に答える 1

0

ヘルプから:Start-Job returns an object that represents the job that it started. これは、Start-Job から結果を取得せず、結果を保持するジョブへの参照のみを取得することを意味します。

したがって、結果を取得するには、次のようにジョブ (結果が保存される場所) を受け取る必要があります。

    $job = start-job -ScriptBlock $ScriptBlock -ArgumentList $number
    $exportdetail += $job
}
Wait-Job $exportdetail
Receive-Job $exportdetail | export-csv -notype "c:\export.csv"

基本的に、番号ごとにバックグラウンド ジョブを作成し、ジョブへの参照をジョブの配列に追加します。最後に、すべてのジョブが終了するのを待ってから、結果を受け取ります。

于 2013-03-29T14:07:24.990 に答える