コレクション内の複数の項目を削除しようとすると、一部の項目が削除されないことがあります。 コレクションから要素を削除すると、コレクション ポインターが次の要素に移動するため、項目の削除中にコレクションを反復処理することはできません。 たとえば、コレクションからすべての項目を削除しようとすると、他のすべての項目が削除されます。 SWbemQualifierSet.Remove または SWbemPropertySet.Remove メソッドを使用して項目を削除すると、この問題が発生することがあります。 コレクションをループ処理し、削除する項目の名前を配列に配置することで、この問題を回避できます。 その後、配列をループ処理し、配列内の名前の項目を削除できます。 SWbemNamedValueSet、SWbemPrivilegeSet、SWbemRefresherなどのコレクションには、リフレッシャー コンテナー内のすべての項目を削除するメソッドもあります。
次のスクリプトは、コレクションから複数の項目を削除する方法を示しています。
Const WBEM_CIMTYPE_STRING = 8 ' Value for string data type
Dim names()
Redim names (0)
set objSWbemService = GetObject("winmgmts:root\default")
set objClass = ObjSWbemService.Get()
Wscript.Echo "Creating class NewClass"
objClass.Path_.Class = "NewClass"
For i = 1 to 5
objClass.Properties_.Add "Prop" & i, WBEM_CIMTYPE_STRING
Next
objClass.Put_
Getprops()
' Get all the property names in an array
For Each oprop in objClass.properties_
Redim Preserve names(Ubound(names)+1)
names(Ubound(names)-1) = oprop.name
Next
Wscript.Echo "Remove first 3 properties using array of names:"
For i = Lbound(names) to Ubound(names)-1
If (i < 3) Then
Wscript.Echo "Removing " & names(i)
objClass.Properties_.Remove names(i)
End If
Next
objClass.Put_
Wscript.Echo "Result:"
Getprops()
Sub Getprops()
Wscript.Echo "Number of properties = " _
& objClass.Properties_.Count
For Each oprop in objClass.Properties_
Wscript.Echo oprop.name
Next
End Sub
継承されたプロパティを持つクラス インスタンスまたは派生クラスのプロパティと修飾子を削除することはできません。 このような削除を試みるとエラーが発生し、プロパティまたは修飾子は削除されません。代わりに、WMI はプロパティまたは修飾子を既定値にリセットします。 継承されたプロパティを持つ派生クラスの場合、WMI は継承されたプロパティを親クラスのプロパティの既定値にリセットします。
詳細については、「クラスとインスタンス情報の操作、コレクション へのアクセス、コレクション からの単一項目の削除を参照してください。