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