about_Hash_Tables

Descripción breve

Describe cómo crear, usar y ordenar tablas hash en PowerShell.

Descripción larga

Una tabla hash, también conocida como diccionario o matriz asociativa, es una estructura de datos compacta que almacena uno o varios pares clave-valor. Por ejemplo, una tabla hash puede contener una serie de direcciones IP y nombres de equipo, donde las direcciones IP son las claves y los nombres de equipo son los valores, o viceversa.

En PowerShell, cada tabla hash es un Hashtable[System.Collections.Hashtable] objeto . Puede usar las propiedades y los métodos de Hashtable objetos en PowerShell.

A partir de PowerShell 3.0, puede usar el [ordered] atributo para crear un [System.Collections.Specialized.OrderedDictionary] objeto en PowerShell.

Los diccionarios ordenados difieren de las tablas hash en que las claves siempre aparecen en el orden en que se enumeran. No se determina el orden de las claves de una tabla hash.

Las claves y el valor de las tablas hash también son objetos .NET. Suelen ser cadenas o enteros, pero pueden tener cualquier tipo de objeto. También puede crear tablas hash anidadas, en las que el valor de una clave es otra tabla hash.

Hashtablese usan con frecuencia porque son eficaces para buscar y recuperar datos. Puede usar tablas hash para almacenar listas y crear propiedades calculadas en PowerShell. Además, PowerShell tiene un cmdlet, ConvertFrom-StringData, que convierte cadenas en una tabla hash.

Sintaxis

La sintaxis de una tabla hash es la siguiente:

@{ <name> = <value>; [<name> = <value> ] ...}

La sintaxis de un diccionario ordenado es la siguiente:

[ordered]@{ <name> = <value>; [<name> = <value> ] ...}

El [ordered] acelerador de tipos se introdujo en PowerShell 3.0.

Creación de tablas hash

Para crear una tabla hash, siga estas instrucciones:

  • Comience la tabla hash con un signo en (@).
  • Incluya las llaves de la tabla hash ({}).
  • Escriba uno o varios pares clave-valor para el contenido de la tabla hash.
  • Use un signo igual (=) para separar cada clave de su valor.
  • Use un punto y coma (;) o un salto de línea para separar los pares clave-valor.
  • Las claves que contienen espacios deben incluirse entre comillas. Los valores deben ser expresiones de PowerShell válidas. Las cadenas deben aparecer entre comillas, aunque no incluyan espacios.
  • Para administrar la tabla hash, guárdela en una variable.
  • Al asignar una tabla hash ordenada a una variable, coloque el [ordered] tipo delante del @ símbolo. Si lo coloca antes del nombre de la variable, se produce un error en el comando.

Para crear una tabla hash vacía en el valor de $hash, escriba:

$hash = @{}

También puede agregar claves y valores a una tabla hash al crearla. Por ejemplo, la instrucción siguiente crea una tabla hash con tres claves.

$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

Creación de diccionarios ordenados

Puede crear un diccionario ordenado agregando un objeto del OrderedDictionary tipo, pero la manera más fácil de crear un diccionario ordenado es usar el [ordered] atributo .

El [ordered] atributo se presenta en PowerShell 3.0.

Coloque el atributo inmediatamente antes del símbolo "@".

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Puede usar diccionarios ordenados de la misma manera que se usan tablas hash. Cualquier tipo se puede usar como el valor de los parámetros que toman una tabla hash o un diccionario (iDictionary).

No puede usar el [ordered] atributo para convertir o convertir una tabla hash. Si coloca el atributo ordenado antes del nombre de la variable, se produce un error en el comando con el siguiente mensaje de error.

[ordered]$hash = @{}
ParserError:
Line |
   1 |  [ordered]$hash = @{}
     |  ~~~~~~~~~~~~~~
     | The ordered attribute can be specified only on a hash literal node.

Para corregir la expresión, mueva el atributo [ordenado].

$hash = [ordered]@{}

Puede convertir un diccionario ordenado en una tabla hash, pero no puede recuperar el atributo ordenado, aunque borre la variable y escriba nuevos valores. Para volver a establecer el orden, debe quitar y volver a crear la variable.

[hashtable]$hash = [ordered]@{
  Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name                           Value
----                           -----
Color                          Blue
Shape                          Square
Number                         1

Mostrar tablas hash

Para mostrar una tabla hash que se guarda en una variable, escriba el nombre de la variable. De forma predeterminada, las tablas hash se muestran como una tabla con una columna para las claves y otra para los valores.

$hash
Name                           Value
----                           -----
Shape                          Square
Color                          Blue
Number                         1

las tablas hash tienen propiedades Keys y Values . Use la notación de puntos para mostrar todas las claves o todos los valores.

$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue

Cada nombre de clave también es una propiedad de la tabla hash y su valor es el valor de la propiedad de nombre de clave. Use el siguiente formato para mostrar los valores de propiedad.

$hashtable.<key>
<value>

Por ejemplo:

$hash.Number
1

$hash.Color
Blue

las tablas hash tienen una propiedad Count que indica el número de pares clave-valor en la tabla hash.

$hash.count
3

Las tablas hashtable no son matrices, por lo que no puede usar un entero como un índice en la tabla hash, pero puede usar un nombre de clave para indexar en la tabla hash. Si la clave es un valor de cadena, escriba el nombre de clave entre comillas.

Por ejemplo:

$hash["Number"]
1

Control de colisiones de nombres de propiedad

Si el nombre de clave entra en conflicto con uno de los nombres de propiedad del tipo HashTable, puede usar el miembro intrínseco psbasepara tener acceso a esas propiedades. Por ejemplo, si el nombre de clave es keys y desea devolver la colección de claves hashTable , use esta sintaxis:

$hashtable.psbase.Keys

Esto se aplica a otros tipos que implementan la System.Collections.IDictionary interfaz, como OrderedDictionary.

Iteración de claves y valores

Puede iterar en las claves de una tabla hash para procesar los valores de varias maneras. Cada uno de los ejemplos de esta sección tiene una salida idéntica. Recorren en iteración la $hash variable definida aquí:

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Nota:

En estos ejemplos, $hash se define como un diccionario ordenado para asegurarse de que la salida siempre está en el mismo orden. Estos ejemplos funcionan igual para tablas hash normales, pero el orden de la salida no es predecible.

Cada ejemplo devuelve un mensaje para cada clave y su valor:

The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue

En este ejemplo se usa un bloque foreach para iterar las claves.

foreach ($Key in $hash.Keys) {
    "The value of '$Key' is: $($hash[$Key])"
}

En este ejemplo se usa ForEach-Object para iterar las claves.

$hash.Keys | ForEach-Object {
    "The value of '$_' is: $($hash[$_])"
}

En este ejemplo se usa el método GetEnumerator para enviar cada par clave-valor a través de la canalización a ForEach-Object.

$hash.GetEnumerator() | ForEach-Object {
    "The value of '$($_.Key)' is: $($_.Value)"
}

En este ejemplo se usan los métodos GetEnumerator y ForEach para iterar en cada par clave-valor.

$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})

Agregar y quitar claves y valores

Para agregar claves y valores a una tabla hash, use el siguiente formato de comando.

$hash["<key>"] = "<value>"

Por ejemplo, para agregar una clave "Hora" con un valor de "Now" a la tabla hash, use el siguiente formato de instrucción.

$hash["Time"] = "Now"

También puede agregar claves y valores a una tabla hash mediante el Add método del System.Collections.Hashtable objeto . El Add método tiene la siguiente sintaxis:

Add(Key, Value)

Por ejemplo, para agregar una Time clave con un valor de Now a la tabla hash, use el siguiente formato de instrucción.

$hash.Add("Time", "Now")

Además, puede agregar claves y valores a una tabla hash mediante el operador de suma (+) para agregar una tabla hash a una tabla hash existente. Por ejemplo, la siguiente instrucción agrega una Time clave con un valor de Now a la tabla hash de la $hash variable .

$hash = $hash + @{Time="Now"}

También puede agregar valores almacenados en variables.

$t = "Today"
$now = (Get-Date)

$hash.Add($t, $now)

No se puede usar un operador de resta para quitar un par clave-valor de una tabla hash, pero puede usar el método Remove del Hashtable objeto . El método Remove toma la clave como su valor.

El Remove método tiene la siguiente sintaxis:

Remove(Key)

Por ejemplo, para quitar el Time=Now par clave-valor de la tabla hash en el valor de la $hash variable, escriba:

$hash.Remove("Time")

Puede usar todas las propiedades y métodos de objetos de Hashtable PowerShell, incluidos Contains, Clear, Cloney CopyTo. Para obtener más información sobre Hashtable los objetos, vea System.Collections.Hashtable.

Tipos de objeto en HashTables

Las claves y los valores de una tabla hash pueden tener cualquier tipo de objeto .NET y una sola tabla hash puede tener claves y valores de varios tipos.

La instrucción siguiente crea una tabla hash de cadenas de nombre de proceso y valores de objeto de proceso y la guarda en la $p variable .

$p = @{
    "PowerShell" = (Get-Process PowerShell)
    "Notepad" = (Get-Process notepad)
}

Puede mostrar la tabla hash en $p y usar las propiedades key-name para mostrar los valores.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)

PS> $p.PowerShell

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    441      24    54196      54012   571     5.10   1788 PowerShell

PS> $p.keys | ForEach-Object {$p.$_.handles}
441
251

Las claves de una tabla hash pueden ser cualquier tipo de .NET. La siguiente instrucción agrega un par clave-valor a la tabla hash de la $p variable . La clave es un objeto Service que representa el servicio WinRM y el valor es el estado actual del servicio.

$p = $p + @{
    (Get-Service WinRM) = ((Get-Service WinRM).Status)
}

Puede mostrar y acceder al nuevo par clave-valor mediante los mismos métodos que se usan para otros pares de la tabla hash.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running

PS> $p.keys
PowerShell
Notepad

Status   Name               DisplayName
------   ----               -----------
Running  winrm              Windows Remote Management (WS-Manag...

PS> $p.keys | ForEach-Object {$_.name}
WinRM

Las claves y los valores de una tabla hash también pueden ser Hashtable objetos . La siguiente instrucción agrega el par clave-valor a la tabla hash de la $p variable en la que la clave es una cadena, Hash2 y el valor es una tabla hash con tres pares clave-valor.

$p = $p + @{
    "Hash2"= @{a=1; b=2; c=3}
}

Puede mostrar y acceder a los nuevos valores mediante los mismos métodos.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Hash2                          {[a, 1], [b, 2], [c, 3]}
Notepad                        System.Diagnostics.Process (Notepad)
WinRM                          Running

PS> $p.Hash2

Name                           Value
----                           -----
a                              1
b                              2
c                              3

PS> $p.Hash2.b
2

Ordenar claves y valores

Los elementos de una tabla hash no están ordenados intrínsecamente. Los pares clave-valor pueden aparecer en un orden diferente cada vez que los muestre.

Aunque no se puede ordenar una tabla hash, puede usar el método GetEnumerator de tablas hash para enumerar las claves y los valores y, a continuación, usar el Sort-Object cmdlet para ordenar los valores enumerados para mostrar.

Por ejemplo, los siguientes comandos enumeran las claves y los valores de la tabla hash de la $p variable y, a continuación, ordenan las claves en orden alfabético.

PS> $p.GetEnumerator() | Sort-Object -Property key

Name                           Value
----                           -----
Hash2                          {[a, 1], [b, 2], [c, 3]}
Notepad                        System.Diagnostics.Process (Notepad)
PowerShell                     System.Diagnostics.Process (pwsh)
WinRM                          Running

El comando siguiente usa el mismo procedimiento para ordenar los valores hash en orden descendente.

PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (Notepad)
Hash2                          {[a, 1], [b, 2], [c, 3]}
WinRM                          Running

Creación de objetos a partir de tablas hash

A partir de PowerShell 3.0, puede crear un objeto a partir de una tabla hash de propiedades y valores de propiedad.

La sintaxis es la siguiente:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Este método solo funciona para las clases que tienen un constructor que no tiene parámetros. Las propiedades del objeto deben ser públicas y configurables.

Para obtener más información, consulte about_Object_Creation.

ConvertFrom-StringData

El ConvertFrom-StringData cmdlet convierte una cadena o una cadena here-string de pares clave-valor en una tabla hash. Puede usar el ConvertFrom-StringData cmdlet de forma segura en la sección Datos de un script y puede usarlo con el Import-LocalizedData cmdlet para mostrar los mensajes de usuario en la referencia cultural de la interfaz de usuario (UI) del usuario actual.

Las cadenas aquí son especialmente útiles cuando los valores de la tabla hash incluyen comillas. Para obtener más información sobre las cadenas aquí, consulte about_Quoting_Rules.

En el ejemplo siguiente se muestra cómo crear una cadena aquí de los mensajes de usuario en el ejemplo anterior y cómo usarlas ConvertFrom-StringData para convertirlos de una cadena en una tabla hash.

El siguiente comando crea una cadena aquí de los pares clave-valor y, a continuación, la guarda en la $string variable .

$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@

Este comando usa el ConvertFrom-StringData cmdlet para convertir la cadena aquí en una tabla hash.

ConvertFrom-StringData $string

Name                           Value
----                           -----
Msg3                           Enter an alias (or "nickname").
Msg2                           She said, "Hello, World."
Msg1                           Type "Windows".

Para obtener más información sobre las cadenas aquí, consulte about_Quoting_Rules.

Consulte también