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


Удаление нескольких элементов из коллекции 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 сбрасывает наследуемое свойство до значения по умолчанию свойства в родительском классе.

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