Rimozione di più elementi da una raccolta WMI
Se si tenta di rimuovere più di un elemento in una raccolta, è possibile che alcuni elementi non vengano rimossi. Non è possibile eseguire l'iterazione di una raccolta durante la rimozione degli elementi, perché quando si rimuove un elemento da una raccolta, il puntatore alla raccolta viene spostato nell'elemento successivo. Ad esempio, un tentativo di rimuovere tutti gli elementi da una raccolta comporta la rimozione di ogni altro elemento. Questo problema potrebbe verificarsi quando si rimuoveno gli elementi con i metodi SWbemQualifierSet.Remove o SWbemPropertySet.Remove. È possibile evitare questo problema eseguendo il ciclo della raccolta e inserendo i nomi degli elementi da rimuovere in una matrice. È quindi possibile eseguire il ciclo attraverso la matrice ed eliminare gli elementi denominati nella matrice. Le raccolte, ad esempio SWbemNamedValueSet, SWbemPrivilegeSet e SWbemRefresher, dispongono anche di un metodo che elimina tutti gli elementi nel contenitore di aggiornamento.
Lo script seguente illustra come rimuovere diversi elementi da una raccolta.
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
Non è possibile rimuovere proprietà e qualificatori in un'istanza di classe o in una classe derivata che ha ereditato le proprietà. Tale tentativo di eliminazione genera un errore e la proprietà o il qualificatore non viene rimosso; WMI reimposta invece la proprietà o il qualificatore al valore predefinito. Nel caso di una classe derivata con proprietà ereditate, WMI reimposta la proprietà ereditata sul valore predefinito della proprietà nella classe padre.
Per altre informazioni, vedere Modifica delle informazioni sulla classe e sull'istanza, accesso a una raccolta e rimozione di un singolo elemento da una raccolta.