Una guía para principiantes sobre cómo usar Hashtable en PowerShell

Al encontrarte con las tablas hash por primera vez, es posible que te preguntes qué son y cómo desempeñan un papel crucial en tus scripts o comandos. ¡No te preocupes! Este tutorial te cubre para comenzar a usar tablas hash en PowerShell.

En pocas palabras, las tablas hash te permiten almacenar y manipular datos utilizando pares de clave-valor, a los que se puede acceder de manera rápida y eficiente. Y en este tutorial, aprenderás los conceptos básicos de las tablas hash y cómo utilizarlas en tus scripts y comandos de PowerShell.

Sigue leyendo y comienza a expandir tu conjunto de habilidades con las tablas hash de PowerShell.

Prerrequisitos

Este tutorial será una demostración práctica. Para seguirlo, asegúrate de tener un sistema con PowerShell v5+ instalado y configurado. Este tutorial utiliza Windows 10 con PowerShell 7, pero otras versiones de PowerShell y Windows también funcionarán.

Creación de una tabla hash en PowerShell

Recuperar datos específicos puede convertirse en una situación de “buscar una aguja en un pajar” en algún momento. Pero con las tablas hash, puedes buscar rápidamente elementos particulares en una extensa colección de datos.

En PowerShell, las tablas hash son estructuras de datos flexibles utilizadas de diversas maneras, como almacenar datos de configuración, pasar argumentos a cmdlets y almacenar datos en un script.

Para ver cómo funciona una tabla hash en PowerShell, primero tendrás que crear una de la siguiente manera:

1. Abra una sesión de PowerShell y ejecute el siguiente comando, que no produce salida pero declara una variable llamada name para hacer referencia a una hashtable vacía.

Como puede ver a continuación, similar a los arrays en PowerShell, las hashtables se definen usando el símbolo @.

$name = @{}

2. A continuación, ejecute el siguiente comando para verificar el tipo de la variable name (GetType()).

$name.GetType()

El tipo de la variable name es Hashtable, como se muestra a continuación. Esta información confirma que su hashtable se creó correctamente.

Verifying the newly-created hashtable

3. Después de verificar su hashtable, ejecute el siguiente código para comprobar si la hashtable está vacía o no.

El código a continuación determina si la propiedad Count es igual (-eq) a 0, e imprime un mensaje correspondiente.

# Comparar si el valor de la propiedad Count es igual (-eq) a 0
if ($name.Count -eq 0) {
	# Si es así, imprime el mensaje siguiente.
  Write-Output "The hashtable is empty."
} else {
	# De lo contrario, imprime el siguiente mensaje en su lugar.
  Write-Output "The hashtable is not empty."
}

A continuación, puedes ver que la tabla hash está vacía ya que acabas de crearla y no hay pares de clave-valor definidos en ella.

Checking if the hashtable is empty or not

Agregar elementos a una tabla hash de PowerShell

Acabas de crear una tabla hash de PowerShell prácticamente vacía, que solo será útil si agregas elementos. ¿Cómo? Al agregar pares de clave-valor a la tabla hash.

Similar a un array, pero en lugar de usar enteros como índices, una tabla hash de PowerShell usa claves (que pueden ser de cualquier tipo de datos) para identificar los valores. Esta característica permite una inserción rápida, recuperación y eliminación de elementos de la tabla hash, ya que la clave localiza rápidamente el valor correspondiente.

A continuación se muestra la sintaxis para agregar un par clave-valor a una tabla hash de PowerShell, donde:

  • $hashtable – El nombre de la tabla hash.
  • $key – El nombre de la clave, que no distingue entre mayúsculas y minúsculas. Por ejemplo, “Nombre” y “nombre” serían considerados la misma clave en una tabla hash
  • $value – El valor a asociar con la clave.
$hashtable[$key] = $value

Ejecuta el siguiente código, que no produce salida en la consola pero declara pares clave-valor, y agrégalos a tu tabla hash ($name).

En una tabla hash, la clave te permite realizar una función de hash, que mapea la clave a una ubicación específica en la estructura de datos interna de la tabla hash.

? Los valores de la tabla hash pueden ser de cualquier tipo, como números, cadenas, arrays, objetos y otros tipos de datos como valores en una tabla hash.

# Declarar la clave FirstName
$key = "FirstName"
# Declarar el valor de la clave
$value = "John"
# Agregar el elemento al hashtable
$name[$key] = $value

# Declarar la clave LastName
$key = "LastName"
# Declarar el valor de la clave
$value = "Doe"
# Agregar el elemento al hashtable
$name[$key] = $value

Ahora, vuelve a ejecutar el código a continuación para comprobar si tu hashtable está vacío.

if ($name.Count -eq 0) {
  Write-Output "The hashtable is empty."
} else {
  Write-Output "The hashtable is not empty."
}

Como se muestra a continuación, recibirás un mensaje diciendo que el hashtable no está vacío esta vez.

Checking if the hashtable is empty or not

Recuperar elementos de un Hashtable en PowerShell

Supongamos que estás seguro de que tu hashtable no está vacío. ¿Cómo sabes qué elementos existen en tu hashtable? Afortunadamente, también puedes recuperar elementos de tu hashtable.

Ejecuta el código a continuación para recuperar y mostrar (Write-Output) todos los elementos de tu hashtable en pares clave-valor, uno por línea.`

# Itera a través de todos los pares clave-valor en el hashtable
foreach ($key in $name.Keys) {
	$value = $name[$key]
  # Muestra todos los pares clave-valor en el hashtable, uno por línea.
	Write-Output "${key}: ${value}"
}
Retrieving items from a PowerShell hashtable

Ahora, ejecuta el siguiente código para recuperar e imprimir (Write-Output) todos los elementos de un hashtable en la consola.

? Ten en cuenta que a menudo usarás el siguiente código a lo largo de este tutorial. Puedes evitar copiar y pegar el mismo código varias veces creando una función, pero está fuera del alcance de este tutorial.

# Obtén un objeto que se puede usar para iterar sobre los elementos de una colección.
$enumerator = $name.GetEnumerator()
foreach ($element in $enumerator) {
	# Produce una cadena que incluye la clave y el valor de cada elemento en la colección.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Esta vez, puedes ver indicaciones de cuáles son las claves y los valores entre los elementos enumerados.

Retrieving items from a PowerShell hashtable, indicating which are the keys and value pairs

Creación de Tablas de Hash con Valores Predefinidos

Hasta ahora, solo has visto la creación de tablas de hash vacías. Pero si sabes que ciertos valores siempre serán necesarios en tu tabla de hash, puedes crear una con valores predefinidos.

Las tablas de hash con valores predefinidos pueden ahorrarte tiempo y hacer tu código más eficiente, ya que no tienes que añadir los valores a la tabla de hash más adelante.

? Ten en cuenta que la creación de tablas de hash no produce salida. Pero no te preocupes. En este tutorial, verificarás cada tabla de hash después de su creación.

1. Ejecuta el siguiente comando para crear una tabla de hash ($hashtable1) con tres pares de clave-valor.

$hashtable1 = @{
  "Key1" = "Value1"
  "Key2" = "Value2"
  "Key3" = "Value3"
}

2. A continuación, ejecuta el siguiente código para verificar que la nueva tabla de hash (hashtable1) exista.

# Obtén un objeto que se puede utilizar para iterar sobre los elementos de una colección.
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
  # Imprime una cadena que incluye la clave y el valor de cada elemento en la colección.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Verás que los valores para cada par clave-valor se imprimen en la pantalla como se esperaba. Esta salida confirma que los valores predefinidos están almacenados en las ubicaciones apropiadas en la tabla hash.

Verifying that hashtable was created successfully with predefined values

3. Ahora, ejecuta el siguiente código para crear una tabla hash ($hashtable2) con valores predefinidos utilizando un bucle (o un array).

$keys = "Key1", "Key2", "Key3"
$values = "Value1", "Value2", "Value3"
$hashtable2 = @{}
for ($i = 0; $i -lt $keys.Count; $i++) {
  $hashtable2[$keys[$i]] = $values[$i]
}

4. Por último, ejecuta el siguiente código para verificar que la nueva tabla hash (hashtable2) se haya creado correctamente.

# Obtén un objeto que se puede utilizar para iterar sobre los elementos de una colección.
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
	# Imprime una cadena que incluye la clave y el valor de cada elemento en la colección.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

La salida a continuación confirma que el método de bucle funciona al crear una tabla hash con valores predefinidos. Pero dado que los elementos se enumeran aleatoriamente, pasa a la siguiente sección para una solución.

Verifying the new hashtable was created successfully

Creación de una Lista Ordenada de Elementos en Tablas Hash

Por defecto, los elementos en una tabla hash se almacenan sin un orden particular. ¿Pero qué pasa si necesitas una lista ordenada? También puedes crear una lista ordenada de elementos en tus tablas hash para organizar los datos en un orden específico.

Para crear una lista ordenada de elementos en tu tabla hash, utiliza el atributo [ordered] de la siguiente manera:

1. Ejecute el siguiente código para crear una lista [ordered] de elementos en una tabla hash ($hashtable3).

$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}

2. A continuación, ejecute el siguiente código para verificar que la lista ordenada de tablas hash se haya creado correctamente.

# Obtenga un objeto que se puede utilizar para iterar sobre los elementos de una colección.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Muestra una cadena que incluye la clave y el valor de cada elemento en la colección.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Como se muestra a continuación, los elementos listados permanecen en el orden en que los definió al crear la tabla hash.

Algunos posibles beneficios de usar una tabla hash ordenada incluyen, entre otros, los siguientes:

Benefits Description
Easier to read and debug The elements are displayed in a predictable order, which can be especially useful if you work with many elements of a large hashtable.
Improved performance An ordered hashtable can be more efficient when accessing elements frequently in a specific order.
Verifying that the ordered list of hashtables has been created

3. Por último, llame a su tabla hash ordenada ($hashtable3) para confirmar aún más que seguirá obteniendo una lista ordenada de elementos.

$hashtable3

La salida a continuación confirma que seguirá obteniendo una lista ordenada de elementos independientemente de cómo acceda a su tabla hash.

Verifying the list of items is still in an ordered format

Actualizar elementos existentes en tablas hash

Los datos cambian constantemente y si tiene tablas hash existentes, actualizarlos es una tarea crucial. Por ejemplo, está utilizando una tabla hash para almacenar valores de configuración. Si es así, es posible que necesite actualizar el valor de una clave si cambia la configuración.

Para actualizar una tabla hash de PowerShell, el operador de asignación = hará el truco de la siguiente manera:

1. Ejecute el siguiente comando, que no proporciona salida, pero actualiza el valor de la clave Key2 en $hashtable3 a NewValue2.

$hashtable3["Key2"] = "NewValue2"

A continuación, ejecuta el siguiente comando para Agregar() un nuevo par clave-valor (Key4 = NuevoValor4) al hashtable ($hashtable3).

Agregar un nuevo par clave-valor no produce una salida como la actualización de listas existentes en los hashtable, pero verificarás los cambios en el siguiente paso.

$hashtable3.Add("Key4", "NewValue4")

3. Ejecuta el siguiente código para verificar que los valores de las claves en tu hashtable ($hashtable3) han sido actualizados.

# Obtener un objeto que se puede utilizar para iterar sobre los elementos de una colección.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Produce una cadena que incluye la clave y el valor de cada elemento en la colección.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
Verifying the key values have been updated

? En PowerShell, cada clave en un hashtable debe ser única. Si intentas agregar un par clave-valor que ya está en el hashtable, recibirás un error como el siguiente. Para evitar este error, salta al siguiente paso.

Adding a key that already exists

4. Ahora, ejecuta el siguiente código, que utiliza el método Contains() para verificar si la clave que intentas agregar ya existe en el hashtable antes de agregar el par clave-valor.

# Define la variable para contener la nueva clave
$newkey="Key5"
# Verifica si $nuevaclave ya existe en el hashtable.
if (-not $hashtable3.Contains($newkey)) {
	# Si no existe, agrega el nuevo par clave-valor.
	$hashtable3.Add($newkey, "NewValue5")
	Write-Output "The new key '$newkey' has been added to the hashtable."
} else {
	# Si la clave existe, imprime un mensaje.
	Write-Output "The key '$newkey' already exists."
}

Si la nueva clave no existe, recibirás el mensaje a continuación, diciendo que la nueva clave ha sido agregada al hashtable.

Checking if a key exists before adding it to the hashtable

De lo contrario, como se muestra a continuación, recibirás un mensaje si la clave que estás intentando ya existe.

Adding a key that already exists

5. Por último, vuelve a ejecutar el código a continuación para recuperar todos los elementos en tu hashtable ($hashtable3).

# Obtén un objeto que se pueda utilizar para iterar sobre los elementos de una colección.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Muestra una cadena que incluye la clave y el valor de cada elemento en la colección.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

A continuación, puedes ver la clave recién añadida (Clave5) y otros elementos que has añadido hasta ahora al hashtable.

Checking all items listed in a hashtable

Eliminar elementos de un Hashtable

Demasiados elementos en un hashtable, especialmente los innecesarios, pueden llevar solo a confusión. Eliminar elementos que ya no son relevantes o necesarios de tu hashtable te hará un favor.

Supongamos que tu hashtable contiene una lista de usuarios y su información. Si es así, elimina usuarios de tu hashtable si ya no están activos.

Ejecuta el código a continuación para eliminar un elemento específico (Clave1) de tu hashtable ($hashtable3).

$key = "Key5"
if ($hashtable3.Contains($key)) {
  $hashtable3.Remove($key)
  Write-Output "The key-value pair with the key '$key' was removed from the hashtable."
} else {
  Write-Output "The key-value pair with the key '$key' was not found in the hashtable."
}

A continuación, la salida imprime un mensaje diciendo que la clave ha sido eliminada. Pero si la clave no existe, recibirás un mensaje diciendo que la clave no se encontró.

Removing items from a hashtable

Ahora, ejecuta el siguiente código para verificar todos los elementos en tu hashtable y verificar si la eliminación del elemento fue exitosa.

# Obtén un objeto que se pueda utilizar para iterar sobre los elementos de una colección.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Muestra una cadena que incluye la clave y el valor de cada elemento en la colección.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

A continuación, puede verificar que el par clave-valor con la clave ‘Key5’ ya no existe en su hashtable.

Verifying item deletion is successful

Conclusión

Con una estructura de pares clave-valor y un acceso rápido, un hashtable de PowerShell es adecuado para gestionar grandes cantidades de datos en varios escenarios. Y en este tutorial, aprendiste cómo crear, agregar, actualizar y eliminar elementos de los hashtables. Todo esto te proporciona las habilidades para usar los hashtables de manera efectiva en tus scripts.

¿Por qué no llevas tus habilidades recién adquiridas al siguiente nivel? Considera incorporar hashtables en tus scripts para tareas más avanzadas, como manipulación de datos y transformación. O experimenta con la combinación de hashtables con otras estructuras de datos en PowerShell, como matrices y objetos, para resolver problemas más complejos.

Source:
https://adamtheautomator.com/powershell-hashtable/