Dela via


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.

SE ÄVEN

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

System.Collections.Hashtable