HOWTO · PowerShell
Come rimuovere un elemento da un array in PowerShell
Questo tutorial ti insegnerà a rimuovere un elemento da un array in PowerShell.
In questa pagina
Per rimuovere un elemento da una raccolta PowerShell, verifica innanzitutto se si tratta di un array a dimensione fissa o di un ArrayList. Un array non può essere ridotto direttamente. Un ArrayList può essere modificato con Remove(), RemoveAt() o RemoveRange(). Per mantenere alcuni elementi di un array, usa il cmdlet ForEach-Object e assegna il risultato a una variabile.
Gli esempi seguenti mostrano come rimuovere elementi in base al valore, all’indice a base zero, a un intervallo contiguo o a una condizione. I metodi di ArrayList modificano la raccolta esistente; il filtraggio produce un nuovo risultato.
Scegliere tra un array di PowerShell e un ArrayList
I letterali di array di PowerShell, come $items = @('apple', 'banana', 'cherry'), creano array a dimensione fissa. Puoi sostituire un elemento, ma non rimuoverlo direttamente riducendo la lunghezza dell’array. Per una raccolta a cui occorre aggiungere e da cui occorre rimuovere elementi ripetutamente, usa System.Collections.ArrayList. I metodi Remove(), RemoveAt() e RemoveRange() modificano la stessa raccolta.
Usa un array quando devi soprattutto leggere o filtrare i valori, oppure quando la dimensione della raccolta è stabile. Scegli un ArrayList se devi modificare direttamente gli elementi presenti. Se hai già un array, filtrarlo e assegnare il risultato è in genere il modo più chiaro per ottenere un array più piccolo.
Rimuovere un elemento in base al valore con Remove()
Chiama Remove() specificando il valore da eliminare. Il metodo rimuove la prima corrispondenza da un ArrayList, ma non elimina tutti i duplicati. L’esempio seguente parte da un elenco di frutti e rimuove banana.
Esegui questo esempio:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
$items = [System.Collections.ArrayList]::new()
[void]$items.Add('apple')
[void]$items.Add('banana')
[void]$items.Add('cherry')
$items.Remove('banana')
$items
apple
cherry
La chiamata modifica direttamente $items. Se il valore può comparire più volte e vuoi rimuovere tutte le corrispondenze, filtra invece la raccolta usando una condizione.
Rimuovere un elemento in base all’indice con RemoveAt()
Usa RemoveAt() quando conosci la posizione dell’elemento. Gli indici di ArrayList partono da zero, quindi l’indice 1 indica il secondo elemento. Quando ne rimuovi uno, gli elementi successivi si spostano a sinistra e i loro indici cambiano; determina l’indice da rimuovere usando la raccolta corrente, subito prima della rimozione.
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
$items = [System.Collections.ArrayList]::new()
[void]$items.Add('apple')
[void]$items.Add('banana')
[void]$items.Add('cherry')
$items.RemoveAt(1)
$items
apple
cherry
L’esempio rimuove l’elemento all’indice 1 da un elenco di tre elementi. Prima di chiamare il metodo, verifica che l’indice sia compreso tra 0 e $items.Count - 1. Un indice fuori da questo intervallo causa un errore di runtime; inoltre, la rimozione di un elemento precedente cambia gli indici degli elementi che lo seguono.
Rimuovere un intervallo con RemoveRange()
RemoveRange(startIndex, count) rimuove un gruppo contiguo da un ArrayList. Il primo argomento è l’indice a base zero da cui inizia la rimozione; il secondo indica quanti elementi rimuovere, non un indice finale. Per esempio, l’indice iniziale 1 e il conteggio 2 rimuovono il secondo e il terzo elemento.
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
$items = [System.Collections.ArrayList]::new()
[void]$items.Add('apple')
[void]$items.Add('banana')
[void]$items.Add('cherry')
[void]$items.Add('date')
[void]$items.Add('elderberry')
$items.RemoveRange(1, 2)
$items
apple
date
elderberry
L’intervallo deve rientrare nella lunghezza corrente dell’elenco. Se il conteggio è maggiore di zero, l’indice iniziale deve identificare un elemento esistente e il conteggio non può oltrepassare la fine dell’elenco. Un conteggio pari a zero non rimuove nulla e può usare un indice iniziale da 0 fino al Count corrente, compreso Count. Se i valori derivano da input dell’utente o da calcoli, verifica entrambi gli argomenti rispetto al Count corrente prima di chiamare RemoveRange().
Filtrare un array con ForEach-Object
ForEach-Object è un cmdlet, non un metodo. In una pipeline elabora ogni elemento ricevuto e restituisce quelli che soddisfano la condizione. Assegna il risultato a una variabile per creare l’array filtrato; l’array sorgente rimane invariato, a meno che tu non assegni il risultato di nuovo alla stessa variabile.
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
$items = @('apple', 'banana', 'cherry', 'date', 'elderberry')
$items = $items | ForEach-Object {
if ($_ -notlike '*a*') {
$_
}
}
$items
cherry
elderberry
In questo caso la condizione mantiene le stringhe che non contengono a, quindi i valori conservati sono cherry ed elderberry. Modifica la condizione in base ai valori che vuoi mantenere. Questo approccio è utile quando la rimozione dipende da una proprietà o da una regola, anziché da un valore o da una posizione specifici.
Verificare il risultato ed evitare gli errori più comuni
Scegli l’operazione in base a ciò che sai: usa Remove() per rimuovere la prima corrispondenza di un valore da un ArrayList, RemoveAt() per una posizione nota a base zero e RemoveRange() per posizioni consecutive. Usa ForEach-Object quando una condizione determina quali elementi mantenere, poi assegnane il risultato se vuoi sostituire la variabile dell’array originale.
Ricorda che i tre metodi di ArrayList modificano l’elenco, mentre il filtraggio restituisce gli elementi conservati da assegnare a una variabile. Se devi rimuovere tutte le occorrenze di un valore, è più adatto un filtro basato su una condizione che una singola chiamata a Remove(). Dopo modifiche basate sugli indici, ricalcola le posizioni nella raccolta aggiornata e verifica gli argomenti di indice e intervallo rispetto al conteggio corrente.