Om Hash-tabeller
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.
- Nyckeln 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 [ordnad] 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 attributet [ordnad] för att konvertera eller konvertera en hash-tabell. Om du placerar det ordnade attributet före variabelnamnet misslyckas kommandot med följande felmeddelande.
PS C:\> [ordered]$hash = @{}
At line:1 char:1
+ [ordered]$hash = @{}
+ [!INCLUDE[]()]
The ordered attribute can be specified only on a hash literal node.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordExc
eption
+ FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode
Om du vill korrigera uttrycket flyttar du attributet [ordnat].
PS C:\> $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.
PS C:\> [hashtable]$hash = [ordered]@{
>> Number = 1; Shape = "Square"; Color = "Blue"}
PS C:\> $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.
C:\PS> $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.
C:\PS> $hash.keys
Number
Shape
Color
C:\PS> $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:
C:\PS> $hash.Number
1
C:\PS> $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.
C:\PS> $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:
C:\PS> $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.
C:\PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
C:\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
C:\PS> $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.
C:\PS> $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.
C:\PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
C:\PS> $p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
C:\PS> $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.
C:\PS> $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.
C:\PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
Hash2 {a, b, c}
C:\PS> $p.Hash2
Name Value
---- -----
a 1
b 2
c 3
C:\PS> $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.
C:\PS> $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.
C:\PS> $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 bara för klasser som har en null-konstruktor, d.v.s. 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.
C:\PS> $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.
C:\PS> 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.