2017-03-29 3 views
1

を使用してCOM +アプリケーションから、一度にすべての成分を除去するための構文を持っていますコードが動作しているように見えますが、それは唯一のコンポーネントの半分を削除し、$indexループの残りのため、このエラーが返されます。誰もが、私はこれは私のPowerShellのコードであるをループしようとして問題を持って、私のCOM +アプリケーションから</p> <p>を91個のコンポーネントを削除していますPowerShellの

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

S私はそれを実行し続け、コンポーネントの数は半減し続けます。

私は、配列/コレクションは、残りのインデックスを再ソートし、毎回移動することを「削除」していると思います。だから、$indexが範囲外になる前に、私は半分しかかかりません。私がこれをやっていることがわかるのは唯一のことです。したがって、別のアプローチを試みました。

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

しかし、それはどちらも機能しません。

誰も一度にすべてのコンポーネントを削除する方法を知っていますか?それはあなたのコレクションのインデックスのように聞こえる

答えて

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++がのアイテムをスキップして、残りの最高インデックスを超える値に達して失敗するまで、が終了するようにしました。

一般的に、ループ本体のコレクションを変更しながらコレクションアイテムをアイテムごとループするのは問題です。

+0

第2のものは魅力的に働いた。最初はおそらく動作しますが、あなたの助言を得ることに決めました。そして、はい、私はインデックスが減少しているので私のバージョンが機能していなかった理由に同意します。 – JustJohn

関連する問題