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-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 [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-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 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
Feedback
Feedback verzenden en weergeven voor