HOWTO · PowerShell
Como remover um item de um array no PowerShell
Este tutorial vai te ensinar a remover um item de um array no PowerShell.
Nesta página
Para remover um item de uma coleção PowerShell, primeiro identifique se você tem um array de tamanho fixo ou um ArrayList. Um array não pode ser reduzido no próprio lugar. Um ArrayList pode ser alterado com Remove(), RemoveAt() ou RemoveRange(). Para manter itens selecionados de um array, use o cmdlet ForEach-Object e atribua a saída a uma variável.
Os exemplos a seguir mostram como remover por valor, índice baseado em zero, intervalo contíguo e condição. Os métodos de ArrayList alteram a coleção existente; a filtragem produz um novo resultado.
Escolha entre um array do PowerShell e um ArrayList
Literais de array do PowerShell, como $items = @('apple', 'banana', 'cherry'), criam arrays de tamanho fixo. Você pode substituir um elemento, mas não pode removê-lo no próprio lugar e reduzir o tamanho do array. Para uma coleção que precise de adições e remoções frequentes, use System.Collections.ArrayList. Os métodos Remove(), RemoveAt() e RemoveRange() alteram a própria coleção.
Use um array quando precisar principalmente ler ou filtrar valores, ou quando o tamanho da coleção for estável. Use um ArrayList quando precisar alterar diretamente os itens da coleção. Se você já tiver um array, filtrá-lo e atribuir o resultado costuma ser a maneira mais clara de obter um array menor.
Remova um item por valor com Remove()
Chame Remove() com o valor a remover. O método remove a primeira ocorrência correspondente de um ArrayList; ele não remove todas as duplicatas. O exemplo a seguir começa com uma lista de frutas e remove banana.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
$items = [System.Collections.ArrayList]::new()
[void]$items.Add('apple')
[void]$items.Add('banana')
[void]$items.Add('cherry')
$items.Remove('banana')
$items
apple
cherry
A chamada altera o próprio $items. Se o valor puder aparecer mais de uma vez e você quiser remover todas as ocorrências, filtre a coleção por uma condição.
Remova um item pelo índice com RemoveAt()
Use RemoveAt() quando souber a posição. Os índices de ArrayList começam em zero, então o índice 1 corresponde ao segundo item. Ao remover um item, os seguintes avançam uma posição e seus índices mudam; determine o índice desejado com base na coleção atual, imediatamente antes da remoção.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
$items = [System.Collections.ArrayList]::new()
[void]$items.Add('apple')
[void]$items.Add('banana')
[void]$items.Add('cherry')
$items.RemoveAt(1)
$items
apple
cherry
O exemplo remove o item no índice 1 desta lista de três itens. Antes de chamar o método, verifique se o índice está entre 0 e $items.Count - 1. Um índice fora desse intervalo causa um erro em tempo de execução, e a remoção de um item anterior altera os índices dos itens seguintes.
Remova um intervalo com RemoveRange()
RemoveRange(startIndex, count) remove um grupo contíguo de um ArrayList. O primeiro argumento é o índice baseado em zero onde a remoção começa; o segundo é a quantidade de itens a remover, e não um índice final. Por exemplo, o índice inicial 1 e a quantidade 2 removem o segundo e o terceiro itens.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
$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
O intervalo precisa caber na lista atual. Se a quantidade for maior que zero, o índice inicial deve identificar um item existente, e a quantidade não pode ultrapassar o final da lista. Uma quantidade igual a zero não remove nada e permite um índice inicial de 0 até o Count atual, inclusive o próprio Count. Quando os valores vierem de uma entrada do usuário ou de cálculos, confira ambos os argumentos em relação ao Count atual antes de chamar RemoveRange().
Filtre um array com ForEach-Object
ForEach-Object é um cmdlet, não um método. Em um pipeline, ele processa cada item recebido e emite os itens que satisfazem a condição. Atribua essa saída a uma variável para criar o array filtrado; o array de origem permanece inalterado, a menos que você atribua o resultado novamente à mesma variável.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
$items = @('apple', 'banana', 'cherry', 'date', 'elderberry')
$items = $items | ForEach-Object {
if ($_ -notlike '*a*') {
$_
}
}
$items
cherry
elderberry
Neste exemplo, a condição mantém as strings que não contêm a, portanto os valores mantidos são cherry e elderberry. Altere a condição para corresponder aos valores que deseja manter. Essa abordagem é útil quando a remoção depende de uma propriedade ou regra, em vez de um valor ou posição conhecidos.
Confira o resultado e evite erros comuns
Escolha a operação de acordo com o que você sabe: use Remove() para remover a primeira ocorrência de um valor em um ArrayList, RemoveAt() para uma posição conhecida baseada em zero e RemoveRange() para posições consecutivas. Use ForEach-Object quando uma condição determinar quais itens devem permanecer e atribua a saída se quiser substituir a variável do array original.
Lembre-se de que os três métodos de ArrayList alteram a lista, enquanto a filtragem retorna os itens mantidos para atribuição. Se precisar remover todas as ocorrências de um valor, um filtro baseado em condição é mais apropriado do que uma única chamada a Remove(). Após alterações baseadas em índice, recalcule as posições usando a coleção atualizada e valide os argumentos de índice e intervalo em relação à quantidade atual.