Share via


WMI コレクションから複数の項目を削除する

コレクションから複数の項目を削除しようとしても、一部の項目が削除されないことがあります。 コレクションから要素を削除すると、コレクション ポインターが次の要素に移動されるため、項目の削除中にコレクションを反復処理することはできません。 たとえば、コレクションからすべての項目を削除しようとすると、他のすべての項目が削除されます。 この問題は、SWbemQualifierSet.Remove メソッドと SWbemPropertySet.Remove メソッドで項目を削除するときに発生することがあります。 この問題は、コレクションをループ処理し、削除する項目の名前を配列に配置することで回避できます。 その後、その配列をループ処理し、配列内で指定されている項目を削除できます。 SWbemNamedValueSetSWbemPrivilegeSetSWbemRefresher などのコレクションには、リフレッシャー コンテナー内の全項目を削除するメソッドもあります。

次のスクリプトは、コレクションから一部の項目を削除する方法になっています。

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 では、親クラスのプロパティの既定値に継承プロパティがリセットされます。

詳細については、「クラスとインスタンス情報の操作」、「コレクションへのアクセス」、「コレクションからの単一の項目の削除」を参照してください。