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 opgeeft. 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 hashtabellen 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 hashtabellen gebruiken om lijsten op te slaan en berekende eigenschappen te maken in PowerShell. PowerShell heeft een cmdlet, ConvertFrom-StringDatawaarmee tekenreeksen worden geconverteerd naar een hashtabel.

Syntaxis

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 hashtabel te maken:

  • Begin de hashtabel met een at sign (@).
  • Plaats de hashtabel tussen accolades ({}).
  • Voer een of meer sleutel-waardeparen in voor de inhoud van de hashtabel.
  • Gebruik een gelijkteken (=) om elke sleutel te scheiden van de waarde.
  • Gebruik een puntkomma (;) of een regeleinde om de sleutel-waardeparen 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 toewijst aan een variabele, 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 wordt bijvoorbeeld een hashtabel met drie sleutels gemaakt.

$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 u hashtables gebruikt. Elk type kan 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 casten naar een hashtabel, maar u kunt het geordende kenmerk niet herstellen, zelfs niet als u de variabele wist en nieuwe waarden invoert. Als u de volgorde opnieuw wilt bepalen, 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 hashtabel wilt weergeven die in een variabele is opgeslagen, typt u de naam van de variabele. Standaard wordt een hashtabel 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 punt notatie om alle sleutels 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 is de waarde van de sleutelnaameigenschap. Gebruik de volgende indeling om de eigenschapswaarden weer te geven.

$hashtable.<key>
<value>

Voorbeeld:

$hash.Number
1

$hash.Color
Blue

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

$hash.count
3

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

Voorbeeld:

$hash["Number"]
1

Conflicten tussen eigenschapsnamen afhandelen

Als de sleutelnaam conflicteert met een van de eigenschapsnamen van het hashtable-type, kunt u het intrinsiek psbase-lid 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.

Herhalen van sleutels en waarden

U kunt de sleutels in een hashtabel herhalen om de waarden op verschillende manieren te verwerken. Elk van de voorbeelden in deze sectie heeft 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 staat. 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 gebruikgemaakt ForEach-Object van het herhalen van de sleutels.

$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 ForEach-Objectte verzenden.

$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

Gebruik de volgende opdrachtindeling om sleutels en waarden toe te voegen aan een hashtabel.

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

Als u bijvoorbeeld een 'Tijd'-sleutel met de waarde 'Nu' wilt toevoegen aan de hashtabel, 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 een waarde van Now de hashtabel wilt toevoegen, gebruikt u de volgende instructieindeling.

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

En u kunt sleutels en waarden toevoegen aan een hashtabel met behulp van de optellenoperator (+) om een hashtabel toe te voegen aan een bestaande hashtabel. Met de volgende instructie wordt bijvoorbeeld een Time sleutel met een waarde toegevoegd Now 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 geen aftrekkingsoperator gebruiken om een sleutel-waardepaar uit een hash-tabel te verwijderen, maar u kunt 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 uit de hashtabel in de waarde van de $hash variabele wilt verwijderen, 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 bevatten.

Met de volgende instructie maakt u een hashtabel met tekenreeksen voor procesnamen en objectwaarden en slaat u deze op in de $p variabele.

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

U kunt de hashtabel weergeven $p en de sleutelnaameigenschappen gebruiken om de waarden weer te geven.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
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}
774
824

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

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

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

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
WinRM                          Running
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.keys
PowerShell

Status   Name               DisplayName
------   ----               -----------
Running  WinRM              Windows Remote Management (WS-Managem…
Notepad

De sleutels en waarden in een hashtabel kunnen ook objecten zijn Hashtable . Met de volgende instructie wordt sleutel-waardepaar toegevoegd aan de hashtabel in de $p variabele waarin de sleutel een tekenreeks, 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
----                           -----
WinRM                          Running
Hash2                          {a, b, c}
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.Hash2

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

PS> $p.Hash2.b
2

Sleutels en waarden sorteren

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

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

Met de volgende opdrachten worden bijvoorbeeld de sleutels en waarden in de hash-tabel in de $p variabele opgesomd en worden de sleutels vervolgens in alfabetische volgorde gesorteerd.

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

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

De volgende opdracht gebruikt dezelfde procedure 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                          {a, b, c}
WinRM                          Running

Objecten maken op afstand 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 ingesteld 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 zijn tekenreeksen vooral handig wanneer de waarden in de hashtabel aanhalingstekens bevatten. Zie about_Quoting_Rules voor meer informatie over deze tekenreeksen.

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

Met de volgende opdracht maakt u een here-string 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 deze tekenreeksen.

Zie ook