Share via


about_Hash_Tables

Descrição breve

Descreve como criar, usar e classificar tabelas de hash no PowerShell.

Descrição longa

Uma tabela de hash, também conhecida como dicionário ou matriz associativa, é uma estrutura de dados compacta 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 computador, em que os endereços IP são as chaves e os nomes dos computadores são os valores ou vice-versa.

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

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

Os dicionários ordenados diferem das tabelas de hash, na qual as chaves sempre aparecem na ordem em que você as lista. A ordem das chaves em uma tabela de hash não é determinada.

As chaves e o valor em tabelas de hash também são objetos .NET. Eles geralmente são cadeias de caracteres ou inteiros, mas podem ter qualquer tipo de objeto. Você também pode criar tabelas de hash aninhadas, nas quais o valor de uma chave é outra tabela de hash.

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

Syntax

A sintaxe de uma tabela de hash é a seguinte:

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

A sintaxe de um dicionário ordenado é a seguinte:

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

O atributo [ordenado] foi introduzido no PowerShell 3.0.

Criando tabelas de hash

Para criar uma tabela de hash, siga estas diretrizes:

  • Inicie a tabela de hash com um sinal de sinal (@).
  • 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 um ponto e vírgula (;) ou uma quebra de linha para separar os pares chave/valor.
  • As chaves que contêm espaços devem ser colocadas entre aspas. Os valores devem ser expressões válidas do PowerShell. 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 você colocá-lo antes do nome da variável, o comando falhará.

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

$hash = @{}

Você também pode 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

Você pode criar um dicionário ordenado adicionando um objeto do tipo OrderedDictionary , mas a maneira mais fácil de criar um dicionário ordenado é usar o [ordered] atributo .

O [ordered] atributo é introduzido no PowerShell 3.0.

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

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

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

Não é possível usar o [ordered] atributo para converter ou converter uma tabela de hash. Se você colocar o atributo ordenado antes do nome da variável, o comando falhará com a mensagem de erro a seguir.

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

Para corrigir a expressão, mova o atributo [ordenado].

$hash = [ordered]@{}

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

[hashtable]$hash = [ordered]@{
  Number = 1; Shape = "Square"; Color = "Blue"}
$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, uma tabela de hash é exibida como uma tabela com uma coluna para chaves e outra para valores.

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

As tabelas de hash têm propriedades Keys e Values. Use a notação de ponto para exibir todas as chaves ou todos os valores.

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

Cada nome de chave também é uma propriedade da tabela de hash e seu valor é o valor da propriedade key-name. Use o formato a seguir para exibir os valores da propriedade.

$hashtable.<key>
<value>

Por exemplo:

$hash.Number
1

$hash.Color
Blue

Se o nome da chave colidir com um dos nomes de propriedade do tipo HashTable, você poderá usar PSBase para acessar essas propriedades. Por exemplo, se o nome da chave for keys e você quiser retornar a coleção de Chaves, use esta sintaxe:

$hashtable.PSBase.Keys

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

$hash.count
3

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

Por exemplo:

$hash["Number"]
1

Adicionando e removendo chaves e valores

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

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

Por exemplo, para adicionar uma chave "Time" com um valor de "Now" à 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 "Time" com um valor de "Now" à tabela de hash, use o seguinte formato de instrução.

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

Além disso, 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 "Time" com um valor de "Now" à 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 pode usar o método Remove do objeto Hashtable. O método Remove usa a chave como seu valor.

O método Remove tem a seguinte sintaxe:

Remove(Key)

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

$hash.Remove("Time")

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

Tipos de objeto em HashTables

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 de cadeias de caracteres de nome de processo e processa valores de objeto e salva-a na $p variável .

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

Você pode exibir a tabela de hash no $p e usar as propriedades key-name para exibir os valores.

$p

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

$p.PowerShell

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

$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 $p variável . A chave é um objeto Service que representa o serviço WinRM e o valor é o status atual do serviço.

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

Você pode exibir e acessar o novo par chave/valor usando os mesmos métodos usados para outros pares na tabela de hash.

$p

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

$p.keys
PowerShell
Notepad

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

$p.keys | foreach {$_.name}
winrm

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

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

Você pode exibir e acessar os novos valores usando os mesmos métodos.

$p

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

$p.Hash2

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

$p.Hash2.b
2

Classificando chaves e valores

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

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

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

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

$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 de tabelas de hash

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

A sintaxe é mostrada a seguir:

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

Esse método funciona apenas para classes que têm um 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 about_Object_Creation.

ConvertFrom-StringData

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

As cadeias de caracteres aqui são especialmente úteis quando os valores na tabela de hash incluem aspas. Para obter mais informações sobre cadeias de caracteres aqui, consulte about_Quoting_Rules.

O exemplo a seguir mostra como criar uma cadeia de caracteres aqui das mensagens do usuário no exemplo anterior e como usá-las ConvertFrom-StringData para convertê-las de uma cadeia de caracteres em uma tabela de hash.

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

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

Esse comando usa o ConvertFrom-StringData cmdlet para converter a cadeia de caracteres aqui em uma tabela de hash.

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 cadeias de caracteres aqui, consulte about_Quoting_Rules.

Confira também