about_Hash_Tables

Breve descrição

Descreve como criar, usar e classificar hashtables no PowerShell.

Descrição longa

Uma hashtable, 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 hash pode conter uma série de endereços IP e nomes do computador, onde os endereços IP são as chaves e os nomes do computador são os valores (ou vice-versa).

No PowerShell, cada hashtable é um Hashtable[System.Collections.Hashtable] objeto. Você pode usar as propriedades e os métodos de Hashtable objetos no PowerShell.

A partir do PowerShell 3.0, você pode usar o [ordered] atributo para criar um [System.Collections.Specialized.OrderedDictionary] objeto no PowerShell.

Os dicionários ordenados diferem das hashtables na medida em que as chaves aparecem sempre pela ordem em que são listadas. A ordem das chaves em uma hashtable não é determinada.

As chaves e o valor em hashtables também são objetos .NET. Na maioria das vezes, são cadeias de caracteres ou inteiros, mas podem ter qualquer tipo de objeto. Você também pode criar hashtables aninhadas, nas quais o valor de uma chave é outra hashtable.

Hashtables são usados com frequência porque são eficientes para encontrar e recuperar dados. Você pode usar hashtables para armazenar listas e criar propriedades calculadas no PowerShell. Além disso, o PowerShell tem um cmdlet, ConvertFrom-StringData, que converte cadeias de caracteres em uma hashtable.

Sintaxe

A sintaxe de uma hashtable é a seguinte:

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

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

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

O [ordered] acelerador de tipo foi introduzido no PowerShell 3.0.

Criação de hashtables

Para criar uma hashtable, siga estas diretrizes:

  • Comece a hashtable com um sinal de arroba (@).
  • Coloque a hashtable entre chaves ({}).
  • Insira um ou mais pares chave-valor para o conteúdo da hashtable.
  • 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 hashtable, salve-a em uma variável.
  • Ao atribuir uma hashtable ordenada a uma variável, coloque o [ordered] tipo antes do @ símbolo. Se você colocá-lo antes do nome da variável, o comando falhará.

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

$hash = @{}

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

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

Criação de dicionários ordenados

Você pode criar um dicionário ordenado adicionando um objeto do OrderedDictionary tipo, 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 hashtables. Qualquer tipo pode ser usado como o valor de parâmetros que usam uma hashtable ou dicionário (iDictionary).

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

[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 hashtable, mas não pode recuperar o atributo ordenado, mesmo se limpar a variável e inserir 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 hashtables

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

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

hashtables têm propriedades Chaves e Valores . Use a notação de pontos para exibir todas as teclas ou todos os valores.

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

Cada nome de chave também é uma propriedade da hashtable, e seu valor é o valor da propriedade de nome de chave. Use o seguinte formato para exibir os valores de propriedade.

$hashtable.<key>
<value>

Por exemplo:

$hash.Number
1

$hash.Color
Blue

hashtables têm uma propriedade Count que indica o número de pares chave-valor na hashtable.

$hash.count
3

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

Por exemplo:

$hash["Number"]
1

Tratamento de colisões de nomes de propriedade

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

$hashtable.psbase.Keys

Isso se aplica a outros tipos que implementam a System.Collections.IDictionary interface, como OrderedDictionary.

Iteração sobre chaves e valores

Você pode iterar sobre as chaves em uma hashtable para processar os valores de várias maneiras. Cada um dos exemplos nesta seção tem saída idêntica. Eles iteram sobre a $hash variável definida aqui:

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

Nota

Nesses exemplos, $hash é definido como um dicionário ordenado para garantir que a saída esteja sempre na mesma ordem. Esses exemplos funcionam da mesma forma para hashtables normais, mas a ordem da saída não é previsível.

Cada exemplo retorna uma mensagem para cada chave e seu valor:

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

Este exemplo usa um bloco foreach para iterar sobre as chaves.

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

Este exemplo usa ForEach-Object para iterar sobre as chaves.

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

Este exemplo usa o método GetEnumerator para enviar cada par chave-valor através do pipeline para ForEach-Object.

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

Este exemplo usa os métodos GetEnumerator e ForEach para iterar em cada par chave-valor.

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

Adicionando e removendo chaves e valores

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

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

Por exemplo, para adicionar uma chave "Time" com um valor de "Now" à hashtable, use o seguinte formato de instrução.

$hash["Time"] = "Now"

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

Add(Key, Value)

Por exemplo, para adicionar uma Time chave com um valor de à hashtable, use o seguinte formato de Now instrução.

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

Além disso, você pode adicionar chaves e valores a uma hashtable usando o operador de adição (+) para adicionar uma hashtable a uma hashtable existente. Por exemplo, a instrução a seguir adiciona uma Time chave com um valor de Now para a hashtable na $hash variável.

$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 Hashtable objeto. O método Remove usa a chave como seu valor.

O Remove método tem a seguinte sintaxe:

Remove(Key)

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

$hash.Remove("Time")

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

Tipos de objeto em HashTables

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

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

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

Você pode exibir a hashtable e $p usar as propriedades key-name para exibir os 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

As chaves em uma hashtable podem ser de qualquer tipo .NET. A instrução a seguir adiciona um par chave-valor à hashtable 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 que você usa para outros pares na hashtable.

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

As chaves e valores em uma hashtable também podem ser Hashtable objetos. A instrução a seguir adiciona o par chave-valor à hashtable na $p variável na qual a chave é uma cadeia de caracteres, Hash2, e o valor é uma hashtable 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.

PS> $p

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

PS> $p.Hash2

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

PS> $p.Hash2.b
2

Chaves e valores de classificação

Os itens em uma hashtable 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 hashtable, você pode usar o método GetEnumerator de hashtables para enumerar as chaves e os valores e, em seguida, usar o Sort-Object cmdlet para classificar os valores enumerados para exibição.

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

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

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

O seguinte comando utiliza o mesmo procedimento para classificar os valores hash em ordem descendente.

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

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

Criando objetos a partir de hashtables

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

A sintaxe é a seguinte:

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

Esse método funciona apenas para classes que têm 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 hashtable. Você pode usar o ConvertFrom-StringData cmdlet com segurança na seção Dados de um script e pode usá-lo com o Import-LocalizedData cmdlet para exibir mensagens do usuário na cultura da interface do usuário (UI) do usuário atual.

Here-strings são especialmente úteis quando os valores na hashtable incluem aspas. Para obter mais informações sobre cadeias de caracteres here, 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 hashtable.

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

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

Este comando usa o ConvertFrom-StringData cmdlet para converter a cadeia de caracteres here em uma hashtable.

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 here, consulte about_Quoting_Rules.

Consulte também