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 回答