about_Hash_Tables
Kort beskrivning
Beskriver hur du skapar, använder och sorterar hash-tabeller i PowerShell.
Lång beskrivning
En hash-tabell, även kallad ordlista eller associativ matris, är en kompakt datastruktur som lagrar ett eller flera nyckel/värde-par. En hash-tabell kan till exempel innehålla en serie IP-adresser och datornamn, där IP-adresserna är nycklarna och datornamnen är värdena, eller tvärtom.
I PowerShell är varje hash-tabell ett Hashtable-objekt (System.Collections.Hashtable). Du kan använda egenskaperna och metoderna för Hashtable-objekt i PowerShell.
Från och med PowerShell 3.0 kan du använda attributet [ordnad] för att skapa en ordnad ordlista (System.Collections.Specialized.OrderedDictionary) i PowerShell.
Ordnade ordlistor skiljer sig från hash-tabeller eftersom nycklarna alltid visas i den ordning som du listar dem i. Ordningen på nycklar i en hash-tabell bestäms inte.
Nycklarna och värdet i hash-tabeller är också .NET-objekt. De är oftast strängar eller heltal, men de kan ha vilken objekttyp som helst. Du kan också skapa kapslade hash-tabeller, där värdet för en nyckel är en annan hash-tabell.
Hash-tabeller används ofta eftersom de är mycket effektiva för att hitta och hämta data. Du kan använda hash-tabeller för att lagra listor och skapa beräknade egenskaper i PowerShell. Och PowerShell har en cmdlet, ConvertFrom-StringData
, som konverterar strängar till en hash-tabell.
Syntax
Syntaxen för en hashtabell är följande:
@{ <name> = <value>; [<name> = <value> ] ...}
Syntaxen för en ordnad ordlista är följande:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
Attributet [ordered] introducerades i PowerShell 3.0.
Skapa hash-tabeller
Följ dessa riktlinjer för att skapa en hash-tabell:
- Börja hash-tabellen med ett vidtecken (
@
). - Omslut hash-tabellen i klammerparenteser (
{}
). - Ange ett eller flera nyckel/värde-par för innehållet i hash-tabellen.
- Använd ett likhetstecken (
=
) för att separera varje nyckel från dess värde. - Använd ett semikolon (
;
) eller en radbrytning för att separera nyckel/värde-paren. - Nycklar som innehåller blanksteg måste omges av citattecken. Värdena måste vara giltiga PowerShell-uttryck. Strängar måste visas inom citattecken, även om de inte innehåller blanksteg.
- Om du vill hantera hash-tabellen sparar du den i en variabel.
- När du tilldelar en ordnad hash-tabell till en variabel placerar du attributet [ordnat] före symbolen
@
. Om du placerar den före variabelnamnet misslyckas kommandot.
Om du vill skapa en tom hash-tabell i värdet för $hash skriver du:
$hash = @{}
Du kan också lägga till nycklar och värden i en hash-tabell när du skapar den. Följande instruktion skapar till exempel en hash-tabell med tre nycklar.
$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
Skapa ordnade ordlistor
Du kan skapa en ordnad ordlista genom att lägga till ett objekt av typen OrderedDictionary , men det enklaste sättet att skapa en ordnad ordlista är att använda attributet [ordered]
.
Attributet [ordered]
introduceras i PowerShell 3.0.
Placera attributet omedelbart före "@"-symbolen.
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Du kan använda ordnade ordlistor på samma sätt som du använder hash-tabeller. Endera typen kan användas som värde för parametrar som tar en hash-tabell eller ordlista (iDictionary).
Du kan inte använda [ordered]
attributet för att konvertera eller omvandla en hash-tabell. Om du placerar det ordnade attributet före variabelnamnet misslyckas kommandot med följande felmeddelande.
[ordered]$hash = @{}
ParserError:
Line |
1 | [ordered]$hash = @{}
| ~~~~~~~~~~~~~~
| The ordered attribute can be specified only on a hash literal node.
Om du vill korrigera uttrycket flyttar du attributet [ordnat].
$hash = [ordered]@{}
Du kan omvandla en ordnad ordlista till en hash-tabell, men du kan inte återställa det ordnade attributet, även om du rensar variabeln och anger nya värden. Om du vill återupprätta ordningen måste du ta bort och återskapa variabeln.
[hashtable]$hash = [ordered]@{
Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Visa hash-tabeller
Om du vill visa en hash-tabell som sparas i en variabel skriver du variabelnamnet. Som standard visas en hashtabell som en tabell med en kolumn för nycklar och en för värden.
$hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
Hash-tabeller har egenskaper för nycklar och värden. Använd punktnotation för att visa alla nycklar eller alla värden.
$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue
Varje nyckelnamn är också en egenskap för hash-tabellen och dess värde är värdet för nyckelnamnegenskapen. Använd följande format för att visa egenskapsvärdena.
$hashtable.<key>
<value>
Exempel:
$hash.Number
1
$hash.Color
Blue
Om nyckelnamnet kolliderar med ett av egenskapsnamnen för HashTable-typen kan du använda PSBase
för att komma åt dessa egenskaper. Om nyckelnamnet till exempel är keys
och du vill returnera samlingen nycklar använder du den här syntaxen:
$hashtable.PSBase.Keys
Hash-tabeller har egenskapen Antal som anger antalet nyckel/värde-par i hash-tabellen.
$hash.count
3
Hashtabelltabeller är inte matriser, så du kan inte använda ett heltal som ett index i hash-tabellen, men du kan använda ett nyckelnamn för att indexera till hash-tabellen. Om nyckeln är ett strängvärde omger du nyckelnamnet inom citattecken.
Exempel:
$hash["Number"]
1
Lägga till och ta bort nycklar och värden
Om du vill lägga till nycklar och värden i en hash-tabell använder du följande kommandoformat.
$hash["<key>"] = "<value>"
Om du till exempel vill lägga till en "Time"-nyckel med värdet "Nu" i hash-tabellen använder du följande instruktionsformat.
$hash["Time"] = "Now"
Du kan också lägga till nycklar och värden i en hash-tabell med hjälp av metoden Lägg till i objektet System.Collections.Hashtable. Metoden Lägg till har följande syntax:
Add(Key, Value)
Om du till exempel vill lägga till en "Time"-nyckel med värdet "Nu" i hash-tabellen använder du följande instruktionsformat.
$hash.Add("Time", "Now")
Och du kan lägga till nycklar och värden i en hash-tabell med hjälp av additionsoperatorn (+
) för att lägga till en hash-tabell i en befintlig hash-tabell. Följande instruktion lägger till exempel till en "Time"-nyckel med värdet "Nu" i hash-tabellen i variabeln $hash.
$hash = $hash + @{Time="Now"}
Du kan också lägga till värden som lagras i variabler.
$t = "Today"
$now = (Get-Date)
$hash.Add($t, $now)
Du kan inte använda en subtraktionsoperator för att ta bort ett nyckel/värde-par från en hash-tabell, men du kan använda metoden Ta bort för Hashtable-objektet. Metoden Remove tar nyckeln som dess värde.
Metoden Remove har följande syntax:
Remove(Key)
Om du till exempel vill ta bort nyckel/värde-paret Time=Now från hash-tabellen i värdet för variabeln $hash skriver du:
$hash.Remove("Time")
Du kan använda alla egenskaper och metoder för Hashtable-objekt i PowerShell, inklusive Contains, Clear, Clone och CopyTo. Mer information om Hashtable-objekt finns i System.Collections.Hashtable.
Objekttyper i HashTables
Nycklar och värden i en hash-tabell kan ha valfri .NET-objekttyp, och en enda hashtabell kan ha nycklar och värden av flera typer.
Följande instruktion skapar en hash-tabell med processnamnsträngar och processobjektvärden och sparar den i variabeln $p
.
$p = @{"PowerShell" = (Get-Process PowerShell);
"Notepad" = (Get-Process notepad)}
Du kan visa hash-tabellen i $p
och använda nyckelnamnsegenskaperna för att visa värdena.
$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
Nycklarna i en hash-tabell kan också vara valfri .NET-typ. Följande instruktion lägger till ett nyckel/värde-par i hash-tabellen i variabeln $p
. Nyckeln är ett tjänstobjekt som representerar WinRM-tjänsten och värdet är tjänstens aktuella status.
$p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}
Du kan visa och komma åt det nya nyckel-/värdeparet med samma metoder som du använder för andra par i hash-tabellen.
$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
Nycklar och värden i en hash-tabell kan också vara Hashtable-objekt. Följande instruktion lägger till nyckel/värde-par i hash-tabellen i $p
variabeln där nyckeln är en sträng, Hash2, och värdet är en hash-tabell med tre nyckel-/värdepar.
$p = $p + @{"Hash2"= @{a=1; b=2; c=3}}
Du kan visa och komma åt de nya värdena med hjälp av samma metoder.
$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
Sortera nycklar och värden
Objekten i en hash-tabell är i sig osorterade. Nyckel/värde-paren kan visas i en annan ordning varje gång du visar dem.
Även om du inte kan sortera en hash-tabell kan du använda metoden GetEnumerator för hash-tabeller för att räkna upp nycklar och värden och sedan använda cmdleten Sort-Object för att sortera uppräknade värden för visning.
Följande kommandon räknar till exempel upp nycklar och värden i hash-tabellen i variabeln $p
och sorterar sedan nycklarna i alfabetisk ordning.
$p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Notepad System.Diagnostics.Process (notepad)
PowerShell System.Diagnostics.Process (PowerShell)
System.ServiceProcess.Servi... Running
Följande kommando använder samma procedur för att sortera hash-värdena i fallande ordning.
$p.getenumerator() | Sort-Object -Property Value -Descending
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
Skapa objekt från hash-tabeller
Från och med PowerShell 3.0 kan du skapa ett objekt från en hash-tabell med egenskaper och egenskapsvärden.
Syntaxen ser ut så här:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Den här metoden fungerar endast för klasser som har en null-konstruktor, dvs. en konstruktor som inte har några parametrar. Objektegenskaperna måste vara offentliga och kan ställas in.
Mer information finns i about_Object_Creation.
ConvertFrom-StringData
Cmdleten ConvertFrom-StringData
konverterar en sträng eller en här-sträng med nyckel/värde-par till en hash-tabell. Du kan använda cmdleten ConvertFrom-StringData
på ett säkert sätt i avsnittet Data i ett skript och du kan använda den med cmdleten Import-LocalizedData
för att visa användarmeddelanden i användargränssnittskulturen (UI) för den aktuella användaren.
Här-strängar är särskilt användbara när värdena i hash-tabellen innehåller citattecken. Mer information om här-strängar finns i about_Quoting_Rules.
I följande exempel visas hur du skapar en här-sträng med användarmeddelanden i föregående exempel och hur du använder ConvertFrom-StringData
för att konvertera dem från en sträng till en hash-tabell.
Följande kommando skapar en här-sträng med nyckel/värde-paren och sparar den sedan i variabeln $string
.
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
Det här kommandot använder cmdleten ConvertFrom-StringData
för att konvertera here-string till en hash-tabell.
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
Mer information om här-strängar finns i about_Quoting_Rules.