about_Hash_Tables
Deskripsi singkat
Menjelaskan cara membuat, menggunakan, dan mengurutkan hashtable di PowerShell.
Deskripsi panjang
hashtable, juga dikenal sebagai kamus atau array asosiatif, adalah struktur data ringkas yang menyimpan satu atau beberapa pasangan kunci-nilai. Misalnya, tabel hash mungkin berisi serangkaian alamat IP dan nama komputer, di mana alamat IP adalah kunci dan nama komputer adalah nilainya, atau sebaliknya.
Di PowerShell, masing-masing hashtable adalah [System.Collections.Hashtable]
objek. Anda dapat menggunakan properti dan metode Hashtable objek di PowerShell.
Dimulai di PowerShell 3.0, Anda bisa menggunakan [ordered]
akselerator jenis untuk membuat [System.Collections.Specialized.OrderedDictionary]
objek di PowerShell.
Kamus yang diurutkan berbeda dari hashtable karena kunci selalu muncul dalam urutan Anda mencantumkannya. Urutan kunci dalam hashtable tidak deterministik.
Kunci dan nilai dalam hashtable juga merupakan objek .NET. String atau bilangan bulat paling sering, tetapi dapat memiliki jenis objek apa pun. Anda juga dapat membuat hashtable berlapis, di mana nilai kunci adalah yang lain hashtable.
Hashtable sering digunakan karena efisien untuk menemukan dan mengambil data. Anda dapat menggunakan hashtable untuk menyimpan daftar dan membuat properti terhitung di PowerShell. Dan, ConvertFrom-StringData
cmdlet mengonversi data string terstruktur menjadi hashtable.
Sintaks
Sintaksnya hashtable adalah sebagai berikut:
@{ <name> = <value>; [<name> = <value> ] ...}
Sintaks kamus yang diurutkan adalah sebagai berikut:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
Akselerator [ordered]
jenis diperkenalkan di PowerShell 3.0.
Untuk membuat hashtable, ikuti panduan berikut:
- hashtable Mulai dengan tanda (
@
). - Sertakan hashtable dalam kurung kurawal (
{}
). - Masukkan satu atau beberapa pasangan kunci-nilai untuk konten hashtable.
- Gunakan tanda sama dengan (
=
) untuk memisahkan setiap kunci dari nilainya. - Gunakan titik koma (
;
) atau hentian baris untuk memisahkan pasangan kunci-nilai. - Kunci yang berisi spasi harus diapit dalam tanda kutip. Nilai harus berupa ekspresi PowerShell yang valid. String harus muncul dalam tanda kutip, meskipun tidak menyertakan spasi.
- Untuk mengelola hashtable, simpan dalam variabel.
- Saat menetapkan yang diurutkan hashtable ke variabel, tempatkan
[ordered]
jenis sebelum@
simbol. Jika Anda menempatkannya sebelum nama variabel, perintah gagal.
Anda dapat menggunakan kamus yang diurutkan dengan cara yang sama seperti Anda menggunakan hashtable. Salah satu jenis dapat digunakan sebagai nilai parameter yang mengambil hashtable objek jenis atau kamus (iDictionary).
Membuat hashtable dan kamus yang diurutkan
Pertimbangkan contoh kamus berikut hashtable dan yang diurutkan:
$hash = @{
1 = 'one'
2 = 'two'
'three' = 3
}
$hash
Name Value
---- -----
three 3
2 two
1 one
Seperti yang Anda lihat, pasangan kunci-nilai dalam hashtable tidak disajikan dalam urutan yang ditentukan.
Cara termampu untuk membuat kamus yang diurutkan adalah dengan menggunakan [ordered]
atribut . Tempatkan atribut segera sebelum @
simbol.
$dictionary = [ordered]@{
1 = 'one'
2 = 'two'
'three' = 3
}
$dictionary
Name Value
---- -----
1 one
2 two
three 3
Tidak seperti hashtable, kamus yang diurutkan mempertahankan urutan nilai kunci.
Mengonversi hashtable dan kamus yang diurutkan
Anda tidak dapat menggunakan [ordered]
jenis akselerator untuk mengonversi atau mentransmisikan hashtable.
Jika Anda menempatkan atribut yang diurutkan sebelum nama variabel, perintah gagal dengan pesan kesalahan berikut.
[ordered]$orderedhash = @{}
ParserError:
Line |
1 | [ordered]$orderedhash = @{}
| ~~~~~~~~~~~~~~
| The ordered attribute can be specified only on a hash literal node.
Untuk memperbaiki ekspresi, pindahkan atribut [diurutkan].
$orderedhash = [ordered]@{}
Anda dapat melemparkan kamus yang diurutkan ke hashtable, tetapi Anda tidak dapat menjamin urutan anggota.
[hashtable]$newhash = [ordered]@{
Number = 1
Shape = "Square"
Color = "Blue"
}
$newhash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Hashtable dan properti kamus
Hashtable dan kamus yang dipesan berbagi beberapa properti. $hash
Pertimbangkan variabel dan $dictionary
yang ditentukan dalam contoh sebelumnya.
$hash | Get-Member -MemberType Properties, ParameterizedProperty
TypeName: System.Collections.Hashtable
Name MemberType Definition
---- ---------- ----------
Item ParameterizedProperty System.Object Item(System.Object key) {get;set;}
Count Property int Count {get;}
IsFixedSize Property bool IsFixedSize {get;}
IsReadOnly Property bool IsReadOnly {get;}
IsSynchronized Property bool IsSynchronized {get;}
Keys Property System.Collections.ICollection Keys {get;}
SyncRoot Property System.Object SyncRoot {get;}
Values Property System.Collections.ICollection Values {get;}
$dictionary | Get-Member -MemberType Properties, ParameterizedProperty
TypeName: System.Collections.Specialized.OrderedDictionary
Name MemberType Definition
---- ---------- ----------
Item ParameterizedProperty System.Object Item(int index) {get;set;},
System.Object Item(System.Object key) {get;set;}
Count Property int Count {get;}
IsFixedSize Property bool IsFixedSize {get;}
IsReadOnly Property bool IsReadOnly {get;}
IsSynchronized Property bool IsSynchronized {get;}
Keys Property System.Collections.ICollection Keys {get;}
SyncRoot Property System.Object SyncRoot {get;}
Values Property System.Collections.ICollection Values {get;}
Properti yang paling banyak digunakan adalah Hitungan, Kunci, Nilai, dan Item.
Properti Hitung yang menunjukkan jumlah pasangan kunci-nilai dalam objek.
Properti Kunci adalah kumpulan nama kunci dalam hashtable kamus atau .
PS> $hash.Keys three 2 1 PS> $dictionary.Keys 1 2 three
Properti Nilai adalah kumpulan nilai dalam hashtable kamus atau .
PS> $hash.Values 3 two one PS> $dictionary.Values one two 3
Properti Item adalah properti berparameter yang mengembalikan nilai item yang Anda tentukan. Hashtable menggunakan kunci sebagai parameter ke properti berparameter, sementara kamus menggunakan indeks secara default. Perbedaan ini memengaruhi cara Anda mengakses nilai untuk setiap jenis.
Mengakses nilai
Ada dua cara umum untuk mengakses nilai dalam hashtable kamus atau : notasi anggota atau notasi indeks array.
Notasi anggota - Nilai dapat diakses dengan menggunakan nama kunci sebagai properti anggota objek. Contohnya:
PS> $hash.1 one PS> $dictionary.2 two
Notasi indeks array - Nilai dapat diakses dengan menggunakan notasi indeks. PowerShell mengonversi notasi tersebut menjadi properti parameter item dari objek.
Saat Anda menggunakan notasi indeks dengan hashtable, nilai di dalam tanda kurung adalah nama kunci. Jika kunci adalah nilai string, sertakan nama kunci dalam tanda kutip. Contohnya:
PS> $hash['three'] 3 PS> $hash[2] 2
Dalam contoh ini, nilai
2
kunci bukan indeks ke dalam kumpulan nilai. Ini adalah nilai kunci dalam pasangan kunci-nilai. Anda dapat membuktikannya dengan mengindeks ke dalam kumpulan nilai.PS> ([array]$hash.Values)[2] one
Saat Anda menggunakan notasi indeks dengan kamus, nilai di dalam tanda kurung ditafsirkan berdasarkan jenisnya. Jika nilainya adalah bilangan bulat, nilai tersebut diperlakukan sebagai indeks ke dalam kumpulan nilai. Jika nilainya bukan bilangan bulat, nilai tersebut diperlakukan sebagai nama kunci. Contohnya:
PS> $dictionary[1] two PS> ([array]$dictionary.Values)[1] two PS> $dictionary[[object]1] one PS> $dictionary['three'] 3
Dalam contoh ini, nilai
[1]
array adalah indeks ke dalam kumpulan nilai menggunakanItem(int index)
kelebihan beban properti berparameter. Nilai array[[object]1]
bukan indeks tetapi nilai kunci menggunakanItem(System.Object key)
kelebihan beban.Catatan
Perilaku ini dapat membingungkan ketika nilai kunci adalah bilangan bulat. Jika memungkinkan, Anda harus menghindari penggunaan nilai kunci bilangan bulat dalam kamus.
Menangani tabrakan nama properti
Jika nama kunci bertabrakan dengan salah satu nama properti jenis tersebutHashTable, Anda dapat menggunakan anggota intrinsik psbase untuk mengakses properti tersebut. Misalnya, jika nama kunci adalah keys
dan Anda ingin mengembalikan koleksi HashTable kunci, gunakan sintaks ini:
$hashtable.psbase.Keys
Persyaratan ini berlaku untuk jenis lain yang mengimplementasikan System.Collections.IDictionary antarmuka, seperti OrderedDictionary.
Iterasi atas kunci dan nilai
Anda dapat melakukan iterasi pada kunci dalam hashtable untuk memproses nilai dalam beberapa cara. Masing-masing contoh di bagian ini memiliki output yang identik. Mereka melakukan iterasi atas variabel yang $hash
ditentukan di sini:
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Catatan
Dalam contoh ini, $hash
didefinisikan sebagai kamus yang diurutkan untuk memastikan output selalu dalam urutan yang sama. Contoh-contoh ini berfungsi sama untuk hashtable standar, tetapi urutan output tidak dapat diprediksi.
Setiap contoh mengembalikan pesan untuk setiap kunci dan nilainya:
The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue
Contoh ini menggunakan foreach
blok untuk melakukan iterasi pada kunci.
foreach ($Key in $hash.Keys) {
"The value of '$Key' is: $($hash[$Key])"
}
Contoh ini digunakan ForEach-Object
untuk melakukan iterasi pada kunci.
$hash.Keys | ForEach-Object {
"The value of '$_' is: $($hash[$_])"
}
Contoh ini menggunakan GetEnumerator()
metode untuk mengirim setiap pasangan kunci-nilai melalui alur ke ForEach-Object
.
$hash.GetEnumerator() | ForEach-Object {
"The value of '$($_.Key)' is: $($_.Value)"
}
Contoh ini menggunakan GetEnumerator()
metode dan ForEach()
untuk melakukan iterasi pada setiap pasangan kunci-nilai.
$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})
Menambahkan dan Menghapus Kunci dan Nilai
Biasanya, saat Anda membuat hashtable , Anda menyertakan pasangan kunci-nilai dalam definisi. Namun, Anda dapat menambahkan dan menghapus pasangan kunci-nilai dari hashtable kapan saja. Contoh berikut membuat kosong hashtable.
$hash = @{}
Anda dapat menambahkan pasangan kunci-nilai menggunakan notasi array. Misalnya, contoh berikut menambahkan Time
kunci dengan nilai Now
ke hashtable.
$hash["Time"] = "Now"
Anda juga dapat menambahkan kunci dan nilai ke hashtable menggunakan Add()
metode System.Collections.Hashtable objek. Metode Add()
ini memiliki sintaks berikut:
Add(Key, Value)
Misalnya, untuk menambahkan Time
kunci dengan nilai Now
ke hashtable, gunakan format pernyataan berikut.
$hash.Add("Time", "Now")
Dan, Anda dapat menambahkan kunci dan nilai ke hashtable menggunakan operator penambahan hashtable (+
) untuk menambahkan ke hashtable. Misalnya, pernyataan berikut menambahkan Time
kunci dengan nilai Now
ke hashtable dalam $hash
variabel.
$hash = $hash + @{Time="Now"}
Anda juga dapat menambahkan nilai yang disimpan dalam variabel.
$t = "Today"
$now = (Get-Date)
$hash.Add($t, $now)
Anda tidak dapat menggunakan operator pengurangan untuk menghapus pasangan kunci-nilai dari tabel hash, tetapi Anda dapat menggunakan Remove()
metode hashtable objek. Metode Remove
ini memiliki sintaks berikut:
$object.Remove(<key>)
Contoh berikut menghapus Time
pasangan kunci-nilai dari $hash
.
$hash.Remove("Time")
Tipe Objek dalam HashTables
Kunci dan nilai dalam hashtable dapat memiliki jenis objek .NET apa pun, dan satu hashtable dapat memiliki kunci dan nilai dari beberapa jenis.
Pernyataan berikut membuat hashtable string nama proses dan memproses nilai objek dan menyimpannya dalam $p
variabel.
$p = @{
"PowerShell" = (Get-Process PowerShell)
"Notepad" = (Get-Process notepad)
}
Anda dapat menampilkan di hashtable $p
dan menggunakan properti nama kunci untuk menampilkan nilai.
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
Kunci dalam hashtable bisa berupa jenis .NET apa pun. Pernyataan berikut menambahkan pasangan kunci-nilai ke hashtable dalam $p
variabel. Kuncinya adalah objek Layanan yang mewakili layanan WinRM, dan nilainya adalah status layanan saat ini.
$p = $p + @{
(Get-Service WinRM) = ((Get-Service WinRM).Status)
}
Anda dapat menampilkan dan mengakses pasangan kunci-nilai baru menggunakan metode yang sama dengan yang Anda gunakan untuk pasangan lain di hashtable.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
PS> $p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
PS> $p.keys | ForEach-Object {$_.name}
WinRM
Kunci dan nilai dalam hashtable juga dapat menjadi Hashtable objek. Pernyataan berikut menambahkan pasangan kunci-nilai ke hashtable dalam variabel di $p
mana kunci adalah string, Hash2, dan nilainya adalah hashtable dengan tiga pasangan kunci-nilai.
$p = $p + @{
"Hash2"= @{a=1; b=2; c=3}
}
Anda dapat menampilkan dan mengakses nilai baru menggunakan metode yang sama.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
Hash2 {c, b, a}
PS> $p.Hash2
Name Value
---- -----
c 3
b 2
a 1
PS> $p.Hash2.b
2
Mengurutkan Kunci dan Nilai
Item dalam hashtable secara intrinsik tidak diurutkan. Pasangan kunci-nilai mungkin muncul dalam urutan yang berbeda setiap kali Anda menampilkannya.
Meskipun Anda tidak dapat mengurutkan hashtable, Anda dapat menggunakan GetEnumerator()
metode hashtable untuk menghitung kunci dan nilai, lalu menggunakan Sort-Object
cmdlet untuk mengurutkan nilai enumerasi untuk ditampilkan.
Misalnya, perintah berikut menghitung kunci dan nilai dalam tabel hash dalam $p
variabel lalu mengurutkan kunci dalam urutan alfabet.
PS> $p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Hash2 {c, b, a}
Notepad System.Diagnostics.Process (Notepad)
PowerShell System.Diagnostics.Process (powershell)
WinRM Running
Perintah berikut menggunakan prosedur yang sama untuk mengurutkan nilai hash dalam urutan turun.
PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
Hash2 {c, b, a}
WinRM Running
Membuat Objek dari hashtable
Dimulai di PowerShell 3.0, Anda bisa membuat objek dari hashtable properti dan nilai properti.
Sintaksisnya adalah sebagai berikut:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Metode ini hanya berfungsi untuk kelas yang memiliki konstruktor yang tidak memiliki parameter. Properti objek harus publik dan dapat diatur.
Untuk informasi selengkapnya, lihat about_Object_Creation.
ConvertFrom-StringData
ConvertFrom-StringData
Cmdlet mengonversi string atau string pasangan kunci-nilai di sini menjadi hashtable. Anda dapat menggunakan ConvertFrom-StringData
cmdlet dengan aman di bagian Data dari skrip, dan Anda dapat menggunakannya dengan Import-LocalizedData
cmdlet untuk menampilkan pesan pengguna dalam budaya antarmuka pengguna (UI) pengguna saat ini.
String berikut sangat berguna ketika nilai dalam hashtable tanda kutip sertakan. Untuk informasi selengkapnya tentang here-string, lihat about_Quoting_Rules.
Contoh berikut menunjukkan cara membuat string di sini dari pesan pengguna dalam contoh sebelumnya dan cara menggunakannya ConvertFrom-StringData
untuk mengonversinya dari string menjadi hashtable.
Perintah berikut membuat string di sini dari pasangan kunci-nilai lalu menyimpannya dalam $string
variabel.
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
Perintah ini menggunakan ConvertFrom-StringData
cmdlet untuk mengonversi here-string menjadi hashtable.
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
Untuk informasi selengkapnya tentang here-string, lihat about_Quoting_Rules.