about_Hash_Tables

Kısa açıklama

PowerShell'de karma tablo oluşturma, kullanma ve sıralamayı açıklar.

Uzun açıklama

Sözlük veya ilişkilendirilebilir dizi olarak da bilinen karma tablo, bir veya daha fazla anahtar-değer çiftini depolayan kompakt bir veri yapısıdır. Örneğin, karma tablo bir dizi IP adresi ve bilgisayar adı içerebilir; burada IP adresleri anahtarlardır ve bilgisayar adları değerlerdir (veya tam tersi).

PowerShell'de her karma tablo bir Hashtable[System.Collections.Hashtable] nesnedir. PowerShell'de nesnelerin özelliklerini ve yöntemlerini Hashtable kullanabilirsiniz.

PowerShell 3.0'da başlayarak özniteliğini [ordered] kullanarak PowerShell'de bir [System.Collections.Specialized.OrderedDictionary] nesne oluşturabilirsiniz.

Sıralı sözlükler, anahtarların her zaman listelediğiniz sırada görünmesi bakımından karma tablolardan farklıdır. Karma tablodaki anahtarların sırası belirlenmiyor.

Karma tablolardaki anahtarlar ve değer de .NET nesneleridir. Bunlar genellikle dizeler veya tamsayılardır, ancak herhangi bir nesne türüne sahip olabilirler. Ayrıca, bir anahtarın değerinin başka bir karma tablo olduğu iç içe hashtable'lar da oluşturabilirsiniz.

Hashtableverileri bulmak ve almak için verimli olduklarından sık sık kullanılır. Karma tablolarını kullanarak listeleri depolayabilir ve PowerShell'de hesaplanmış özellikler oluşturabilirsiniz. PowerShell'de dizeleri karma tabloya dönüştüren bir cmdlet'i ConvertFrom-StringDatavardır.

Sözdizimi

Karma tablo söz dizimi aşağıdaki gibidir:

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

Sıralı sözlüğün söz dizimi aşağıdaki gibidir:

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

Tür hızlandırıcısı [ordered] PowerShell 3.0'da kullanıma sunulmuştur.

Karma tablo oluşturma

Karma tablo oluşturmak için şu yönergeleri izleyin:

  • Karma tabloya bir at işareti ()@ ile başlayın.
  • Hashtable'ı küme ayraçları ({} içine alın.
  • Karma tablo içeriği için bir veya daha fazla anahtar-değer çifti girin.
  • Her anahtarı değerinden ayırmak için eşittir işareti (=) kullanın.
  • Anahtar-değer çiftlerini ayırmak için noktalı virgül (;) veya satır sonu kullanın.
  • Boşluk içeren anahtarlar tırnak içine alınmalıdır. Değerler geçerli PowerShell ifadeleri olmalıdır. Dizeler boşluk içermese bile tırnak içinde görünmelidir.
  • Hashtable'ı yönetmek için bir değişkene kaydedin.
  • Bir değişkene sıralı karma tablo atarken, türü simgenin @ önüne yerleştirin[ordered]. Değişken adından önce yerleştirirseniz, komut başarısız olur.

$hash değerinde boş bir karma tablo oluşturmak için şunu yazın:

$hash = @{}

Ayrıca, bir karma tablo oluştururken anahtarlar ve değerler ekleyebilirsiniz. Örneğin, aşağıdaki deyim üç anahtarla bir karma tablo oluşturur.

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

Sıralı sözlükler oluşturma

Türünde bir nesne OrderedDictionary ekleyerek sıralı sözlük oluşturabilirsiniz, ancak sıralı sözlük oluşturmanın en kolay yolu özniteliğini [ordered] kullanmaktır.

[ordered] özniteliği PowerShell 3.0'da kullanıma sunulmuştur.

Özniteliği "@" simgesinin hemen önüne yerleştirin.

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

Sıralı sözlükleri karma tablolarla aynı şekilde kullanabilirsiniz. Her iki tür de karma tablo veya sözlük (iDictionary) alan parametrelerin değeri olarak kullanılabilir.

Bir karma tablo dönüştürmek veya oluşturmak için özniteliğini [ordered] kullanamazsınız. Sıralı özniteliği değişken adından önce yerleştirirseniz, komut aşağıdaki hata iletisiyle başarısız olur.

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

İfadeyi düzeltmek için [ordered] özniteliğini taşıyın.

$hash = [ordered]@{}

Sıralı sözlüğü bir karma tabloya dönüştürebilirsiniz, ancak değişkeni temizleyip yeni değerler girseniz bile sıralı özniteliği kurtaramazsınız. Sırayı yeniden oluşturmak için değişkeni kaldırıp yeniden oluşturmanız gerekir.

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

Karma tablo görüntüleme

Bir değişkene kaydedilmiş bir karma tablo görüntülemek için değişken adını yazın. Varsayılan olarak, karma tablolar anahtarlar için bir sütun ve değerler için bir sütun içeren bir tablo olarak görüntülenir.

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

karma tablolarının Anahtarlar ve Değerler özellikleri vardır. Tüm anahtarları veya tüm değerleri görüntülemek için nokta gösterimini kullanın.

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

Her anahtar adı aynı zamanda hashtable'ın bir özelliğidir ve değeri anahtar adı özelliğinin değeridir. Özellik değerlerini görüntülemek için aşağıdaki biçimi kullanın.

$hashtable.<key>
<value>

Örneğin:

$hash.Number
1

$hash.Color
Blue

karma tablolarının, karma tablodaki anahtar-değer çiftlerinin sayısını gösteren bir Count özelliği vardır.

$hash.count
3

karma tablo diziler değildir, bu nedenle karma tabloya dizin olarak bir tamsayı kullanamazsınız, ancak karma tabloya dizin oluşturmak için anahtar adı kullanabilirsiniz. Anahtar bir dize değeriyse, anahtar adını tırnak içine alın.

Örneğin:

$hash["Number"]
1

Özellik adı çakışmalarını işleme

Anahtar adı HashTable türünün özellik adlarından biriyle çakışırsa, bu özelliklere erişmek için psbaseiç üyesini kullanabilirsiniz. Örneğin, anahtar adı ise keys ve HashTable anahtarlarının koleksiyonunu döndürmek istiyorsanız, şu söz dizimini kullanın:

$hashtable.psbase.Keys

Bu, gibi OrderedDictionaryarabirimini System.Collections.IDictionary uygulayan diğer türler için geçerlidir.

Anahtarlar ve değerler üzerinde yineleme

Değerleri çeşitli yollarla işlemek için karma tablodaki anahtarları yineleyebilirsiniz. Bu bölümdeki örneklerin her biri aynı çıktıya sahiptir. Burada tanımlanan değişken üzerinde $hash yinelenir:

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

Not

Bu örneklerde, $hash çıkışın her zaman aynı sırada olduğundan emin olmak için sıralı bir sözlük olarak tanımlanır. Bu örnekler normal karma tablolarda aynı şekilde çalışır, ancak çıktının sırası tahmin edilebilir değildir.

Her örnek, her anahtar ve değeri için bir ileti döndürür:

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

Bu örnekte anahtarlar üzerinde yineleme yapmak için bir foreach bloğu kullanılır.

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

Bu örnek, anahtarları yinelemek için kullanır ForEach-Object .

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

Bu örnekte, her anahtar-değer çiftini işlem hattı üzerinden adresine göndermek için ForEach-ObjectGetEnumerator yöntemi kullanılır.

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

Bu örnekte, her anahtar-değer çifti üzerinde yineleme yapmak için GetEnumerator ve ForEach yöntemleri kullanılır.

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

Anahtar ve Değer Ekleme ve Kaldırma

Karma tabloya anahtar ve değer eklemek için aşağıdaki komut biçimini kullanın.

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

Örneğin, karma tabloya "Now" değerine sahip bir "Time" anahtarı eklemek için aşağıdaki deyim biçimini kullanın.

$hash["Time"] = "Now"

Ayrıca, nesnesinin yöntemini System.Collections.Hashtable kullanarak bir karma tabloya Add anahtar ve değer ekleyebilirsiniz. Add yöntemi aşağıdaki söz dizimine sahiptir:

Add(Key, Value)

Örneğin, karma tabloya değeri Now olan bir Time anahtar eklemek için aşağıdaki deyim biçimini kullanın.

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

Ayrıca, var olan bir karma tabloya karma tablo eklemek için ekleme işlecini (+) kullanarak bir karma tabloya anahtar ve değer ekleyebilirsiniz. Örneğin, aşağıdaki deyim değişkenindeki karma tabloya $hash değeri Now olan bir anahtar eklerTime.

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

Değişkenlerde depolanan değerleri de ekleyebilirsiniz.

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

$hash.Add($t, $now)

Karma tablodan anahtar-değer çiftini kaldırmak için çıkarma işleci kullanamazsınız, ancak nesnesinin Hashtable Remove yöntemini kullanabilirsiniz. Remove yöntemi anahtarı değeri olarak alır.

Remove yöntemi aşağıdaki söz dizimine sahiptir:

Remove(Key)

Örneğin, değişken değerindeki Time=Now karma tablodaki anahtar-değer çiftini $hash kaldırmak için şunu yazın:

$hash.Remove("Time")

, , ve dahil olmak üzere CloneContainsClearPowerShell'deki nesnelerin tüm özelliklerini ve CopyToyöntemlerini Hashtable kullanabilirsiniz. Nesneler hakkında Hashtable daha fazla bilgi için bkz System.Collections.Hashtable. .

HashTable'lardaki Nesne Türleri

Karma tablodaki anahtarlar ve değerler herhangi bir .NET nesne türüne sahip olabilir ve tek bir karma tablo birden çok türde anahtara ve değere sahip olabilir.

Aşağıdaki deyim, işlem adı dizelerinden ve işlem nesnesi değerlerinden oluşan bir karma tablo oluşturur ve bunu değişkene $p kaydeder.

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

içinde karma tablo $p görüntüleyebilir ve değerleri görüntülemek için anahtar-ad özelliklerini kullanabilirsiniz.

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

Karma tablodaki anahtarlar herhangi bir .NET türünde olabilir. Aşağıdaki deyim, değişkendeki karma tabloya bir anahtar-değer çifti $p ekler. Anahtar, WinRM hizmetini temsil eden bir Service nesnesidir ve değer hizmetin geçerli durumudur.

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

Karma tablodaki diğer çiftler için kullandığınız yöntemleri kullanarak yeni anahtar-değer çiftini görüntüleyebilir ve bu çiftlere erişebilirsiniz.

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

Karma tablodaki anahtarlar ve değerler de nesneler olabilir Hashtable . Aşağıdaki deyim, anahtarın bir dize olduğu değişkendeki $p karma tabloya anahtar-değer çifti ekler, Karma2 ve değer ise üç anahtar-değer çifti içeren bir karma tablodur.

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

Aynı yöntemleri kullanarak yeni değerleri görüntüleyebilir ve bu değerlere erişebilirsiniz.

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

Anahtarları ve Değerleri Sıralama

Karma tablodaki öğeler sıralı olarak sıralanmamıştır. Anahtar-değer çiftleri her görüntülendiğinde farklı bir sırada görünebilir.

Karma tabloyu sıralayamazsınız ancak anahtarları ve değerleri listelemek için GetEnumerator karma tablo yöntemini kullanabilir ve ardından görüntü için numaralandırılmış değerleri sıralamak için cmdlet'ini kullanabilirsiniz Sort-Object .

Örneğin, aşağıdaki komutlar değişkendeki karma tablosundaki $p anahtarları ve değerleri numaralandırır ve ardından anahtarları alfabetik sırada sıralar.

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

Aşağıdaki komut, karma değerleri azalan düzende sıralamak için aynı yordamı kullanır.

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

Karma tablolardan Nesne Oluşturma

PowerShell 3.0'dan başlayarak, özellikler ve özellik değerlerinin karma tablosundan bir nesne oluşturabilirsiniz.

Söz dizimi şu şekildedir:

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

Bu yöntem yalnızca parametresi olmayan bir oluşturucuya sahip sınıflar için çalışır. Nesne özellikleri ortak ve ayarlanabilir olmalıdır.

Daha fazla bilgi için bkz . about_Object_Creation.

ConvertFrom-StringData

Cmdlet bir ConvertFrom-StringData dizeyi veya anahtar-değer çiftlerinin here-string'ini karma tabloya dönüştürür. Cmdlet'ini ConvertFrom-StringData bir betiğin Veri bölümünde güvenli bir şekilde kullanabilir ve geçerli kullanıcının kullanıcı arabirimi (UI) kültüründe kullanıcı iletilerini görüntülemek için cmdlet'iyle Import-LocalizedData birlikte kullanabilirsiniz.

Karma tablodaki değerler tırnak işaretleri içerdiğinde, özellikle buradaki dizeler yararlıdır. Here-strings hakkında daha fazla bilgi için bkz . about_Quoting_Rules.

Aşağıdaki örnekte, önceki örnekte kullanıcı iletilerinin here-string'inin nasıl oluşturulacağı ve bunların bir dizeden karma tabloya dönüştürülmesi gösterilmektedir ConvertFrom-StringData .

Aşağıdaki komut, anahtar-değer çiftlerinin bir here-string'ini oluşturur ve değişkenine $string kaydeder.

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

Bu komut, buradaki dizeyi ConvertFrom-StringData karma tabloya dönüştürmek için cmdlet'ini kullanır.

ConvertFrom-StringData $string

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

Here-strings hakkında daha fazla bilgi için bkz . about_Quoting_Rules.

Ayrıca bkz.