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-StringData
vardı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 psbase iç ü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-Object
GetEnumerator 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 Clone
Contains
Clear
PowerShell'deki nesnelerin tüm özelliklerini ve CopyTo
yö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.
PowerShell