从 WMI 集合中删除多个项

如果尝试移除集合中的多个项,可能会发现某些项未被移除。 在删除项时不能循环访问集合,因为从集合中删除元素时,集合指针将移动到下一个元素。 例如,尝试从集合中移除所有项会导致移除所有其他项。 使用 SWbemQualifierSet.RemoveSWbemPropertySet.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 会将继承的属性重置为父类中属性的默认值。

有关详细信息,请参阅操作类和实例信息访问集合从集合中移除单个项