about_Hash_Tables

Rövid leírás

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

Hosszú leírás

A kivonatolók, más néven szótárak vagy asszociatív tömbök olyan kompakt adatszerkezetek, amelyek egy vagy több kulcs-érték párot tárolnak. A kivonattáblák például IP-címek és számítógépnevek sorozatát tartalmazhatják, ahol az IP-címek a kulcsok, a számítógépnevek pedig az értékek, vagy fordítva.

A PowerShellben minden kivonatoló objektum Hashtable[System.Collections.Hashtable] . A PowerShellben használhatja az objektumok tulajdonságait és metódusait Hashtable .

A PowerShell 3.0-tól kezdve az [ordered] attribútum használatával létrehozhat egy objektumot [System.Collections.Specialized.OrderedDictionary] a PowerShellben.

A rendezett szótárak abban különböznek a kivonatolóktól, hogy a kulcsok mindig a lista sorrendjében jelennek meg. A kivonatoló kulcsainak sorrendje nincs meghatározva.

A kivonatoló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 kivonatolókat is létrehozhat, amelyekben a kulcs értéke egy másik kivonatoló.

Hashtablegyakran használják őket, mert hatékonyak az adatok keresésére és beolvasására. A kivonatolókkal listákat tárolhat, és számított tulajdonságokat hozhat létre a PowerShellben. A PowerShell rendelkezik egy parancsmaggal, ConvertFrom-StringDataamely kivonatolóvá alakítja a sztringeket.

Syntax

A kivonatoló szintaxisa a következő:

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

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

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

A [ordered] típusgyorsítót a PowerShell 3.0-ban vezettük be.

Kivonatolók létrehozása

Kivonatoló létrehozásához kövesse az alábbi irányelveket:

  • Kezdje a kivonatolót egy előjellel (@).
  • Csatolja a kivonatolót kapcsos zárójelekbe ({}).
  • Adjon meg egy vagy több kulcs-érték párot a kivonatoló 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 foglalni. 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 kivonatoló kezeléséhez mentse egy változóba.
  • Ha rendezett kivonatolót rendel egy változóhoz, helyezze a típust [ordered] a @ szimbólum elé. Ha a változó neve elé helyezi, a parancs sikertelen lesz.

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

$hash = @{}

Kulcsokat és értékeket is hozzáadhat a kivonatolóhoz a létrehozáskor. A következő utasítás például létrehoz egy három kulcsból álló kivonatoló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 ilyen típusú objektumot OrderedDictionary , 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 kivonatolók. Bármelyik típus használható a kivonatolót vagy szótárt (iDictionary) használó paraméterek értékeként.

Az attribútum nem használható [ordered] kivonatoló 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árat átadhatja egy kivonatolóhoz, de a rendezett attribútumot még akkor sem tudja helyreállítani, 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

Egy változóba mentett kivonatoló megjelenítéséhez írja be a változó nevét. Alapértelmezés szerint a kivonatolók táblázatként jelennek meg, egy oszloptal a kulcsokhoz és egy értékhez.

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

A kivonatoló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 kivonatoló tulajdonsága is, értéke pedig a kulcsné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élda:

$hash.Number
1

$hash.Color
Blue

a kivonatolók count tulajdonsága jelzi a kulcs-érték párok számát a kivonatolóban.

$hash.count
3

A kivonatolótáblák nem tömbök, ezért nem használhat egész számokat indexként a kivonatolóba, de kulcsnév használatával indexelhet a kivonatolóba. Ha a kulcs sztringérték, a kulcs nevét idézőjelek közé kell foglalni.

Példa:

$hash["Number"]
1

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

Ha a kulcsnév ütközik a HashTable típusú tulajdonságnevek egyikével, a psbasebelső tagjával elérheti ezeket a tulajdonságokat. Ha például a kulcs neve, keys és vissza szeretné adni a Kivonatoló kulcsok gyűjteményét, használja ezt a szintaxist:

$hashtable.psbase.Keys

Ez az interfészt implementáló System.Collections.IDictionary egyéb típusokra is vonatkozik, például OrderedDictionary.

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

A kivonatolóban található kulcsok áthatolódásával többféleképpen is feldolgozhatja az értékeket. Az ebben a szakaszban szereplő példák mindegyike azonos kimenettel rendelkezik. Az itt definiált $hash változón iterálnak:

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

Feljegyzés

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

Minden példa egy üzenetet ad vissza minden kulcshoz és é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 ForEach-Objectkeresztül.

$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ához.

$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 kivonatolóhoz, használja a következő parancsformátumot.

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

Ha például egy "Time" kulcsot szeretne hozzáadni a kivonatolóhoz, használja az alábbi utasításformátumot.

$hash["Time"] = "Now"

Az objektum metódusával Add kulcsokat és értékeket is hozzáadhat a System.Collections.Hashtable kivonatolóhoz. A Add metódus szintaxisa a következő:

Add(Key, Value)

Ha például egy Time kulcs értékét Now szeretné hozzáadni a kivonatolóhoz, használja az alábbi utasításformátumot.

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

Emellett kulcsokat és értékeket is hozzáadhat egy kivonatolóhoz az összeadás operátorral (+) a meglévő kivonatolóhoz való hozzáadásához. Az alábbi utasítás például hozzáad egy Time kulcsot a változó kivonatolójának $hash értékévelNow.

$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 az Hashtable objektum Eltávolítás metódusát. Az Eltávolítás 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árot a kivonatolóból a változó értékében, írja be a $hash következőt:

$hash.Remove("Time")

A PowerShellben az objektumok összes tulajdonságát és metódusát Hashtable használhatja, beleértve a Contains, Clear, Cloneés CopyToa . Az objektumokkal kapcsolatos Hashtable további információkért lásd: System.Collections.Hashtable.

Objektumtípusok a Kivonattáblákban

A kivonatolóban lévő kulcsok és értékek bármilyen .NET-objektumtípussal rendelkezhetnek, és egyetlen kivonatoló több típusú kulcsokkal és értékekkel rendelkezhet.

Az alábbi utasítás létrehoz egy kivonatot 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 kivonatolót, $p és a kulcsnév tulajdonságaival megjelenítheti az értékeket.

PS> $p

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

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

PS> $p.keys | ForEach-Object {$p.$_.handles}
441
251

A kivonatoló kulcsai bármilyen .NET típusúak lehetnek. Az alábbi utasítás hozzáad egy kulcs-érték párot a változó kivonatolóhoz $p . A kulcs egy szolgáltatásobjektum , amely a WinRM szolgáltatást jelöli, az érték pedig a szolgáltatás aktuális állapota.

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

Az új kulcs-érték pár ugyanazokkal a módszerekkel jeleníthető meg és érhető el, mint a kivonatoló más párjaihoz.

PS> $p

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

PS> $p.keys
PowerShell
Notepad

Status   Name               DisplayName
------   ----               -----------
Running  winrm              Windows Remote Management (WS-Manag...

PS> $p.keys | ForEach-Object {$_.name}
WinRM

A kivonatoló kulcsai és értékei objektumok is lehetnek Hashtable . Az alábbi utasítás kulcs-érték párokat ad hozzá a kivonatolóhoz abban a $p változóban, amelyben a kulcs egy sztring , Kivonat2, az érték pedig egy három kulcs-érték párból álló kivonatoló.

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

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

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Hash2                          {[a, 1], [b, 2], [c, 3]}
Notepad                        System.Diagnostics.Process (Notepad)
WinRM                          Running

PS> $p.Hash2

Name                           Value
----                           -----
a                              1
b                              2
c                              3

PS> $p.Hash2.b
2

Kulcsok és értékek rendezése

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

Bár nem rendezhet kivonatolót, a getEnumerator metódussal számba vehet kulcsokat és értékeket, majd a Sort-Object parancsmaggal rendezheti a számba vett értékeket a megjelenítéshez.

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.

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

Name                           Value
----                           -----
Hash2                          {[a, 1], [b, 2], [c, 3]}
Notepad                        System.Diagnostics.Process (Notepad)
PowerShell                     System.Diagnostics.Process (pwsh)
WinRM                          Running

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

PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (Notepad)
Hash2                          {[a, 1], [b, 2], [c, 3]}
WinRM                          Running

Objektumok létrehozása kivonatolókból

A PowerShell 3.0-tól kezdve létrehozhat egy objektumot tulajdonságok és tulajdonságértékek kivonatából.

A szintaxis a következő:

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

Ez a módszer csak olyan osztályok esetében működik, amelyek konstruktora nem rendelkezik paraméterekkel. 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 a kulcs-érték párok egy sztringét vagy egy itt szereplő sztringet kivonatolóvá alakítja. A ConvertFrom-StringData parancsmagot biztonságosan használhatja egy szkript Adat szakaszában, és a Import-LocalizedData parancsmaggal is megjelenítheti a felhasználói üzeneteket az aktuális felhasználó felhasználói felületi (felhasználói felületi) kultúrájában.

Az alábbi sztringek különösen akkor hasznosak, ha a kivonatoló értékei idézőjeleket tartalmaznak. Az itt szereplő sztringekről további információt a about_Quoting_Rules talál.

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

Az alábbi parancs létrehozza a kulcs-érték párok egy here-sztringét, majd menti 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 parancsmaggal konvertálja az here-sztringet kivonatolóvá.

ConvertFrom-StringData $string

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

Az itt szereplő sztringekről további információt a about_Quoting_Rules talál.

Lásd még