about_Hash_Tables
Deskripsi singkat
Menjelaskan cara membuat, menggunakan, dan mengurutkan hashtable di PowerShell.
Deskripsi panjang
Hashtable, juga dikenal sebagai array kamus atau 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, setiap hashtable adalah Hashtable[System.Collections.Hashtable]
objek. Anda dapat menggunakan properti dan metode Hashtable objek di PowerShell.
Dimulai di PowerShell 3.0, Anda bisa menggunakan [ordered]
atribut 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 ditentukan.
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 hashtable lain.
Hashtables sering digunakan karena efisien untuk menemukan dan mengambil data. Anda dapat menggunakan hashtable untuk menyimpan daftar dan membuat properti terhitung di PowerShell. Dan, PowerShell memiliki cmdlet, ConvertFrom-StringData
, yang mengonversi string menjadi hashtable.
Sintaks
Sintaks 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.
Membuat hashtable
Untuk membuat hashtable, ikuti panduan berikut:
- Mulai hashtable 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 hashtable yang diurutkan ke variabel, tempatkan
[ordered]
jenis sebelum@
simbol. Jika Anda menempatkannya sebelum nama variabel, perintah gagal.
Untuk membuat hashtable kosong dalam nilai $hash, ketik:
$hash = @{}
Anda juga dapat menambahkan kunci dan nilai ke hashtable saat membuatnya. Misalnya, pernyataan berikut membuat hashtable dengan tiga kunci.
$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
Membuat kamus yang diurutkan
Anda dapat membuat kamus yang diurutkan dengan menambahkan objek jenis OrderedDictionary , tetapi cara termampu untuk membuat kamus yang diurutkan adalah menggunakan [ordered]
atribut .
Atribut [ordered]
diperkenalkan di PowerShell 3.0.
Tempatkan atribut segera sebelum simbol "@".
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
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 atau kamus (iDictionary).
Anda tidak dapat menggunakan [ordered]
atribut untuk mengonversi atau mentransmisikan hashtable. Jika Anda menempatkan atribut yang diurutkan sebelum nama variabel, perintah gagal dengan pesan kesalahan berikut.
[ordered]$hash = @{}
ParserError:
Line |
1 | [ordered]$hash = @{}
| ~~~~~~~~~~~~~~
| The ordered attribute can be specified only on a hash literal node.
Untuk memperbaiki ekspresi, pindahkan atribut [diurutkan].
$hash = [ordered]@{}
Anda dapat mentransmisikan kamus yang diurutkan ke hashtable, tetapi Anda tidak dapat memulihkan atribut yang diurutkan, bahkan jika Anda menghapus variabel dan memasukkan nilai baru. Untuk membuat ulang pesanan, Anda harus menghapus dan membuat ulang variabel.
[hashtable]$hash = [ordered]@{
Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Menampilkan hashtable
Untuk menampilkan hashtable yang disimpan dalam variabel, ketik nama variabel. Secara default, hashtable ditampilkan sebagai tabel dengan satu kolom untuk kunci dan satu untuk nilai.
$hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
hashtable memiliki properti Kunci dan Nilai . Gunakan notasi titik untuk menampilkan semua kunci atau semua nilai.
$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue
Setiap nama kunci juga merupakan properti dari hashtable, dan nilainya adalah nilai properti nama kunci. Gunakan format berikut untuk menampilkan nilai properti.
$hashtable.<key>
<value>
Contohnya:
$hash.Number
1
$hash.Color
Blue
hashtable memiliki properti Count yang menunjukkan jumlah pasangan kunci-nilai dalam hashtable.
$hash.count
3
tabel hashtable bukan array, sehingga Anda tidak dapat menggunakan bilangan bulat sebagai indeks ke dalam hashtable, tetapi Anda dapat menggunakan nama kunci untuk mengindeks ke dalam hashtable. Jika kunci adalah nilai string, sertakan nama kunci dalam tanda kutip.
Contohnya:
$hash["Number"]
1
Menangani tabrakan nama properti
Jika nama kunci bertabrakan dengan salah satu nama properti dari jenis HashTable, Anda dapat menggunakan anggota intrinsik psbase untuk mengakses properti tersebut. Misalnya, jika nama kunci adalah keys
dan Anda ingin mengembalikan koleksi kunci HashTable , gunakan sintaks ini:
$hashtable.psbase.Keys
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 normal, 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 blok foreach 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 metode GetEnumerator untuk mengirim setiap pasangan kunci-nilai melalui alur ke ForEach-Object
.
$hash.GetEnumerator() | ForEach-Object {
"The value of '$($_.Key)' is: $($_.Value)"
}
Contoh ini menggunakan metode GetEnumerator 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
Untuk menambahkan kunci dan nilai ke hashtable, gunakan format perintah berikut.
$hash["<key>"] = "<value>"
Misalnya, untuk menambahkan kunci "Waktu" dengan nilai "Sekarang" ke hashtable, gunakan format pernyataan berikut.
$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 tambahan (+
) untuk menambahkan hashtable ke hashtable yang ada. 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 metode Hashtable Hapus objek. Metode Hapus mengambil kunci sebagai nilainya.
Metode Remove
ini memiliki sintaks berikut:
Remove(Key)
Misalnya, untuk menghapus Time=Now
pasangan kunci-nilai dari hashtable dalam nilai $hash
variabel, ketik:
$hash.Remove("Time")
Anda dapat menggunakan semua properti dan metode Hashtable objek di PowerShell, termasuk Contains
, , Clear
Clone
, dan CopyTo
. Untuk informasi selengkapnya tentang Hashtable objek, lihat System.Collections.Hashtable.
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 hashtable di $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 dapat 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 dalam hashtable.
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
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 (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
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 metode hashtable GetEnumerator untuk menghitung kunci dan nilai, lalu menggunakan Sort-Object
cmdlet untuk mengurutkan nilai enumerasi untuk tampilan.
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 {[a, 1], [b, 2], [c, 3]}
Notepad System.Diagnostics.Process (Notepad)
PowerShell System.Diagnostics.Process (pwsh)
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 (pwsh)
Notepad System.Diagnostics.Process (Notepad)
Hash2 {[a, 1], [b, 2], [c, 3]}
WinRM Running
Membuat Objek dari hashtable
Dimulai di PowerShell 3.0, Anda dapat 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 di sini sangat berguna ketika nilai dalam hashtable menyertakan tanda kutip. 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.