about_Hash_Tables

Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

TÓPICO

about_Hash_Tables

DESCRIÇÃO BREVE

Explica como criar, usar e classificar tabelas de hash no Windows PowerShell®.

DESCRIÇÃO LONGA

A tabela de hash, também conhecida como dicionário ou matriz de associação, é uma estrutura de dados compactos que armazena um ou mais pares chave/valor. Por exemplo, uma tabela de hash pode conter uma série de endereços IP e nomes de computadores, onde os endereços IP são as chaves e os nomes dos computadores são os valores, ou vice-versa.

Em Windows PowerShell, cada tabela de hash é um objeto Hashtable (System.Collections.Hashtable). Você pode usar as propriedades e métodos de objetos Hashtable em Windows PowerShell.

A partir de Windows PowerShell 3.0, você pode usar o atributo [ordenado] para criar um dicionário ordenado (System.Collections.Specialized.OrderedDictionary) em Windows PowerShell.

Dicionários ordenados diferem das tabelas de hash, pois as chaves sempre aparecem na ordem em que foram listados. A ordem das chaves em uma tabela de hash não é determinada.

As chaves e o valor nas tabelas de hash também são objetos .NET. Mais freqüentemente, são cadeias de caracteres ou números inteiros, mas eles podem ter qualquer tipo de objeto. Você também pode criar tabelas de hash aninhadas, em que o valor de uma chave é outra tabela de hash.

Tabelas de hash são usadas com freqüência porque são muito eficientes para localizar e recuperar dados. Você pode usar as tabelas de hash para armazenar listas e criar propriedades calculadas em Windows PowerShell. E, Windows PowerShell tem um cmdlet, ConvertFrom-StringData, que converte cadeias de caracteres em tabela de hash.

Sintaxe

A sintaxe da tabela de hash é a seguinte:

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

A sintaxe do dicionário ordenado é a seguinte:

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

O atributo [ordenado] foi introduzido no Windows PowerShell 3.0.

Criando Tabelas de Hash

Para criar uma tabela de hash, siga estas diretrizes:

-Começar a tabela de hash com um sinal de arroba (@).

-Coloque a tabela de hash entre chaves ({}).

-Insira um ou mais pares chave/valor para o conteúdo da tabela de hash.

-Use um sinal de igual (=) para separar cada chave de seu valor.

-Use uma quebra de linha ou um ponto e vírgula (;) para separar os pares chave/valor.

-Chave que contém espaços deve ser colocada entre aspas. Os valores devem ser expressões Windows PowerShell válidas. As cadeias de caracteres devem aparecer entre aspas, mesmo que não incluam espaços.

-Para gerenciar a tabela de hash, salve-a em uma variável.

-Ao atribuir uma tabela de hash ordenada a uma variável, coloque o atributo [ordenado] antes do símbolo "@". Se ele for colocado antes do nome da variável, o comando falhará.

Para criar uma tabela de hash vazia no valor de $hash, digite:

          $hash = @{}

Você pode também adicionar chaves e valores a uma tabela de hash ao criá-la. Por exemplo, a instrução a seguir cria uma tabela de hash com três chaves.

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

Criando dicionários ordenados

É possível criar um dicionário ordenado adicionando um objeto do tipo OrderedDictiory, mas a maneira mais fácil de criar um dicionário ordenado é usar o atributo [Ordenado].

O atributo [ordenado] é introduzido no Windows PowerShell 3.0.

Colocar o atributo imediatamente antes do símbolo "@".

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

Você pode usar os dicionários ordenados da mesma forma em que usa as tabelas de hash. Qualquer tipo pode ser usado como o valor dos parâmetros que usam tabela de hash ou dicionário (iDictionary).

Você não pode usar o atributo [ordenado] para converter uma tabela de hash Se você colocar o atributo ordenado antes do nome da variável, o comando falha e apresenta a seguinte mensagem de erro.

        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]@{}

Você pode converter um dicionário ordenado em uma tabela de hash, mas não é possível recuperar o atributo ordenado, mesmo que você limpe a variável e insira novos valores. Para restabelecer a ordem, remova e recrie a variável.

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

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

Exibindo tabelas de Hash

Para exibir uma tabela de hash salva em uma variável, digite o nome da variável. Por padrão, a tabela de hash é exibida como uma tabela com uma coluna de chaves e outra de valores.

          C:\PS> $hash
        
          Name                           Value
          ----                           -----
          Shape                          Square
          Color                          Blue
          Number                         1

Tabelas de hash têm propriedades de chave e de valor. Use a notação de ponto para exibir todas as chaves ou todos os valores.

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

Todo nome de chave também é uma propriedade da tabela de hash e seu valor é o valor da propriedade de nome da chave. Use o seguinte formato para exibir os valores de propriedade.

          $hashtable.<key>
          <value>     

Por exemplo:

          C:\PS> $hash.Number
          1

          C:\PS> $hash.Color
          Blue

Tabelas de hash têm uma propriedade Count que indica o número de pares chave-valor na tabela de hash.

          C:\PS> $hash.count
          3

As tabelas da tabela de hash não são matrizes, portanto, você não pode usar um número inteiro como índice da tabela de hash, mas você pode usar um nome de chave como índice da tabela de hash. Se a chave for um valor de cadeia de caracteres, coloque o nome da chave entre aspas.

Por exemplo:

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

Adicionando e removendo chaves e valores

Para adicionar chaves e valores em uma tabela de hash, use o seguinte formato de comando.

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

Por exemplo, para adicionar uma chave de "Hora" com valor de "Agora" à tabela de hash, use o seguinte formato de instrução.

          $hash["Time"] = "Now"

Você também pode adicionar chaves e valores a uma tabela de hash usando o método Add do objeto System.Collections.Hashtable. O método Add tem a seguinte sintaxe:

          Add(Key, Value)

Por exemplo, para adicionar uma chave de "Hora" com valor de "Agora" à tabela de hash, use o seguinte formato de instrução.

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

E você pode adicionar chaves e valores a uma tabela de hash usando o operador de adição (+) para adicionar uma tabela de hash a uma tabela de hash existente. Por exemplo, a instrução a seguir adiciona uma chave de "Hora" com valor de "Agora" à tabela de hash na variável $hash.

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

Você também pode adicionar valores armazenados em variáveis.

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

Você não pode usar um operador de subtração para remover um par chave/valor de uma tabela de hash, mas você pode usar o método Remover do objeto Hashtable. O método Remover usa a chave como valor.

O método Remover tem a seguinte sintaxe:

          Remove(Key)          

Por exemplo, para remover o par chave/valor Hora=Agora da tabela de hash no valor da variável $hash, digite:

          $hash.$Remove("Time")

Você pode usar todas as propriedades e métodos dos objetos Hashtable emWindows PowerShell, inclusive Contains, Clear, Clone e CopyTo. Para obter mais informações sobre objetos de hashtable, consulte "System.Collections.Hashtable" no MSDN.

Tipos de objeto em tabelas de hash

As chaves e os valores em uma tabela de hash podem ter qualquer tipo de objeto .NET, e uma única tabela de hash pode ter chaves e valores de vários tipos.

A instrução a seguir cria uma tabela de hash com cadeias de caracteres de nome de processo e valores de objeto do processo e a salva na variável $p.

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

Você pode exibir a tabela de hash no $p e usar as propriedades de nome-chave para exibir os 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

As chaves em uma tabela de hash também podem ser qualquer tipo .NET. A instrução a seguir adiciona um par chave/valor à tabela de hash na variável $p. A chave é um objeto de serviço que representa o serviço WinRM e o valor é o status atual do serviço.

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

Você pode exibir e acessar o novo par chave/valor usando os mesmos métodos que você usa para outros pares na tabela de 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        

As chaves e os valores em uma tabela de hash também podem ser objetos de tabela de hash. A instrução a seguir adiciona o par chave/valor à tabela de hash na variável $p em que a chave é uma cadeia de caracteres, Hash2, e o valor é uma tabela de hash com três pares chave/valor.

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

Você pode exibir e acessar os novos valores usando os mesmos 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
     

Classificando chaves e valores

Os itens na tabela de hash são intrinsecamente desordenados. Os pares chave/valor podem aparecer em ordem diferente a cada vez que você os exibe.

Embora você não possa classificar a tabela de hash, você pode usar o método GetEnumerator das tabelas de hash para enumerar as chaves e valores e, em seguida, usar o cmdlet Sort-Object para classificar os valores enumerados para exibição.

Por exemplo, os seguintes comandos enumeram as chaves e valores na tabela de hash na variável $p e, em seguida, classificam as chaves em ordem alfabética.

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

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

O comando a seguir usa o mesmo procedimento para classificar os valores de hash em ordem decrescente.

          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

Criando objetos a partir das tabelas de Hash

A partir de Windows PowerShell 3.0, você pode criar um objeto por meio de uma tabela de hash de propriedades e valores de propriedade.

A sintaxe é a seguinte:

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

Esse método funciona somente para classes que têm construtor nulo, ou seja, um construtor que não tem parâmetros. As propriedades do objeto devem ser públicas e configuráveis.

Para obter mais informações, consulte o about_Object_Creation.

ConvertFrom-StringData

O cmdlet ConvertFrom StringData converte uma cadeia de caracteres ou uma here-string de pares chave/valor em uma tabela de hash. Você pode usar o cmdlet ConvertFrom StringData com segurança na seção de dados de um script, e você pode usá-lo com o cmdlet Import-LocalizedData para exibir mensagens de usuário na cultura de interface do usuário (IU) do usuário atual.

Here-strings são úteis principalmente quando os valores na tabela de hash incluem aspas. (Para obter mais informações sobre here-strings, consulte about_Quoting_Rules.)

O exemplo a seguir mostra como criar uma here-string das mensagens do usuário do exemplo anterior e como usar ConvertFrom-StringData para convertê-las em uma tabela de hash.

O comando a seguir cria uma here-string dos pares chave/valor e, em seguida, salva essa cadeia na variável $string.

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

Esse comando usa o cmdlet ConvertFrom StringData para converter a here-string em uma tabela de hash.

        C:\PS> ConvertFrom-StringData $string

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

Para obter mais informações sobre here-strings, consulte about_Quoting_Rules.

CONSULTE TAMBÉM

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

"System.Collections.Hashtable" no MSDN