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 psbaseuntuk 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, , ClearClone, 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 pwsh)
    "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 (pwsh)
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}
774
824

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 (pwsh)
WinRM                          Running
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.keys
PowerShell

Status   Name               DisplayName
------   ----               -----------
Running  WinRM              Windows Remote Management (WS-Managem…
Notepad

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
----                           -----
WinRM                          Running
Hash2                          {a, b, c}
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (Notepad)

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, b, c}
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, b, c}
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.

Lihat juga