Share via


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.

Se även