HOWTO · PowerShell

Cómo crear un arreglo, una tabla hash y un diccionario en PowerShell

Aprenda a crear y usar arreglos, tablas hash y diccionarios ordenados en PowerShell con esta guía completa. Comprenda las diferencias clave, cómo acceder a los elementos, añadirlos y eliminarlos, y cuándo usar cada estructura de datos. Incluye ejemplos prácticos, casos de uso del mundo real y una sección de preguntas frecuentes para ayudarle a dominar los scripts de PowerShell y la manipulación de datos de manera eficiente. Perfecto para principiantes y usuarios avanzados que buscan mejorar la automatización y la organización de datos en PowerShell.

En esta página

Elija un arreglo (@()) para una secuencia de valores, una tabla hash (@{}) para la búsqueda por clave-valor y un diccionario ordenado ([ordered]@{}) cuando deba conservarse el orden en que se añadieron las claves. Los ejemplos siguientes son fragmentos de PowerShell autónomos. No se dispone de observaciones de tiempo de ejecución para estos ejemplos, por lo que no se afirma ninguna salida.

Crear arreglos en PowerShell

Un arreglo almacena varios valores en una variable. Los índices de los arreglos de PowerShell empiezan en cero, y -1 hace referencia al último elemento. @() recoge explícitamente los resultados como un arreglo, incluso cuando un comando devuelve un único valor. Ejecute este ejemplo:

$items = @('apple', 'banana', 'cherry')
$items[0]
$items[-1]
$items += 'date'
$items = @($items | Where-Object { $_ -ne 'banana' })
$items -join ', '

El ejemplo lee el primer y el último valor, añade un valor y luego asigna un arreglo filtrado que excluye banana. Los arreglos de PowerShell tienen un tamaño fijo; += crea un arreglo resultante y lo vuelve a asignar, por lo que añadir repetidamente a un arreglo grande puede requerir copias repetidas. Para adiciones y eliminaciones frecuentes, una colección mutable como System.Collections.Generic.List[object] puede ser más adecuada. Para inspeccionar el tipo de un arreglo, utilice $items.GetType().FullName; @() produce un Object[] para estos valores de cadena.

Trabajar con tablas hash en PowerShell

Una tabla hash de PowerShell asigna claves a valores. Cree una con @{}, lea una entrada con la notación de corchetes, asigne una clave para añadir o sustituir una entrada, y llame a .Remove() para eliminar una. Los corchetes funcionan de manera fiable para nombres de clave arbitrarios; la notación de punto es cómoda cuando una clave es un nombre simple similar a una propiedad, pero puede entrar en conflicto con miembros integrados como Count.

$inventory = @{ Fruit = 'Apple'; Color = 'Red'; Count = 5 }
$inventory['Color']
$inventory['Shape'] = 'Round'
$inventory.Remove('Color')
$inventory.GetEnumerator() | Sort-Object Name | ForEach-Object {
    "{0}={1}" -f $_.Name, $_.Value
}

La última canalización ordena las entradas emitidas por clave para su visualización. No reordena ni sustituye la tabla hash original. Las claves de las tablas hash de PowerShell no distinguen entre mayúsculas y minúsculas por defecto; utilice una colección diferente cuando la semántica de comparación de claves deba ser distinta.

Crear diccionarios ordenados en PowerShell

El literal [ordered] crea un diccionario ordenado y conserva el orden en que se insertaron las entradas. Acceda a las entradas y actualícelas con claves igual que en una tabla hash. El orden de inserción es distinto de la ordenación alfabética: el orden original sigue siendo la secuencia de inserción a menos que ordene explícitamente un resultado separado.

$settings = [ordered]@{ Name = 'Delft'; Region = 'South Holland'; Active = $true }
$settings['Region']
$settings['Timezone'] = 'Europe/Amsterdam'
$settings.GetEnumerator() | ForEach-Object {
    "{0}={1}" -f $_.Key, $_.Value
}

Tabla hash frente a diccionario ordenado: diferencias clave

| Característica | Tabla hash | Diccionario ordenado |
| Literal de PowerShell | @{} | [ordered]@{} |
| Modelo de datos | Las claves se asignan a valores | Las claves se asignan a valores |
| Orden de iteración | No confíe en el orden de inserción | Conserva el orden de inserción |
| Leer o actualizar una entrada | $table['key'] | $dictionary['key'] |
| Más adecuado para | Búsqueda por clave cuando el orden de visualización no es importante | Datos clave-valor cuyo orden de inserción importa |

Una tabla hash de PowerShell no es lo mismo que cualquier tipo de diccionario de .NET. System.Collections.Hashtable es un tipo de .NET utilizado por el literal @{} de PowerShell, mientras que .NET también proporciona otras implementaciones de diccionario con su propio comportamiento de ordenación y comparación. Elija en función del tipo y el comportamiento concretos que necesite su código. Evite suponer que cualquiera de las dos colecciones es más rápida sin medir la carga de trabajo real.

Casos de uso prácticos

Utilice un diccionario ordenado para campos de usuario o de configuración cuando la salida deba seguir una secuencia elegida. Utilice una tabla hash para contar palabras por clave. Estos ejemplos muestran ambas tareas; el código es autónomo y no se afirma ninguna salida para él.

$user = [ordered]@{
    Name = 'John Doe'
    Email = 'johndoe@example.com'
    Role = 'Admin'
}
$user.GetEnumerator() | ForEach-Object { "{0}: {1}" -f $_.Key, $_.Value }

$text = 'apple banana apple orange apple banana'
$wordCount = @{}
$text.Split() | ForEach-Object {
    if ($wordCount.ContainsKey($_)) {
        $wordCount[$_] += 1
    } else {
        $wordCount[$_] = 1
    }
}
$wordCount.GetEnumerator() | Sort-Object Name | ForEach-Object {
    "{0}: {1}" -f $_.Name, $_.Value
}

Conclusión

Utilice arreglos para secuencias ordenadas que procese por posición, tablas hash para la búsqueda basada en claves y diccionarios ordenados cuando la secuencia de inserción forme parte de los datos que presenta. Recuerde que += en los arreglos asigna un arreglo nuevo, que el filtrado devuelve un resultado que hay que asignar, y que ordenar las entradas enumeradas de una tabla hash cambia el resultado mostrado en lugar de la tabla en sí.

Preguntas frecuentes (FAQ)

¿Cuál es la diferencia entre una tabla hash y un diccionario en PowerShell?

En el uso diario de PowerShell, «diccionario» puede describir una estructura general de clave-valor, y @{} crea una tabla hash de PowerShell respaldada por el tipo System.Collections.Hashtable de .NET. La biblioteca de clases de .NET también tiene tipos de diccionario propios, así que compruebe el tipo concreto cuando las API requieran una implementación determinada.

¿Cómo añado o elimino elementos de un arreglo de PowerShell?

Añada con $array += 'newItem' y luego asigne el resultado de nuevo a la variable. Para eliminar los valores coincidentes, filtre y asigne el resultado, por ejemplo $array = @($array | Where-Object { $_ -ne 'itemToRemove' }). Estas operaciones producen un arreglo como resultado; no redimensionan el arreglo existente en su sitio.

¿Puedo ordenar una tabla hash en PowerShell?

Ordene sus entradas para mostrarlas con $hash.GetEnumerator() | Sort-Object Name. Esto devuelve las entradas ordenadas y deja $hash sin cambios. Utilice [ordered]@{} cuando necesite el orden de inserción; conserva el orden en que se añadieron las entradas, en lugar de ordenar las claves alfabéticamente.