任何人都有使用Powershell

时间:2017-03-29 00:12:56

标签: powershell com+

我在尝试循环并从COM +应用程序中删除91个组件时遇到问题

这是我的Powershell代码:

$app = $apps | Where-Object {$_.Name -eq 'pkgAdap2'}
$compColl = $apps.GetCollection("Components", $app.Key)
$compColl.Populate()

$index = 0
foreach($component in $compColl) {

    $compColl.Remove($index)
    $compColl.SaveChanges()

    $index++
}

代码似乎有效,但它只删除组件的HALF,而对于$index的其余部分,循环返回此错误:

Value does not fall within the expected range.
At line:4 char:5
+     $compColl.Remove($index)
+     ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException

所以我继续运行它,剩下的组件数量减少了一半。

我认为原因是阵列/收藏我是"删除"从重新排序剩余的索引,每次都移动它们。所以我只能在$index超出范围之前通过一半。这是我能想到的唯一一件事。因此我也尝试了另一种方法:

while($compColl.Count > 0) {
    $compColl.Remove($compColl.Count)
}

但它也不起作用。

有谁知道如何一次删除所有组件?

1 个答案:

答案 0 :(得分:2)

听起来你的收藏品的索引是基于0的,所以以下内容应该有效:

while($compColl.Count > 0) {    
  $compColl.Remove($compColl.Count - 1) # remove last element, which updates .Count
}
$compColl.SaveChanges()

如果您确定该系列在您枚举时不会发生变化,则此变体的效率可能略高一些:

for ($i = $compColl.Count - 1; $i -ge 0; --$i) {
  $compColl.Remove($i)
}
$compColl.SaveChanges()

原始方法的问题在于,每个$compColl.Remove($index)调用都会隐式减少剩余项目的索引,以便$index++最终跳过项目,直到达到某个值超出剩余的最高指数而失败。

通常,在循环体中修改该集合时,逐项循环遍历集合会有问题。