Hash Tabloları hakkında


Kısa açıklama

PowerShell'de karma tabloların nasıl oluşturulacağını, kullanılacağını ve sıralanacağını açıklar.

Uzun açıklama

Sözlük veya ilişkisel dizi olarak da bilinen karma tablosu, bir veya daha fazla anahtar/değer çiftini saklayan kompakt bir veri yapısıdır. Örneğin, bir karma tablosu bir dizi IP adresi ve bilgisayar adı içerebilir; burada IP adresleri anahtarlardır ve bilgisayar adları değerlerdir veya bunun tersi de geçerlidir.

PowerShell'de her karma tablosu bir Hashtable [System.Collections.Hashtable] nesnesidir. PowerShell'de Hashtable nesnelerinin özelliklerini ve yöntemlerini kullanabilirsiniz.

PowerShell 3,0'dan başlayarak, PowerShell'de bir [System.Collections.Specialized.OrderedDictionary] nesnesi oluşturmak için [ordered] özelliğini kullanabilirsiniz.

Sıralı sözlükler, anahtarların her zaman listelediğiniz sırayla görünmesi açısından karma tablolardan farklıdır. Bir hash tablosundaki anahtarların sırası belirlenmemiştir.

Hashtable'lardaki anahtarlar ve değerler de .NET nesneleridir. Bunlar çoğunlukla dizeler veya tam sayılardır, ancak herhangi bir nesne türüne de sahip olabilirler. Ayrıca, bir anahtarın değerinin başka bir karma tablosu olduğu iç içe karma tablolar da oluşturabilirsiniz.

Hashtable'lar, verileri bulma ve alma konusunda etkili oldukları için sıklıkla kullanılır. Listeleri depolamak ve PowerShell'de hesaplanan özellikler oluşturmak için karma tabloları kullanabilirsiniz. Ayrıca PowerShell'de dizeleri karma tablosuna dönüştüren ConvertFrom-StringData cmdlet'i bulunur.

Sözdizimi

Bir karma tablosunun sözdizimi aşağıdaki gibidir:

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

Sıralı bir sözlüğün sözdizimi aşağıdaki gibidir:

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

[ordered] türü hızlandırıcı PowerShell 3,0'da kullanıma sunuldu.

Hashtable'lar oluşturma

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

  • Hash tablosuna bir at işaretiyle (@) başlayın.
  • Hash tablosunu parantez içine alın ({comcode>).
  • Karma tablonun 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şaretleri içine alınmalıdır. Değerler geçerli PowerShell ifadeleri olmalıdır. Dizeler, boşluk içermeseler bile tırnak işaretleri içinde görünmelidir.
  • Karma tabloyu yönetmek için onu bir değişkene kaydedin.
  • Bir değişkene sıralı bir karma tablosu atarken, [ordered] türünü @ simgesinin önüne yerleştirin. Değişken adının önüne koyarsanız komut başarısız olur.

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

$hash = @{}

Ayrıca bir hash tablosunu oluşturduğunuzda ona anahtarlar ve değerler de ekleyebilirsiniz. Örneğin, aşağıdaki ifade üç anahtara sahip bir hash tablosu oluşturur.

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

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

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

[ordered] özelliği PowerShell 3,0'da kullanıma sunuldu.

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

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

Sıralı sözlükleri hashtable'ları kullandığınız şekilde kullanabilirsiniz. Her iki tür de karma tablo veya sözlük (iDictionary) alan parametrelerin değeri olarak kullanılabilir.

Bir karma tablosunu dönüştürmek veya yayınlamak için [ordered] özelliğini kullanamazsınız. Sıralı özniteliği değişken adının önüne koyarsanız 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] özelliğini taşıyın.

$hash = [ordered]@{}

Sıralı bir sözlüğü karma tablosuna aktarabilirsiniz, ancak değişkeni temizleyip yeni değerler girseniz bile sıralı niteliğ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

Hashtable'lar görüntüleniyor

Bir değişkene kaydedilen karma tablosunu görüntülemek için değişkenin adını yazın. Varsayılan olarak hashtable'lar, 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

Hashtable'ların Anahtarlar ve Değerler özellikleri vardır. Tüm tuşları 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 hash tablosunun bir özelliğidir ve değeri, anahtar adı özelliğinin değeridir. Özellik değerlerini görüntülemek için aşağıdaki formatı kullanın.

$hashtable.<key>
<value>

Örneğin:

$hash.Number
1

$hash.Color
Blue

Hashtable'lar, hashtable'daki anahtar/değer çiftlerinin sayısını belirten bir Count özelliğine sahiptir.

$hash.count
3

Hashtable tabloları dizi değildir, dolayısıyla hashtable'da indeks olarak bir tamsayı kullanamazsınız, ancak hashtable'da indekslemek için bir anahtar adı kullanabilirsiniz. Anahtar bir dize değeriyse, anahtar adını tırnak işaretleri içine alın.

Örneğin:

$hash["Number"]
1

Özellik adı çakışmalarını yönetme

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

$hashtable.psbase.Keys

Bu, System.Collections.IDictionary arayüzünü uygulayan OrderedDictionary gibi diğer türler için geçerlidir.

Anahtarlar ve değerler üzerinde yineleme

Değerleri çeşitli şekillerde işlemek için bir karma tablosundaki anahtarlar üzerinde yineleme yapabilirsiniz. Bu bölümdeki örneklerin her biri aynı çıktıya sahiptir. Burada tanımlanan $hash değişkeni üzerinde yinelenirler:

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

Not

Bu örneklerde $hash, çıktının her zaman aynı sırada olmasını sağlamak için sıralı bir sözlük olarak tanımlanır. Bu örnekler normal hashtable'lar için aynı şekilde çalışır ancak çıktının sırası tahmin edilemez.

Her örnek, her anahtar ve değeri için bir mesaj 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 örnekte, anahtarlar üzerinde yineleme yapmak için ForEach-Object kullanılır.

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

Bu örnek, her bir anahtar/değer çiftini ardışık düzen üzerinden ForEach-Object'e göndermek için GetEnumerator yöntemini kullanır.

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

Bu örnek, her bir anahtar/değer çifti üzerinde yineleme yapmak için GetEnumerator ve ForEach yöntemlerini kullanır.

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

Anahtarları ve Değerleri Ekleme ve Kaldırma

Bir karma tablosuna anahtarlar ve değerler eklemek için aşağıdaki komut biçimini kullanın.

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

Örneğin, karma tablosuna "Şimdi" değerine sahip bir "Zaman" anahtarı eklemek için aşağıdaki ifade biçimini kullanın.

$hash["Time"] = "Now"

Ayrıca, System.Collections.Hashtable nesnesinin Add yöntemini kullanarak da bir karma tablosuna anahtarlar ve değerler ekleyebilirsiniz. Add yöntemi aşağıdaki sözdizimine sahiptir:

Add(Key, Value)

Örneğin, hash tablosuna Now değerine sahip bir Time anahtarı eklemek için aşağıdaki ifade biçimini kullanın.

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

Ayrıca, mevcut bir karma tablosuna bir karma tablosu eklemek için toplama operatörünü (+) kullanarak bir karma tablosuna anahtarlar ve değerler ekleyebilirsiniz. Örneğin, aşağıdaki ifade, $hash değişkenindeki hash tablosuna Now değerine sahip bir Time anahtarı ekler.

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

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

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

$hash.Add($t, $now)

Bir karma tablosundan anahtar/değer çiftini kaldırmak için çıkarma işleci kullanamazsınız ancak Hashtable nesnesinin Remove yöntemini kullanabilirsiniz. Remove yöntemi anahtarı değer olarak alır.

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

Remove(Key)

Örneğin, $hash değişkeninin değerindeki hash tablosundan Time=Now anahtar/değer çiftini kaldırmak için şunu yazın:

$hash.Remove("Time")

Contains, Clear, Clone ve CopyTo dahil olmak üzere PowerShell'deki Hashtable nesnelerinin tüm özelliklerini ve yöntemlerini kullanabilirsiniz. kodu >. Hashtable nesneleri hakkında daha fazla bilgi için bkz. System.Collections.Hashtable.

HashTable'lardaki Nesne Türleri

Bir karma tablosundaki anahtarlar ve değerler herhangi bir .NET nesne türüne sahip olabilir ve tek bir karma tablosu birden çok türde anahtarlara ve değerlere sahip olabilir.

Aşağıdaki ifade, süreç adı dizelerinden ve süreç nesnesi değerlerinden oluşan bir karma tablosu oluşturur ve bunu $p değişkenine kaydeder.

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

Hash tablosunu $p olarak 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

Hashtable'daki anahtarlar herhangi bir .NET türünde olabilir. Aşağıdaki ifade, $p değişkenindeki hash tablosuna bir anahtar/değer çifti ekler. Anahtar, WinRM hizmetini temsil eden bir Hizmet nesnesidir ve değer, hizmetin geçerli durumudur.

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

Hash tablosundaki diğer çiftler için kullandığınız yöntemlerin aynısını kullanarak yeni anahtar/değer çiftini görüntüleyebilir ve ona 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

Bir karma tablosundaki anahtarlar ve değerler aynı zamanda Hashtable nesneleri de olabilir. Aşağıdaki ifade, anahtarın bir dize (Hash2) olduğu ve değerin üç anahtar/değer çiftine sahip bir karma tablosu olduğu $p değişkenindeki karma tablosuna anahtar/değer çiftini ekler.

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

Aynı yöntemleri kullanarak yeni değerleri görüntüleyebilir ve bunlara 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

Hashtable'daki öğeler doğası gereği sırasızdır. Anahtar/değer çiftleri, onları her görüntülediğinizde farklı bir sırada görünebilir.

Bir karma tablosunu sıralayamasanız da, anahtarları ve değerleri numaralandırmak için karma tabloların GetEnumerator yöntemini kullanabilir ve ardından numaralandırılmış değerleri görüntülenmek üzere sıralamak için Sort-Object cmdlet'ini kullanabilirsiniz.

Örneğin, aşağıdaki komutlar karma tablosundaki anahtarları ve değerleri $p değişkeninde numaralandırır ve ardından anahtarları alfabetik sıraya göre 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ğerlerini azalan düzende sıralamak için aynı prosedürü 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

Hashtable'lardan Nesneler Oluşturma

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

Sözdizimi aşağıdaki gibidir:

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

Bu yöntem yalnızca parametresi olmayan bir yapıcıya sahip sınıflar için çalışır. Nesne özellikleri genel ve ayarlanabilir olmalıdır.

Daha fazla bilgi için bkz. about_Object_Creation.

ConvertFrom-StringData

ConvertFrom-StringData cmdlet'i, bir dizeyi veya anahtar/değer çiftlerinden oluşan buradaki dizeyi bir karma tablosuna dönüştürür. ConvertFrom-StringData cmdlet'ini bir betiğin Veri bölümünde güvenle kullanabilirsiniz ve kullanıcı mesajlarını kullanıcı mesajlarını görüntülemek için Import-LocalizedData cmdlet'iyle birlikte kullanabilirsiniz. geçerli kullanıcının arayüz (UI) kültürü.

Burada-dizeleri, hash tablosundaki değerler tırnak işaretleri içerdiğinde özellikle kullanışlıdır. Buradaki dizeler hakkında daha fazla bilgi için bkz. about_Quoting_Rules.

Aşağıdaki örnek, önceki örnekteki kullanıcı mesajlarının bir burada-dizgesinin nasıl oluşturulacağını ve bunları bir dizeden karma tablosuna dönüştürmek için ConvertFrom-StringData'nın nasıl kullanılacağını gösterir.

Aşağıdaki komut, anahtar/değer çiftlerinden oluşan bir burada dizesi oluşturur ve ardından bunu $string değişkenine kaydeder.

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

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

ConvertFrom-StringData $string

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

Buradaki dizeler hakkında daha fazla bilgi için bkz. about_Quoting_Rules.

Ayrıca bakınız

  • about_Arrays
  • about_Intrinsic_Members
  • about_Object_Creation
  • about_Quoting_Rules
  • about_Script_Uluslararasılaştırma
  • Import-LocalizedData
  • ConvertFrom-StringData
  • System.Collections.Hashtable

İlgili makaleler