Karma 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şkilendirilebilir dizi olarak da bilinen karma tablo, bir veya daha fazla anahtar/değer çifti depolayan sıkıştırılmış bir veri yapısıdır. Örneğin, karma tablo ip adresleri ve bilgisayar adları bir dizi içerebilir, burada IP adresleri anahtarlar ve bilgisayar adları değerlerdir veya tam tersi.

PowerShell'de her karma tablo bir Hashtable (System.Collections.Hashtable) nesnesidir. PowerShell'de Hashtable nesnelerinin özelliklerini ve yöntemlerini kullanabilirsiniz.

PowerShell 3.0'da başlayarak, PowerShell'de sıralı sözlük (System.Collections.Specialized.OrderedDictionary) oluşturmak için [ordered] özniteliğini kullanabilirsiniz.

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ı belirlenmedi.

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 karma tabloları da oluşturabilirsiniz.

Karma tablolar, verileri bulmak ve almak için çok verimli olduklarından sıklıkla kullanılır. PowerShell'de listeleri depolamak ve hesaplanmış özellikler oluşturmak için karma tabloları kullanabilirsiniz. PowerShell'de dizeleri karma tablosuna dönüştüren ConvertFrom-StringData cmdlet'i vardır.

Syntax

Karma tablosunun 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> ] ...}

[ordered] özniteliği PowerShell 3.0'da tanıtıldı.

Karma Tablolar Oluşturma

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

  • Karma tabloya at işaretiyle (@) başlayın.
  • Karma tabloyu ayraç ({} ) içine alın.
  • Karma tablosunun 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.
  • Noktalı virgül kullanma (;) veya anahtar/değer çiftlerini ayırmak için bir satır sonu.
  • Boşluk içeren anahtar 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.
  • Karma tabloyu yönetmek için bir değişkene kaydedin.
  • Bir değişkene sıralı karma tablosu atarken [ordered] özniteliğini "@" simgesinin önüne yerleştirin. 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 = @{}

Karma tablo oluştururken anahtarlar ve değerler de ekleyebilirsiniz. Örneğin, aşağıdaki deyim üç anahtar içeren bir karma tablo oluşturur.

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

Sıralı Sözlükler Oluşturma

Sıralı Sözlük türünde bir nesne ekleyerek sıralı sözlük oluşturabilirsiniz, ancak sıralı sözlük oluşturmanın en kolay yolu [Ordered] özniteliğini 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.

Karma tabloyu dönüştürmek veya dönüştürmek için [ordered] özniteliğini 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.

PS C:\> [ordered]$hash = @{}
At line:1 char:1
+ [ordered]$hash = @{}
+ [!INCLUDE[]()]
The ordered attribute can be specified only on a hash literal node.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordExc
eption
+ FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode

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

PS C:\> $hash = [ordered]@{}

Sıralı sözlüğü 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.

PS C:\> [hashtable]$hash = [ordered]@{
>> Number = 1; Shape = "Square"; Color = "Blue"}
PS C:\> $hash

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

Karma Tabloları Görüntüleme

Bir değişkene kaydedilen karma tabloyu 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.

C:\PS> $hash

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

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

C:\PS> $hash.keys
Number
Shape
Color

C:\PS> $hash.values
1
Square
Blue

Her anahtar adı aynı zamanda karma 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 biçimi kullanın.

$hashtable.<key>
<value>

Örnek:

C:\PS> $hash.Number
1

C:\PS> $hash.Color
Blue

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

$hashtable.PSBase.Keys

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

C:\PS> $hash.count
3

Karma tablo tabloları dizi 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.

Örnek:

C:\PS> $hash["Number"]
1

Anahtarlar ve Değerler Ekleme ve Kaldırma

Karma tabloya anahtarlar ve değerler 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"

System.Collections.Hashtable nesnesinin Add yöntemini kullanarak karma tablosuna anahtarlar ve değerler de ekleyebilirsiniz. Add yöntemi aşağıdaki söz dizimine sahiptir:

Add(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.Add("Time", "Now")

Ayrıca, var olan karma tablosuna karma tablosu eklemek için toplama işlecini (+) kullanarak karma tablosuna anahtarlar ve değerler ekleyebilirsiniz. Örneğin, aşağıdaki deyim $hash değişkenindeki karma tablosuna "Now" değerine sahip bir "Time" anahtarı ekler.

$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 Hashtable nesnesinin Remove yöntemini kullanabilirsiniz. Remove yöntemi anahtarı değeri olarak alır.

Remove yönteminde aşağıdaki söz dizimi bulunur:

Remove(Key)

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

$hash.Remove("Time")

PowerShell'de Contains, Clear, Clone ve CopyTo gibi Karma Tablo nesnelerinin tüm özelliklerini ve yöntemlerini kullanabilirsiniz. Hashtable nesneleri hakkında 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 tabloda birden çok türde anahtar ve değer bulunabilir.

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)}

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

C:\PS> $p

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

C:\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

C:\PS> $p.keys | foreach {$p.$_.handles}
441
251

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

C:\PS> $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 çifte erişebilirsiniz.

C:\PS> $p

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

C:\PS> $p.keys
PowerShell
Notepad

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

C:\PS> $p.keys | foreach {$_.name}
winrm

Karma tablodaki anahtarlar ve değerler de Hashtable nesneleri olabilir. Aşağıdaki deyim anahtarın 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.

C:\PS> $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.

C:\PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
Hash2                          {a, b, c}

C:\PS> $p.Hash2

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

C:\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ıralayamasanız da, anahtarları ve değerleri listelemek için Karma tabloların GetEnumerator yöntemini kullanabilir ve ardından görüntülenecek numaralandırılmış değerleri sıralamak için Sort-Object cmdlet'ini kullanabilirsiniz.

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

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

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

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

C:\PS> $p.getenumerator() | Sort-Object -Property Value -Descending

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

Karma Tablolardan Nesne Oluşturma

PowerShell 3.0'dan başlayarak, özelliklerin 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 null oluşturucu, yani parametresi olmayan bir oluşturucuya 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

cmdlet'i ConvertFrom-StringData bir 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üvenle 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.

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

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

Aşağıdaki komut anahtar/değer çiftlerinin here-dizesini oluşturur ve $string değişkenine kaydeder.

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

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

C:\PS> 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.

about_Arrays

about_Object_Creation

about_Quoting_Rules

about_Script_Internationalization

ConvertFrom-StringData

Import-LocalizedData

Hashtable