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.