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-StringData
waarmee 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-Object
te 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
, Clone
en 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 PowerShell)
"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 (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 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 (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 . 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
---- -----
PowerShell System.Diagnostics.Process (pwsh)
Hash2 {[a, 1], [b, 2], [c, 3]}
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
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, 1], [b, 2], [c, 3]}
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, 1], [b, 2], [c, 3]}
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.