Quitar varios elementos de una colección WMI

Si intenta quitar más de un elemento de una colección, es posible que no se quiten algunos elementos. No se puede iterar una colección mientras se quitan elementos, ya que cuando se quita un elemento de una colección, el puntero de colección se mueve al siguiente elemento. Por ejemplo, un intento de quitar todos los elementos de una colección da como resultado la eliminación de todos los demás elementos. Es posible que vea este problema al quitar elementos con los métodos SWbemQualifierSet.Remove o SWbemPropertySet.Remove. Puede evitar este problema si recorre en bucle la colección y coloca los nombres de los elementos que se van a quitar en una matriz. A continuación, puede recorrer la matriz y eliminar los elementos denominados en la matriz. Las colecciones, como SWbemNamedValueSet, SWbemPrivilegeSet y SWbemRefresher, también tienen un método que elimina todos los elementos del contenedor del actualizador.

El siguiente script muestra cómo quitar varios elementos de una colección.

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

No se pueden quitar propiedades y calificadores en una instancia de clase ni en una clase derivada que tenga propiedades heredadas. Este tipo de intento de eliminación genera un error y la propiedad o calificador no se quita; en su lugar, WMI restablece la propiedad o calificador al valor predeterminado. En el caso de una clase derivada con propiedades heredadas, WMI restablece la propiedad heredada al valor predeterminado de la propiedad en la clase primaria.

Para más información, vea Manipular información de clase e instancia, Obtener acceso a una colección y Quitar un único elemento de una colección.