HOWTO · PowerShell
Cómo eliminar un elemento de un array en PowerShell
Este tutorial te enseñará a eliminar un elemento de un array en PowerShell.
En esta página
Para quitar un elemento de una colección de PowerShell, primero identifica si tienes una matriz de tamaño fijo o un ArrayList. Una matriz no puede reducirse en el mismo lugar. Un ArrayList se puede modificar con Remove(), RemoveAt() o RemoveRange(). Para conservar determinados elementos de una matriz, usa el cmdlet ForEach-Object y asigna su salida a una variable.
Los ejemplos siguientes muestran cómo quitar elementos por valor, índice basado en cero, rango contiguo y condición. Los métodos de ArrayList modifican la colección existente; el filtrado produce un resultado nuevo. El texto visible de los ejemplos, incluidos los nombres de frutas y cualquier etiqueta de salida, se conserva en inglés.
Elegir entre una matriz de PowerShell y un ArrayList
Los literales de matriz de PowerShell, como $items = @('apple', 'banana', 'cherry'), crean matrices de tamaño fijo. Puedes reemplazar un elemento, pero no quitarlo directamente para reducir la longitud de la matriz. Si necesitas agregar y quitar elementos repetidamente, usa System.Collections.ArrayList. Sus métodos Remove(), RemoveAt() y RemoveRange() modifican la misma colección.
Usa una matriz cuando principalmente necesites leer o filtrar valores, o cuando el tamaño de la colección sea estable. Usa un ArrayList cuando necesites cambiar directamente qué elementos contiene. Si ya tienes una matriz, filtrar y asignar el resultado suele ser la forma más clara de obtener una matriz más pequeña.
Quitar un elemento por valor con Remove()
Llama a Remove() con el valor que quieres quitar. El método elimina el primer elemento coincidente de un ArrayList; no elimina todos los duplicados. El ejemplo siguiente empieza con una lista de frutas y quita banana.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en 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
La llamada modifica el propio $items. Si el valor puede aparecer más de una vez y quieres quitar todas las coincidencias, filtra la colección mediante una condición.
Quitar un elemento por índice con RemoveAt()
Usa RemoveAt() cuando conozcas la posición. Los índices de ArrayList empiezan en cero, así que el índice 1 corresponde al segundo elemento. Al quitar un elemento, los posteriores se desplazan a la izquierda y sus índices cambian; determina el índice objetivo a partir de la colección actual justo antes de quitarlo.
El código y las etiquetas o salidas visibles de esta sección se mantienen en 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
El ejemplo quita el elemento del índice 1 de esta lista de tres elementos. Antes de llamar al método, comprueba que el índice esté entre 0 y $items.Count - 1. Un índice fuera de ese rango provoca un error en tiempo de ejecución, y quitar un elemento anterior cambia los índices de los elementos que le siguen.
Quitar un rango con RemoveRange()
RemoveRange(startIndex, count) quita un grupo contiguo de un ArrayList. El primer argumento es el índice basado en cero donde comienza la eliminación; el segundo indica cuántos elementos quitar, no el índice final. Por ejemplo, el índice inicial 1 y el recuento 2 quitan el segundo y el tercer elemento.
El código y las etiquetas o salidas visibles de esta sección se mantienen en 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
El rango debe caber en la lista actual. Si el recuento es mayor que cero, el índice inicial debe señalar un elemento existente y el recuento no puede extenderse más allá del final. Si el recuento es cero, no se quita ningún elemento y el índice inicial puede estar entre 0 y el Count actual, incluido el propio Count. Si los valores proceden de datos del usuario o de cálculos, comprueba ambos argumentos con respecto al Count actual antes de llamar a RemoveRange().
Filtrar una matriz con ForEach-Object
ForEach-Object es un cmdlet, no un método. En una canalización, procesa cada elemento de entrada y emite los que cumplen la condición. Asigna esa salida a una variable para crear la matriz filtrada; la matriz de origen no cambia, a menos que vuelvas a asignar el resultado a la misma variable.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
$items = @('apple', 'banana', 'cherry', 'date', 'elderberry')
$items = $items | ForEach-Object {
if ($_ -notlike '*a*') {
$_
}
}
$items
cherry
elderberry
En este caso, la condición conserva las cadenas que no contienen a, por lo que los valores retenidos son cherry y elderberry. Cambia la condición para que coincida con los valores que quieras conservar. Este método resulta útil cuando la eliminación depende de una propiedad o regla, en lugar de un valor o una posición conocidos.
Comprobar el resultado y evitar errores comunes
Elige la operación según lo que sepas: usa Remove() para quitar el primer valor coincidente de un ArrayList, RemoveAt() para una posición conocida basada en cero y RemoveRange() para posiciones consecutivas. Usa ForEach-Object cuando una condición determine qué elementos conservar y asigna su salida si quieres reemplazar la variable de matriz original.
Recuerda que los tres métodos de ArrayList modifican la lista, mientras que el filtrado devuelve los elementos conservados para que los asignes. Si necesitas quitar todas las apariciones de un valor, es más apropiado filtrar mediante una condición que hacer una sola llamada a Remove(). Después de los cambios basados en índices, vuelve a calcular las posiciones a partir de la colección actualizada y valida los argumentos de índice y rango con respecto al recuento actual.