about_Hash_Tables

Se aplica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

TEMA

about_Hash_Tables

DESCRIPCIÓN BREVE

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

DESCRIPCIÓN LARGA

Una tabla hash, también denominada diccionario o matriz asociativa, es una estructura de datos compacta que almacena uno o más 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 Windows PowerShell, cada tabla de hash es un objeto Hashtable (System.Collections.Hashtable). Puede usar las propiedades y los métodos de objetos Hashtable de Windows PowerShell.

A partir de Windows PowerShell 3.0, puede usar el atributo [ordered] para crear un diccionario ordenado (System.Collections.Specialized.OrderedDictionary) en Windows PowerShell.

Los diccionarios ordenados se diferencian de las tablas hash en que las claves siempre aparecen en el orden en que se enumeran. El orden de las claves de una tabla hash no está determinado.

Las claves y el valor de las tablas hash también son objetos. NET. La mayoría de las veces son 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.

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

Sintaxis

La sintaxis de una tabla hash es el siguiente:

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

La sintaxis de un diccionario ordenado es la siguiente:

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

El atributo [ordered] se introdujo en Windows PowerShell 3.0.

Creación de tablas hash

Para crear una tabla hash, siga estas instrucciones:

- Comience la tabla hash con una arroba (@).

- Encierre la tabla hash entre llaves ({}).

- Especifique uno o más 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 contengan espacios deben escribirse entre comillas. Los valores deben ser expresiones Windows PowerShell válidas. Las cadenas deben aparecer entre comillas, aunque no incluyan espacios.

- Para administrar la tabla hash, guárdela en una variable.

- Cuando se asigne una tabla hash ordenada a una variable, coloque el atributo [ordered] antes del símbolo "@". Si lo coloca antes del nombre de 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 en el momento de crearla. Por ejemplo, la instrucción siguiente crea una tabla hash con tres claves.

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

Crear diccionarios ordenados

Puede crear un diccionario ordenado agregando un objeto de tipo OrderedDictiory, pero la forma más sencilla de hacerlo consiste en usar el atributo [Ordered].

El atributo [ordered] se introdujo en Windows 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 usa las tablas hash. Ambos tipos pueden usarse como valor de los parámetros que toman una tabla hash o un diccionario (iDictionary).

No puede usar el atributo [ordered] para convertir una tabla hash. Si coloca el atributo ordered antes del nombre de variable, el comando produce un error y muestra el siguiente mensaje.

        PS C:\> [ordered]$hash = @{}
        At line:1 char:1
        + [ordered]$hash = @{}
        + ~~~~~~~~~~~~~~
        The ordered attribute can be specified only on a hash literal node.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode
    To correct the expression, move the [ordered] attribute.     
        PS C:\> $hash = [ordered]@{}

Puede convertir un diccionario ordenado en una tabla hash, pero no puede recuperar el atributo ordered, incluso si desactiva la variable y escribe valores nuevos. Para volver a establecer el orden, debe quitar y volver a crear la variable.

        PS C:\> [hashtable]$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
        PS C:\ps-test> $hash

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

Mostrar tablas hash

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

          C:\PS> $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.

          C:\PS> $hash.keys
          Number
          Shape
          Color
        
          C:\PS> $hash.values
          1
          Square
          Blue
         

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

          $hashtable.<key>
          <value>     

Por ejemplo:

          C:\PS> $hash.Number
          1

          C:\PS> $hash.Color
          Blue

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

          C:\PS> $hash.count
          3

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

Por ejemplo:

          C:\PS> $hash["Number"]
          1

Agregar y quitar claves y valores

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

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

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

          $hash["Time"] = "Now"

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

          Add(Key, Value)

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

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

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

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

También puede agregar valores que están almacenados en variables.

          $t = "Today"
          $now = (Get-Date)
          
          $hash.Add($t, $now)      

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

El método Remove tiene la siguiente sintaxis:

          Remove(Key)          

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

          $hash.$Remove("Time")

Puede usar todas las propiedades y métodos de objetos Hashtable de Windows PowerShell, incluido Contains, Clear, Clone y CopyTo. Para obtener más información acerca de los objetos Hashtable, vea "System.Collections.Hashtable" en MSDN.

Tipos de objetos en tablas hash

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 variable $p.

          $p = @{"PowerShell" = (get-process PowerShell); 
          "Notepad" = (get-process notepad)}

Puede mostrar la tabla hash en $p y usar las propiedades de nombre de clave para mostrar los valores.

          C:\PS> $p

          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          C:\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
          C:\PS> $p.keys | foreach {$p.$_.handles}
          441
          251

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

           C:\PS> $p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}

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

           C:\PS> $p

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

       
           C:\PS> $p.keys
           PowerShell
           Notepad

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

            
           C:\PS> $p.keys | foreach {$_.name}
           winrm        

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

          C:\PS> $p = $p + @{"Hash2"= @{a=1; b=2; c=3}}

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

          C:\PS> $p


          Name                           Value
          ----                           -----
          PowerShell                     System.Diagnostics.Process (PowerShell)
          Notepad                        System.Diagnostics.Process (notepad)
          System.ServiceProcess.Servi... Running
          Hash2                          {a, b, c}


          C:\PS> $p.Hash2

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


          C:\PS> $p.Hash2.b
          2
     

Ordenar las claves y los valores

Los elementos de una tabla hash están intrínsecamente desordenados. Los pares clave-valor podrían aparecer en un orden diferente cada vez que se muestran.

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

Por ejemplo, los comandos siguientes enumeran las claves y los valores de la tabla hash en la variable $p y después ordenan las claves alfabéticamente.

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

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

El comando siguiente usa el mismo procedimiento para ordenar los valores hash de forma descendente.

          C:\PS> $p.getenumerator() | Sort-Object -Property Value -Descending

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

Crear objetos partiendo de tablas hash

A partir de Windows PowerShell 3.0, puede crear un objeto partiendo 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 null, es decir, un constructor sin parámetros. Las propiedades del objeto deben ser públicas y configurables.

Para más información, consulte about_Object_Creation.

ConvertFrom-StringData

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

Las cadenas de tipo "here-string" son especialmente útiles cuando los valores de la tabla hash incluyen comillas. (Para más información sobre las cadenas de tipo "here-string", consulte about_Quoting_Rules).

En el ejemplo siguiente se muestra cómo crear una cadena de tipo "here-string" de los mensajes de usuario del ejemplo anterior y cómo usar ConvertFrom-StringData para convertirlos de cadena en tabla hash.

El comando siguiente crea una cadena de tipo "here-string" de pares clave-valor y la guarda en la variable $string.

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

Este comando usa el cmdlet ConvertFrom-StringData para convertir la cadena de tipo "here-string" en una una tabla hash.

        C:\PS> ConvertFrom-StringData $string

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

Para más información sobre las cadenas de tipo "here-string", consulte about_Quoting_Rules.

VEA TAMBIÉN

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

"System.Collections.Hashtable" en MSDN