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.