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[System.Collections.Hashtable] object. U kunt de eigenschappen en methoden van Hashtable objecten in PowerShell gebruiken.

Vanaf PowerShell 3.0 kunt u het [ordered] kenmerk gebruiken om een [System.Collections.Specialized.OrderedDictionary] object te maken in PowerShell.

Geordende woordenlijsten verschillen van hashtabellen omdat de sleutels altijd worden weergegeven in de volgorde waarin u ze weergeeft. De volgorde van sleutels in een hashtabel wordt niet bepaald.

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

Hashtables worden vaak gebruikt omdat ze efficiënt zijn voor het zoeken en ophalen van gegevens. U kunt hashtables 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 hashtabel.

Syntax

De syntaxis van een hashtabel is als volgt:

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

De syntaxis van een geordende woordenlijst is als volgt:

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

De [ordered] typeversneller is geïntroduceerd in PowerShell 3.0.

Hashtables maken

Volg deze richtlijnen om een hashtable te maken:

  • Begin de hashtabel met een at-teken (@).
  • Plaats de hashtabel tussen accolades ({}).
  • Voer een of meer sleutel-waardeparen in voor de inhoud van de hashtabel.
  • 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 hashtabel wilt beheren, slaat u deze op in een variabele.
  • Wanneer u een geordende hashtabel aan een variabele toewijst, plaatst u het [ordered] type vóór het @ symbool. Als u deze vóór de naam van de variabele plaatst, mislukt de opdracht.

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

$hash = @{}

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

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

Geordende woordenlijsten maken

U kunt een geordende woordenlijst maken door een object van het OrderedDictionary type 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 hashtabel of woordenlijst (iDictionary) gebruiken.

U kunt het [ordered] kenmerk niet gebruiken om een hashtabel 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

Hashtables weergeven

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

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

hashtables 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 sleutelnaameigenschap. Gebruik de volgende indeling om de eigenschapswaarden weer te geven.

$hashtable.<key>
<value>

Bijvoorbeeld:

$hash.Number
1

$hash.Color
Blue

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

$hash.count
3

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

Bijvoorbeeld:

$hash["Number"]
1

Conflicten met eigenschapsnamen afhandelen

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

$hashtable.psbase.Keys

Dit geldt voor andere typen die de System.Collections.IDictionary interface implementeren, zoals OrderedDictionary.

Sleutels en waarden herhalen

U kunt de sleutels in een hashtabel herhalen om de waarden op verschillende manieren te verwerken. Elk van de voorbeelden in deze sectie heeft een identieke uitvoer. Ze herhalen de $hash variabele die hier is gedefinieerd:

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

Notitie

In deze voorbeelden $hash wordt gedefinieerd als een geordende woordenlijst om ervoor te zorgen dat de uitvoer altijd in dezelfde volgorde is. Deze voorbeelden werken hetzelfde voor normale hashtabellen, maar de volgorde van de uitvoer is niet voorspelbaar.

Elk voorbeeld retourneert een bericht voor elke sleutel en de bijbehorende waarde:

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

In dit voorbeeld wordt een foreach-blok gebruikt om de sleutels te herhalen.

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

In dit voorbeeld wordt gebruikt ForEach-Object om de sleutels te herhalen.

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

In dit voorbeeld wordt de methode GetEnumerator gebruikt om elk sleutel-waardepaar via de pijplijn naar te ForEach-Objectverzenden.

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

In dit voorbeeld worden de methoden GetEnumerator en ForEach gebruikt om elk sleutel-waardepaar te herhalen.

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

Sleutels en waarden toevoegen en verwijderen

Als u sleutels en waarden wilt toevoegen aan een hashtabel, gebruikt u de volgende opdrachtindeling.

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

Als u bijvoorbeeld een sleutel 'Tijd' met de waarde 'Nu' aan de hashtabel wilt toevoegen, gebruikt u de volgende instructieindeling.

$hash["Time"] = "Now"

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

Add(Key, Value)

Als u bijvoorbeeld een Time sleutel met de waarde van Now wilt toevoegen aan de hashtabel, gebruikt u de volgende instructieindeling.

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

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

$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 Hashtable object gebruiken. De methode Remove gebruikt de sleutel als waarde.

De Remove methode heeft de volgende syntaxis:

Remove(Key)

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

$hash.Remove("Time")

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

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 hashtabel van procesnaamtekenreeksen en procesobjectwaarden en slaat u deze op in de $p variabele.

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

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

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

De sleutels in een hashtabel kunnen elk .NET-type zijn. Met de volgende instructie wordt een sleutel-waardepaar toegevoegd aan de hashtabel 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 hashtabel.

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

De sleutels en waarden in een hashtabel kunnen ook objecten zijn Hashtable . De volgende instructie voegt sleutel-waardepaar toe aan de hashtabel in de $p variabele waarin de sleutel een tekenreeks is, Hash2, en de waarde een hashtabel is met drie sleutel-waardeparen.

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

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

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

Sleutels en waarden sorteren

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

Hoewel u een hashtabel niet kunt sorteren, kunt u de getEnumerator-methode van hashtables gebruiken om de sleutels en waarden op te sommen en vervolgens de Sort-Object cmdlet 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.

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

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

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

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 constructor hebben 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 hashtabel. 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 hashtabel.

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").
"@

Met deze opdracht wordt de ConvertFrom-StringData cmdlet gebruikt om de here-string te converteren naar een hashtabel.

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