Поделиться через


Удаление нескольких элементов из коллекции WMI

Если вы пытаетесь удалить несколько элементов в коллекции, возможно, некоторые элементы не удаляются. Невозможно выполнить итерацию коллекции при удалении элементов, так как при удалении элемента из коллекции указатель коллекции перемещается на следующий элемент. Например, попытка удалить все элементы из коллекции приводит к удалению каждого другого элемента. Эта проблема может возникнуть при удалении элементов с помощью методов 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 сбрасывает унаследованное свойство в значение по умолчанию свойства в родительском классе.

Дополнительные сведения см. в разделах работы с информацией о классах и экземплярах, доступа к коллекциии удаления одного элемента из коллекции.