Removendo vários itens de uma coleção WMI
Se você tentar remover mais de um item em uma coleção, poderá descobrir que alguns itens não foram removidos. Não é possível iterar uma coleção ao remover itens, pois quando você remove um elemento de uma coleção, o ponteiro da coleção é movido para o próximo elemento. Por exemplo, uma tentativa de remover todos os itens de uma coleção resulta na remoção de todos os outros itens. Você poderá ver esse problema ao remover itens com os métodos SWbemQualifierSet.Remove ou SWbemPropertySet.Remove. Você pode evitar esse problema fazendo loop pela coleção e colocando os nomes dos itens a serem removidos em uma matriz. Em seguida, você pode fazer loop pela matriz e excluir os itens nomeados na matriz. As coleções, como SWbemNamedValueSet, SWbemPrivilegeSete SWbemRefresher, também têm um método que exclui todos os itens no contêiner do atualizador.
O script a seguir ilustra como remover vários itens de uma coleção.
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
Você não pode remover propriedades e qualificadores em uma instância de classe ou classe derivada que tenha propriedades herdadas. Essa tentativa de exclusão gera um erro e a propriedade ou qualificador não é removida; Em vez disso, o WMI redefine a propriedade ou o qualificador para o valor padrão. No caso de uma classe derivada com propriedades herdadas, o WMI redefine a propriedade herdada para o valor padrão da propriedade na classe base.
Para obter mais informações, consulte Manipulação de Informações de Classe e Instância, Acesso a uma Coleção, e Remoção de um Único Item de uma Coleção.