foreach循环:如何在循环内更新集合变量?

时间:2018-07-17 13:25:01

标签: powershell loops foreach

是否有一种方法可以更改行为,使得无法从循环内部更新循环的集合变量,并在下一次迭代中使用新值?

例如:

$items = @(1,1,1,2)
$counter = 0

foreach ($item in $items) {
    $counter += 1
    Write-Host "Iteration:" $counter " | collection variable:" $items
    $item
    $items = $items | Where-Object {$_ -ne $item}
}

$counter

如果运行此代码,循环将执行多次。 但是,由于第一次迭代$items1,1,1,2更改为仅包含2,因此循环应该只运行一次。

我怀疑这是因为收集变量$items在foreach部分中没有更新。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:2)

您不能将foreach循环与正在循环主体中修改的集合一起使用。

尝试这样做实际上会导致错误Collection was modified; enumeration operation may not execute.

没有看到错误的原因是您实际上并没有修改原始集合;您正在将 new 集合实例分配给相同的变量,但这与所枚举的原始集合实例无关。

您应该改为使用while循环,在这种情况下,$items变量引用将在每次迭代中重新求值:

$items = 1, 1, 1, 2
$counter = 0

while ($items) { # Loop as long as the collection has at last 1 item.
  $counter += 1
  Write-Host "Iteration: $counter | collection variable: $items"
  $item = $items[0] # access the 1st element
  $item # output it
  $items = $items | Where-Object {$_ -ne $item} # filter out all elements with the same val.
}

现在您只有2次迭代:

Iteration: 1 | collection variable: 1 1 1 2
1
Iteration: 2 | collection variable: 2
2