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 [geordende] gebruiken om een geordende woordenlijst (System.Collections.Specialized.OrderedDictionary) 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 hash-tabel wordt niet bepaald.

De sleutels en waarde in hashtabellen zijn ook .NET-objecten. Ze 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 hash-tabel is.

Hash-tabellen worden vaak gebruikt omdat ze zeer efficiënt zijn voor het vinden 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 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 [geordende] is geïntroduceerd in PowerShell 3.0.

Hash-tabellen maken

Volg deze richtlijnen om een hash-tabel te maken:

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

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 hashtabellen gebruikt. Elk type kan 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.

Verplaats het kenmerk [geordende] om de expressie te corrigeren.

$hash = [ordered]@{}

U kunt een geordende woordenlijst naar een hash-tabel casten, maar u kunt het geordende kenmerk niet herstellen, zelfs als u de variabele wist en nieuwe waarden invoert. Als u de volgorde opnieuw wilt instellen, 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 hashtabel wilt weergeven die is opgeslagen in een variabele, 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

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 hash-tabel en de bijbehorende waarde is de waarde van de eigenschap sleutelnaam. 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 deze eigenschappen openen PSBase . Als de sleutelnaam bijvoorbeeld is keys en u de verzameling sleutels wilt retourneren, gebruikt u deze syntaxis:

$hashtable.PSBase.Keys

Hash-tabellen hebben een eigenschap Count die het aantal sleutel-waardeparen in de hash-tabel aangeeft.

$hash.count
3

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

Bijvoorbeeld:

$hash["Number"]
1

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 hash-tabel.

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

Als u bijvoorbeeld een 'Tijd'-sleutel met een 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 hashtabel met behulp van de methode Toevoegen van het object System.Collections.Hashtable. De methode Toevoegen heeft de volgende syntaxis:

Add(Key, Value)

Als u bijvoorbeeld een 'Tijd'-sleutel met een 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 opteloperator (+) om een hash-tabel toe te voegen aan een bestaande hash-tabel. Met de volgende instructie wordt bijvoorbeeld een 'Tijd'-sleutel met een waarde 'Nu' toegevoegd aan de hash-tabel 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 operator voor aftrekken gebruiken om een sleutel-waardepaar uit een hash-tabel te verwijderen, maar u kunt de methode Verwijderen van het Hashtable-object 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 uit de hash-tabel wilt verwijderen 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 hash-tabel kan sleutels en waarden van meerdere typen bevatten.

Met de volgende instructie maakt u een hash-tabel met procesnaamreeksen 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 $p en de sleutelnaameigenschappen 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 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 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 hashtabel kunnen ook Hashtable-objecten zijn. Met de volgende instructie wordt sleutel-waardepaar toegevoegd aan de hash-tabel in de $p variabele waarin de sleutel een tekenreeks, Hash2 en de waarde een hash-tabel is met drie sleutel-/waardeparen.

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

U kunt de nieuwe waarden weergeven en openen met behulp van 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 steeds in een andere volgorde worden weergegeven wanneer u ze weergeeft.

Hoewel u een hash-tabel niet kunt sorteren, kunt u de GetEnumerator-methode 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.

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

$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 hash-waarden 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 hash-tabel 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 met een null-constructor, dat wil gezegd, een constructor die geen parameters heeft. De objecteigenschappen moeten openbaar en ingesteld zijn.

Zie about_Object_Creation voor meer informatie.

ConvertFrom-StringData

Met de ConvertFrom-StringData cmdlet wordt een tekenreeks of een hier-tekenreeks met sleutel-waardeparen geconverteerd 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 zijn tekenreeksen vooral handig wanneer de waarden in de hashtabel aanhalingstekens bevatten. Zie about_Quoting_Rules voor meer informatie over hier-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 hash-tabel.

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

Zie ook