在 powershell 工作流中添加一个项目到 arraylist foreach -parallel

add an item to arraylist in powershell workflow foreach -parallel

powershell 工作流程中使用 foreach -parallel 循环时,我们如何将项目添加到数组列表?

workflow foreachpsptest { 
  param([string[]]$list)
  $newList = [System.Collections.ArrayList]@()
  foreach –parallel ($item in $list){
    $num = Get-Random 
    InlineScript {
      ($USING:newList).add("$num---$item")
    }
  }
  Write-Output -InputObject "randomly created new List: $newList"
} 
$list = @("asd","zxc","qwe","cnsn")
foreachpsptest -list $list

我认为你做不到。 Powershell 工作流限制中的 This article 调用 "Method Invocation on Objects" 作为不受支持的 activity,因此您的数组列表中的 .add() 方法将不起作用。

这里的问题是你用错了,呃$using:

您的工作流程基本上是它自己的沙箱。您可以使用 $using 来实例化其中具有相同值的变量,但不能使用它来操作它之外的相同变量。

但是,您可以让工作流发出一个对象,然后使用 $newlist Arraylist 变量的 .Add() 方法捕获该对象。

像这样调整代码,它应该可以工作:

#Moved the Arraylist declaration outside
$newList = [System.Collections.ArrayList]@()

workflow foreachpsptest { 
param([string[]]$list)
foreach –parallel ($item in $list){
      $num = Get-Random 
      InlineScript {
      #use the using: context to pass along values, then emit the current object
      "$using:num---$using:item"
      }
}
} 

$list = @("asd","zxc","qwe","cnsn")
#kick off the workflow and capture results in our arraylist
$newList.add((foreachpsptest -list $list))

然后,代码有了运行之后,我们就可以把值取出来了,像这样

$newList
58665978---qwe
173370163---zxc
1332423298---cnsn
533382950---asd