Delen via


about_Hash_Tables

Korte beschrijving

Hierin wordt beschreven hoe u hashtabellen maakt, gebruikt en sorteert in PowerShell.

Lange beschrijving

Een hashtabel, ook wel een woordenlijst of associatieve matrix genoemd, is een compacte gegevensstructuur waarin een of meer sleutel-waardeparen worden opgeslagen. Een hashtabel kan bijvoorbeeld een reeks IP-adressen en computernamen bevatten, waarbij de IP-adressen de sleutels zijn en de computernamen de waarden zijn, of omgekeerd.

In PowerShell is elke hashtabel een Hashtable-object (System.Collections.Hashtable). U kunt de eigenschappen en methoden van Hashtable-objecten in PowerShell gebruiken.

Vanaf PowerShell 3.0 kunt u het kenmerk [besteld] gebruiken om een geordende woordenlijst (System.Collections.Specialized.OrderedDictionary) te maken in PowerShell.

Geordende woordenlijsten verschillen van hash-tabellen omdat de sleutels altijd worden weergegeven in de volgorde waarin u ze weergeeft. De volgorde van sleutels in een hash-tabel wordt niet bepaald.

De sleutels en waarde in hash-tabellen zijn ook .NET-objecten. Dit zijn meestal tekenreeksen of gehele getallen, maar ze kunnen elk objecttype hebben. U kunt ook geneste hashtabellen maken, waarin de waarde van een sleutel een andere hashtabel is.

Hash-tabellen worden vaak gebruikt omdat ze zeer efficiënt zijn voor het zoeken en ophalen van gegevens. U kunt hash-tabellen gebruiken om lijsten op te slaan en berekende eigenschappen te maken in PowerShell. En PowerShell heeft een cmdlet, ConvertFrom-StringData, waarmee tekenreeksen worden geconverteerd naar een hash-tabel.

Syntax

De syntaxis van een hash-tabel is als volgt:

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

De syntaxis van een geordende woordenlijst is als volgt:

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

Het kenmerk [besteld] is geïntroduceerd in PowerShell 3.0.

Hash-tabellen maken

Volg deze richtlijnen om een hash-tabel te maken:

  • Begin de hashtabel met een at-teken (@).
  • Plaats de hash-tabel tussen accolades ({}).
  • Voer een of meer sleutel-waardeparen in voor de inhoud van de hash-tabel.
  • Gebruik een gelijkteken (=) om elke sleutel van de waarde te scheiden.
  • Gebruik een puntkomma (;) of een regeleinde om de sleutel-waardeparen van elkaar te scheiden.
  • Sleutels die spaties bevatten, moeten tussen aanhalingstekens worden geplaatst. Waarden moeten geldige PowerShell-expressies zijn. Tekenreeksen moeten tussen aanhalingstekens worden weergegeven, zelfs als ze geen spaties bevatten.
  • Als u de hash-tabel wilt beheren, slaat u deze op in een variabele.
  • Wanneer u een geordende hash-tabel aan een variabele toewijst, plaatst u het kenmerk [geordende] vóór het @ symbool. Als u deze vóór de naam van de variabele plaatst, mislukt de opdracht.

Als u een lege hash-tabel wilt maken in de waarde van $hash, typt u:

$hash = @{}

U kunt ook sleutels en waarden toevoegen aan een hash-tabel wanneer u deze maakt. Met de volgende instructie maakt u bijvoorbeeld een hash-tabel met drie sleutels.

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

Geordende woordenlijsten maken

U kunt een geordende woordenlijst maken door een object van het type OrderedDictionary toe te voegen, maar de eenvoudigste manier om een geordende woordenlijst te maken, is het [ordered] kenmerk te gebruiken.

Het [ordered] kenmerk wordt geïntroduceerd in PowerShell 3.0.

Plaats het kenmerk direct vóór het symbool '@'.

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

U kunt geordende woordenlijsten op dezelfde manier gebruiken als hashtabellen. Beide typen kunnen worden gebruikt als de waarde van parameters die een hash-tabel of woordenlijst (iDictionary) gebruiken.

U kunt het [ordered] kenmerk niet gebruiken om een hash-tabel te converteren of te casten. Als u het geordende kenmerk vóór de naam van de variabele plaatst, mislukt de opdracht met het volgende foutbericht.

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

Als u de expressie wilt corrigeren, verplaatst u het kenmerk [geordende].

$hash = [ordered]@{}

U kunt een geordende woordenlijst naar een hashtabel casten, maar u kunt het geordende kenmerk niet herstellen, zelfs niet als u de variabele wist en nieuwe waarden invoert. Als u de volgorde wilt herstellen, moet u de variabele verwijderen en opnieuw maken.

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

Hash-tabellen weergeven

Als u een hash-tabel wilt weergeven die is opgeslagen in een variabele, typt u de naam van de variabele. Een hash-tabel wordt standaard weergegeven als een tabel met één kolom voor sleutels en één voor waarden.

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

Hash-tabellen hebben de eigenschappen Sleutels en Waarden. Gebruik puntnotatie om alle toetsen of alle waarden weer te geven.

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

Elke sleutelnaam is ook een eigenschap van de hashtabel en de waarde ervan is de waarde van de eigenschap key-name. Gebruik de volgende indeling om de eigenschapswaarden weer te geven.

$hashtable.<key>
<value>

Bijvoorbeeld:

$hash.Number
1

$hash.Color
Blue

Als de sleutelnaam botst met een van de eigenschapsnamen van het type HashTable, kunt u gebruiken om toegang te krijgen PSBase tot deze eigenschappen. Als de sleutelnaam bijvoorbeeld is keys en u de verzameling sleutels wilt retourneren, gebruikt u deze syntaxis:

$hashtable.PSBase.Keys

Hash-tabellen hebben de eigenschap Count die het aantal sleutel-waardeparen in de hashtabel aangeeft.

$hash.count
3

Hashtabeltabellen zijn geen matrices, dus u kunt geen geheel getal als index gebruiken in de hashtabel, maar u kunt wel een sleutelnaam gebruiken om in de hashtabel te indexeren. Als de sleutel een tekenreekswaarde is, plaatst u de sleutelnaam tussen aanhalingstekens.

Bijvoorbeeld:

$hash["Number"]
1

Sleutels en waarden toevoegen en verwijderen

Als u sleutels en waarden wilt toevoegen aan een hash-tabel, gebruikt u de volgende opdrachtindeling.

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

Als u bijvoorbeeld de sleutel 'Tijd' met de waarde 'Nu' wilt toevoegen aan de hash-tabel, gebruikt u de volgende instructieindeling.

$hash["Time"] = "Now"

U kunt ook sleutels en waarden toevoegen aan een hash-tabel met behulp van de methode Add van het object System.Collections.Hashtable. De methode Add heeft de volgende syntaxis:

Add(Key, Value)

Als u bijvoorbeeld de sleutel 'Tijd' met de waarde 'Nu' wilt toevoegen aan de hash-tabel, gebruikt u de volgende instructieindeling.

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

En u kunt sleutels en waarden toevoegen aan een hash-tabel met behulp van de optellingsoperator (+) om een hash-tabel toe te voegen aan een bestaande hashtabel. Met de volgende instructie wordt bijvoorbeeld een sleutel 'Tijd' met de waarde 'Nu' toegevoegd aan de hashtabel in de variabele $hash.

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

U kunt ook waarden toevoegen die zijn opgeslagen in variabelen.

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

$hash.Add($t, $now)

U kunt een aftrekkingsoperator niet gebruiken om een sleutel-waardepaar uit een hashtabel te verwijderen, maar u kunt wel de methode Remove van het object Hashtable gebruiken. De methode Remove gebruikt de sleutel als waarde.

De methode Remove heeft de volgende syntaxis:

Remove(Key)

Als u bijvoorbeeld het sleutel/waardepaar Time=Now wilt verwijderen uit de hashtabel in de waarde van de variabele $hash, typt u:

$hash.Remove("Time")

U kunt alle eigenschappen en methoden van Hashtable-objecten in PowerShell gebruiken, waaronder Contains, Clear, Clone en CopyTo. Zie System.Collections.Hashtable voor meer informatie over Hashtable-objecten.

Objecttypen in HashTables

De sleutels en waarden in een hashtabel kunnen elk .NET-objecttype hebben en één hashtabel kan sleutels en waarden van meerdere typen hebben.

Met de volgende instructie maakt u een hash-tabel met procesnaamtekenreeksen en procesobjectwaarden en slaat u deze op in de $p variabele.

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

U kunt de hash-tabel weergeven in $p en de eigenschappen van de sleutelnaam gebruiken om de waarden weer te geven.

$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

De sleutels in een hash-tabel kunnen ook elk .NET-type zijn. Met de volgende instructie wordt een sleutel-waardepaar toegevoegd aan de hash-tabel in de $p variabele. De sleutel is een Service-object dat de WinRM-service vertegenwoordigt en de waarde is de huidige status van de service.

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

U kunt het nieuwe sleutel-waardepaar weergeven en openen met behulp van dezelfde methoden die u gebruikt voor andere paren in de hash-tabel.

$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

De sleutels en waarden in een hash-tabel kunnen ook Hashtable-objecten zijn. Met de volgende instructie wordt een sleutel-waardepaar toegevoegd aan de hash-tabel in de $p variabele waarin de sleutel een tekenreeks is, Hash2, en de waarde een hash-tabel met drie sleutel-waardeparen is.

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

U kunt de nieuwe waarden weergeven en openen met dezelfde methoden.

$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

Sleutels en waarden sorteren

De items in een hash-tabel zijn intrinsiek ongeordeerd. De sleutel-waardeparen kunnen in een andere volgorde worden weergegeven telkens wanneer u ze weergeeft.

Hoewel u een hashtabel niet kunt sorteren, kunt u de methode GetEnumerator van hashtabellen gebruiken om de sleutels en waarden op te sommen en vervolgens de cmdlet Sort-Object gebruiken om de geïnventareerde waarden voor weergave te sorteren.

De volgende opdrachten inventariseren bijvoorbeeld de sleutels en waarden in de hash-tabel in de $p variabele en sorteren de sleutels vervolgens in alfabetische volgorde.

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

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

Met de volgende opdracht wordt dezelfde procedure gebruikt om de hashwaarden in aflopende volgorde te sorteren.

$p.getenumerator() | Sort-Object -Property Value -Descending

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

Objecten maken van hashtabellen

Vanaf PowerShell 3.0 kunt u een object maken op basis van een hashtabel met eigenschappen en eigenschapswaarden.

De syntaxis is als volgt:

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

Deze methode werkt alleen voor klassen die een null-constructor hebben, dat wil gezegd, een constructor die geen parameters heeft. De objecteigenschappen moeten openbaar en instelbaar zijn.

Zie about_Object_Creation voor meer informatie.

ConvertFrom-StringData

De ConvertFrom-StringData cmdlet converteert een tekenreeks of een here-tekenreeks van sleutel-waardeparen naar een hash-tabel. U kunt de ConvertFrom-StringData cmdlet veilig gebruiken in de sectie Gegevens van een script en u kunt deze gebruiken met de Import-LocalizedData cmdlet om gebruikersberichten weer te geven in de gebruikersinterfacecultuur van de huidige gebruiker.

Hier-tekenreeksen zijn vooral handig wanneer de waarden in de hashtabel aanhalingstekens bevatten. Zie about_Quoting_Rules voor meer informatie over here-strings.

In het volgende voorbeeld ziet u hoe u een hier-tekenreeks maakt van de gebruikersberichten in het vorige voorbeeld en hoe u deze kunt gebruiken ConvertFrom-StringData om deze te converteren van een tekenreeks naar een hash-tabel.

Met de volgende opdracht maakt u een here-tekenreeks van de sleutel-waardeparen en slaat u deze vervolgens op in de $string variabele.

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

Deze opdracht gebruikt de ConvertFrom-StringData cmdlet om de here-tekenreeks te converteren naar een hash-tabel.

ConvertFrom-StringData $string

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

Zie about_Quoting_Rules voor meer informatie over here-strings.

Zie ook