about_Hash_Tables

Rövid leírás

Ismerteti, hogyan hozhat létre, használhat és rendezhet kivonattáblákat a PowerShellben.

Hosszú leírás

A kivonattáblák, más néven szótárak vagy asszociatív tömbök olyan kompakt adatstruktúrák, amelyek egy vagy több kulcs/érték pár tárolására szolgálnak. A kivonattáblák tartalmazhatnak például IP-címeket és számítógépneveket, ahol az IP-címek a kulcsok, a számítógépnevek pedig az értékek, vagy fordítva.

A PowerShellben minden kivonattábla egy Hashtable (System.Collections.Hashtable) objektum. A Kivonatoló objektumok tulajdonságait és metódusait a PowerShellben használhatja.

A PowerShell 3.0-tól kezdve a [ordered] attribútummal rendezett szótárat (System.Collections.Special.OrderedDictionary) hozhat létre a PowerShellben.

A rendezett szótárak abban különböznek a kivonattábláktól, hogy a kulcsok mindig a lista sorrendjében jelennek meg. A kivonattáblák kulcsainak sorrendje nem határozható meg.

A kivonattáblák kulcsai és értéke szintén .NET-objektumok. Ezek leggyakrabban sztringek vagy egész számok, de bármilyen objektumtípussal rendelkezhetnek. Beágyazott kivonattáblákat is létrehozhat, amelyekben a kulcs értéke egy másik kivonattábla.

A kivonattáblákat gyakran használják, mert nagyon hatékonyak az adatok megkereséséhez és lekéréséhez. Kivonattáblák használatával listákat tárolhat, és számított tulajdonságokat hozhat létre a PowerShellben. A PowerShell rendelkezik egy parancsmaggal, ConvertFrom-StringDataamely kivonattáblává alakítja a sztringeket.

Syntax

A kivonattáblák szintaxisa a következő:

@{ <name> = <value>; [<name> = <value> ] ...}

A rendezett szótár szintaxisa a következő:

[ordered]@{ <name> = <value>; [<name> = <value> ] ...}

A [rendezett] attribútum a PowerShell 3.0-ban lett bevezetve.

Kivonattáblák létrehozása

Kivonattábla létrehozásához kövesse az alábbi irányelveket:

  • Kezdje el a kivonattáblát egy at sign (@) jellel.
  • A kivonattáblát kapcsos{} zárójelekbe () kell befoglalni.
  • Adjon meg egy vagy több kulcs/érték párt a kivonattábla tartalmához.
  • Használjon egyenlőségjelet (=) az egyes kulcsok értékétől való elválasztásához.
  • A kulcs/érték párok elválasztásához használjon pontosvesszőt (;) vagy sortörést.
  • A szóközöket tartalmazó kulcsokat idézőjelek közé kell tenni. Az értékeknek érvényes PowerShell-kifejezéseknek kell lenniük. A sztringeknek idézőjelekben kell megjelenniük, még akkor is, ha nem tartalmaznak szóközöket.
  • A kivonattábla kezeléséhez mentse egy változóba.
  • Ha rendezett kivonattáblát rendel egy változóhoz, helyezze a [rendezett] attribútumot a @ szimbólum elé. Ha a változó neve elé helyezi, a parancs sikertelen lesz.

Ha üres kivonattáblát szeretne létrehozni a $hash értékében, írja be a következőt:

$hash = @{}

A létrehozáskor kulcsokat és értékeket is hozzáadhat a kivonattáblákhoz. Az alábbi utasítás például létrehoz egy három kulcsból álló kivonattáblát.

$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

Rendezett szótárak létrehozása

Rendezett szótárat úgy hozhat létre, hogy hozzáad egy OrderedDictionary típusú objektumot, de a rendezett szótár létrehozásának legegyszerűbb módja az [ordered] attribútum használata.

Az [ordered] attribútum a PowerShell 3.0-ban van bevezetve.

Helyezze az attribútumot közvetlenül a "@" szimbólum elé.

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

A rendezett szótárak ugyanúgy használhatók, mint a kivonattáblák. Bármelyik típus használható a kivonattáblát vagy szótárt (iDictionary) használó paraméterek értékeként.

Az attribútum nem használható [ordered] kivonattáblák konvertálására vagy leadására. Ha a rendezett attribútumot a változó neve elé helyezi, a parancs a következő hibaüzenettel meghiúsul.

[ordered]$hash = @{}
ParserError:
Line |
   1 |  [ordered]$hash = @{}
     |  ~~~~~~~~~~~~~~
     | The ordered attribute can be specified only on a hash literal node.

A kifejezés javításához helyezze át a [rendezett] attribútumot.

$hash = [ordered]@{}

A rendezett szótárak kivonattáblába vethetők, de a rendezett attribútum nem állítható helyre, még akkor sem, ha törli a változót, és új értékeket ad meg. A sorrend visszaállításához el kell távolítania és újra létre kell hoznia a változót.

[hashtable]$hash = [ordered]@{
  Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name                           Value
----                           -----
Color                          Blue
Shape                          Square
Number                         1

Kivonattáblák megjelenítése

Ha egy változóba mentett kivonattáblát szeretne megjeleníteni, írja be a változó nevét. Alapértelmezés szerint a kivonattáblák táblázatként jelennek meg, amelyben egy oszlop van a kulcsokhoz és egy az értékekhez.

$hash
Name                           Value
----                           -----
Shape                          Square
Color                          Blue
Number                         1

A kivonattáblák kulcs- és értéktulajdonságokkal rendelkeznek. A pont jelölésével megjelenítheti az összes kulcsot vagy az összes értéket.

$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue

Minden kulcsnév a kivonattábla tulajdonsága is, értéke pedig a kulcs-név tulajdonság értéke. A tulajdonságértékek megjelenítéséhez használja az alábbi formátumot.

$hashtable.<key>
<value>

Például:

$hash.Number
1

$hash.Color
Blue

A kivonattáblák count tulajdonsága jelzi a kulcs-érték párok számát a kivonattáblában.

$hash.count
3

A kivonattáblatáblák nem tömbök, ezért nem használhat egész számokat indexként a kivonattáblában, de kulcsnévvel indexelheti a kivonattáblát. Ha a kulcs sztringérték, a kulcs nevét idézőjelek közé kell tenni.

Például:

$hash["Number"]
1

Tulajdonságnév-ütközések kezelése

Ha a kulcsnév ütközik a HashTable típus egyik tulajdonságnevével, a psbasebelső tagjával hozzáférhet ezekhez a tulajdonságokhoz. Ha például a kulcs neve, keys és vissza szeretné adni a Kivonattábla kulcsok gyűjteményét, használja a következő szintaxist:

$hashtable.psbase.Keys

Ez a System.Collections.IDictionary felületet implementáló egyéb típusokra is vonatkozik, például az OrderedDictionaryra.

Kulcsok és értékek iterálása

A kivonattáblákban található kulcsokat iterálva többféleképpen is feldolgozhatja az értékeket. Az ebben a szakaszban szereplő példák mindegyike azonos kimenettel rendelkezik. Iterálnak az $hash itt definiált változón:

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Megjegyzés

Ezekben a példákban rendezett szótárként definiáljuk, $hash hogy a kimenet mindig ugyanabban a sorrendben legyen. Ezek a példák a normál kivonattáblák esetében is ugyanúgy működnek, de a kimenet sorrendje nem kiszámítható.

Minden példa egy üzenetet ad vissza minden kulcshoz és annak értékéhez:

The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue

Ez a példa egy foreach blokkot használ a kulcsok iterálásához.

foreach ($Key in $hash.Keys) {
    "The value of '$Key' is: $($hash[$Key])"
}

Ez a példa a kulcsok iterálását használja ForEach-Object .

$hash.Keys | ForEach-Object {
    "The value of '$_' is: $($hash[$_])"
}

Ez a példa a GetEnumerator metódussal küldi el az egyes kulcs-érték párokat a folyamaton keresztül.ForEach-Object

$hash.GetEnumerator() | ForEach-Object {
    "The value of '$($_.Key)' is: $($_.Value)"
}

Ez a példa a GetEnumerator és a ForEach metódusokat használja az egyes kulcs-érték párok iterálására.

$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})

Kulcsok és értékek hozzáadása és eltávolítása

Ha kulcsokat és értékeket szeretne hozzáadni egy kivonattáblához, használja az alábbi parancsformátumot.

$hash["<key>"] = "<value>"

Ha például egy "Now" értékű "Time" kulcsot szeretne hozzáadni a kivonattáblához, használja az alábbi utasításformátumot.

$hash["Time"] = "Now"

Kulcsokat és értékeket a System.Collections.Hashtable objektum Add metódusával is hozzáadhat egy kivonattáblához. Az Add metódus szintaxisa a következő:

Add(Key, Value)

Ha például egy "Now" értékű "Time" kulcsot szeretne hozzáadni a kivonattáblához, használja az alábbi utasításformátumot.

$hash.Add("Time", "Now")

Emellett kulcsokat és értékeket is hozzáadhat egy kivonattáblához az összeadás operátorral (+) egy kivonattábla meglévő kivonattáblához való hozzáadásához. Az alábbi utasítás például hozzáad egy "Time" kulcsot a "Now" értékkel a $hash változó kivonattáblájába.

$hash = $hash + @{Time="Now"}

Változókban tárolt értékeket is hozzáadhat.

$t = "Today"
$now = (Get-Date)

$hash.Add($t, $now)

A kivonattáblából nem távolíthat el kulcs-érték párokat kivonási operátorral, de használhatja a Kivonatoló objektum Remove metódusát. A Remove metódus a kulcsot veszi értékként.

A Remove metódus szintaxisa a következő:

Remove(Key)

Ha például el szeretné távolítani a Time=Now kulcs/érték párt a kivonattáblából a $hash változó értékében, írja be a következőt:

$hash.Remove("Time")

A PowerShellben használhatja a Kivonatolható objektumok összes tulajdonságát és metódusát, beleértve a Tartalmaz, a Törlés, a Klónozás és a CopyTo objektumot is. A hashtable objektumokkal kapcsolatos további információkért lásd: System.Collections.Hashtable.

Objektumtípusok a Kivonattáblákban

A kivonattáblák kulcsai és értékei bármilyen .NET-objektumtípussal rendelkezhetnek, és egyetlen kivonattáblában több típusú kulcs és érték is lehet.

Az alábbi utasítás létrehoz egy kivonattáblát a folyamatnév-sztringekről és a folyamatobjektum-értékekről, és menti azt a $p változóba.

$p = @{"PowerShell" = (Get-Process PowerShell);
"Notepad" = (Get-Process notepad)}

Megjelenítheti a kivonattáblát, $p és a kulcsnév tulajdonságaival megjelenítheti az értékeket.

$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

A kivonattáblák kulcsai bármilyen .NET-típust tartalmazhatnak. Az alábbi utasítás hozzáad egy kulcs/érték párt a változó kivonattáblájába $p . A kulcs egy szolgáltatásobjektum, amely a WinRM szolgáltatást jelöli, és az érték a szolgáltatás aktuális állapota.

$p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}

Az új kulcs/érték pár a kivonattáblában használt más párokhoz használt metódusokkal jeleníthető meg és érhető el.

$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

A kivonattáblában szereplő kulcsok és értékek kivonattáblázat-objektumok is lehetnek. Az alábbi utasítás hozzáadja a kulcs/érték párokat abban a változóban található kivonattáblához, amelyben a $p kulcs egy sztring, a Hash2, az érték pedig egy három kulcs/érték párból álló kivonattábla.

$p = $p + @{"Hash2"= @{a=1; b=2; c=3}}

Az új értékeket ugyanazokkal a metódusokkal jelenítheti meg és érheti el.

$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

Kulcsok és értékek rendezése

A kivonattáblák elemei belsőleg rendezetlenek. A kulcs-érték párok minden megjelenítéskor eltérő sorrendben jelenhetnek meg.

Bár kivonattáblát nem tud rendezni, a kivonattáblák GetEnumerator metódusával számba vehet kulcsokat és értékeket, majd a Sort-Object parancsmaggal rendezheti a számba vett értékeket megjelenítésre.

Az alábbi parancsok például számba adják a változó kivonattáblájában $p szereplő kulcsokat és értékeket, majd betűrendbe rendezik a kulcsokat.

$p.GetEnumerator() | Sort-Object -Property key

Name                           Value
----                           -----
Notepad                        System.Diagnostics.Process (notepad)
PowerShell                     System.Diagnostics.Process (PowerShell)
System.ServiceProcess.Servi... Running

Az alábbi parancs ugyanezt az eljárást használja a kivonatértékek csökkenő sorrendbe rendezéséhez.

$p.getenumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running

Objektumok létrehozása kivonattáblákból

A PowerShell 3.0-tól kezdve tulajdonságokat és tulajdonságértékeket tartalmazó kivonattáblából hozhat létre objektumokat.

A szintaxis a következő:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Ez a metódus csak null értékű konstruktorsal rendelkező osztályok esetében működik, azaz paraméterekkel nem rendelkező konstruktorokhoz. Az objektum tulajdonságainak nyilvánosnak és beállíthatónak kell lenniük.

További információ: about_Object_Creation.

ConvertFrom-StringData

A ConvertFrom-StringData parancsmag kivonattáblává alakít át egy sztringet vagy egy kulcs-érték párokat tartalmazó itt-sztringet. A parancsmagot biztonságosan használhatja ConvertFrom-StringData egy szkript Adatok szakaszában, és a parancsmaggal együtt használhatja a Import-LocalizedData felhasználói üzenetek megjelenítésére az aktuális felhasználó felhasználói felületi (UI) kultúrájában.

Az itt szereplő sztringek különösen akkor hasznosak, ha a kivonattáblában szereplő értékek idézőjeleket tartalmaznak. Az itt található sztringekkel kapcsolatos további információkért lásd: about_Quoting_Rules.

Az alábbi példa bemutatja, hogyan hozhat létre itt-sztringet az előző példában szereplő felhasználói üzenetekből, és hogyan konvertálhatja ConvertFrom-StringData őket egy sztringből kivonattáblává.

A következő parancs létrehozza a kulcs-érték párok here-string karakterláncát, majd menti azt a $string változóba.

$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@

Ez a parancs a ConvertFrom-StringData parancsmag használatával konvertálja az here-stringet kivonattáblává.

ConvertFrom-StringData $string

Name                           Value
----                           -----
Msg3                           Enter an alias (or "nickname").
Msg2                           She said, "Hello, World."
Msg1                           Type "Windows".

Az itt található sztringekkel kapcsolatos további információkért lásd: about_Quoting_Rules.

Lásd még