about_Hash_Tables

Deskripsi singkat

Menjelaskan cara membuat, menggunakan, dan mengurutkan tabel hash di PowerShell.

Deskripsi panjang

Tabel hash, 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 nilai, atau sebaliknya.

Di PowerShell, setiap tabel hash adalah objek Hashtable (System.Collections.Hashtable). Anda dapat menggunakan properti dan metode objek Hashtable di PowerShell.

Dimulai di PowerShell 3.0, Anda dapat menggunakan atribut [diurutkan] untuk membuat kamus yang diurutkan (System.Collections.Specialized.OrderedDictionary) di PowerShell.

Kamus yang diurutkan berbeda dari tabel hash di mana kunci selalu muncul dalam urutan di mana Anda mencantumkannya. Urutan kunci dalam tabel hash tidak ditentukan.

Kunci dan nilai dalam tabel hash juga merupakan objek .NET. Mereka paling sering string atau bilangan bulat, tetapi dapat memiliki jenis objek apa pun. Anda juga dapat membuat tabel hash berlapis, di mana nilai kunci adalah tabel hash lain.

Tabel hash sering digunakan karena sangat efisien untuk menemukan dan mengambil data. Anda bisa menggunakan tabel hash untuk menyimpan daftar dan membuat properti terhitung di PowerShell. Dan, PowerShell memiliki cmdlet, ConvertFrom-StringData, yang mengonversi string menjadi tabel hash.

Sintaks

Sintaks tabel hash adalah sebagai berikut:

@{ <name> = <value>; [<name> = <value> ] ...}

Sintaks kamus yang diurutkan adalah sebagai berikut:

[ordered]@{ <name> = <value>; [<name> = <value> ] ...}

Atribut [diurutkan] diperkenalkan di PowerShell 3.0.

Membuat Tabel Hash

Untuk membuat tabel hash, ikuti panduan berikut:

  • Mulai tabel hash dengan tanda at (@).
  • Sertakan tabel hash dalam kurung kurawal ({}).
  • Masukkan satu atau beberapa pasangan kunci/nilai untuk konten tabel hash.
  • 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 tabel hash, simpan dalam variabel.
  • Saat menetapkan tabel hash yang diurutkan ke variabel, tempatkan atribut [diurutkan] sebelum @ simbol . Jika Anda menempatkannya sebelum nama variabel, perintah gagal.

Untuk membuat tabel hash kosong dalam nilai $hash, ketik:

$hash = @{}

Anda juga dapat menambahkan kunci dan nilai ke tabel hash saat membuatnya. Misalnya, pernyataan berikut membuat tabel hash dengan tiga kunci.

$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

Membuat Kamus Yang Diurutkan

Anda dapat membuat kamus yang diurutkan dengan menambahkan objek dari jenis OrderedDictionary , tetapi cara termampu untuk membuat kamus yang diurutkan adalah dengan 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 tabel hash. Salah satu jenis dapat digunakan sebagai nilai parameter yang mengambil tabel hash atau kamus (iDictionary).

Anda tidak dapat menggunakan [ordered] atribut untuk mengonversi atau mentransmisikan tabel hash. 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 tabel hash, 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 Tabel Hash

Untuk menampilkan tabel hash yang disimpan dalam variabel, ketik nama variabel. Secara default, tabel hash ditampilkan sebagai tabel dengan satu kolom untuk kunci dan satu untuk nilai.

$hash
Name                           Value
----                           -----
Shape                          Square
Color                          Blue
Number                         1

Tabel hash 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 tabel hash, dan nilainya adalah nilai properti nama kunci. Gunakan format berikut untuk menampilkan nilai properti.

$hashtable.<key>
<value>

Contohnya:

$hash.Number
1

$hash.Color
Blue

Tabel hash memiliki properti Count yang menunjukkan jumlah pasangan kunci-nilai dalam tabel hash.

$hash.count
3

Tabel tabel hash bukan array, sehingga Anda tidak dapat menggunakan bilangan bulat sebagai indeks ke dalam tabel hash, tetapi Anda bisa menggunakan nama kunci untuk mengindeks ke dalam tabel hash. 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 bisa menggunakan anggota intrinsikpsbase 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 antarmuka System.Collections.IDictionary , seperti OrderedDictionary.

Iterasi atas kunci dan nilai

Anda dapat melakukan iterasi di atas kunci dalam tabel hash 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 tabel hash 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 mengulangi kunci.

foreach ($Key in $hash.Keys) {
    "The value of '$Key' is: $($hash[$Key])"
}

Contoh ini menggunakan ForEach-Object untuk melakukan iterasi melalui 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 mengulangi 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 tabel hash, gunakan format perintah berikut.

$hash["<key>"] = "<value>"

Misalnya, untuk menambahkan kunci "Waktu" dengan nilai "Sekarang" ke tabel hash, gunakan format pernyataan berikut.

$hash["Time"] = "Now"

Anda juga dapat menambahkan kunci dan nilai ke tabel hash dengan menggunakan metode Tambahkan objek System.Collections.Hashtable. Metode Tambahkan memiliki sintaks berikut:

Add(Key, Value)

Misalnya, untuk menambahkan kunci "Waktu" dengan nilai "Sekarang" ke tabel hash, gunakan format pernyataan berikut.

$hash.Add("Time", "Now")

Dan, Anda dapat menambahkan kunci dan nilai ke tabel hash dengan menggunakan operator tambahan (+) untuk menambahkan tabel hash ke tabel hash yang ada. Misalnya, pernyataan berikut menambahkan kunci "Waktu" dengan nilai "Sekarang" ke tabel hash dalam variabel $hash.

$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 Hapus objek Hashtable. Metode Hapus mengambil kunci sebagai nilainya.

Metode Remove memiliki sintaks berikut:

Remove(Key)

Misalnya, untuk menghapus pasangan kunci/nilai Time=Now dari tabel hash dalam nilai variabel $hash, ketik:

$hash.Remove("Time")

Anda dapat menggunakan semua properti dan metode objek Hashtable di PowerShell, termasuk Contains, Clear, Clone, dan CopyTo. Untuk informasi selengkapnya tentang objek Hashtable, lihat System.Collections.Hashtable.

Tipe Objek dalam HashTables

Kunci dan nilai dalam tabel hash dapat memiliki jenis objek .NET apa pun, dan satu tabel hash dapat memiliki kunci dan nilai dari beberapa jenis.

Pernyataan berikut membuat tabel hash string nama proses dan memproses nilai objek dan menyimpannya dalam $p variabel.

$p = @{"PowerShell" = (Get-Process PowerShell);
"Notepad" = (Get-Process notepad)}

Anda dapat menampilkan tabel hash di $p dan menggunakan properti nama kunci untuk menampilkan nilai.

$p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)

$p.PowerShell

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    441      24    54196      54012   571     5.10   1788 PowerShell

$p.keys | foreach {$p.$_.handles}
441
251

Kunci dalam tabel hash juga dapat berupa jenis .NET apa pun. Pernyataan berikut menambahkan pasangan kunci/nilai ke tabel hash 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 dengan menggunakan metode yang sama dengan yang Anda gunakan untuk pasangan lain dalam tabel hash.

$p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running

$p.keys
PowerShell
Notepad

Status   Name               DisplayName
------   ----               -----------
Running  winrm              Windows Remote Management (WS-Manag...

$p.keys | foreach {$_.name}
winrm

Kunci dan nilai dalam tabel hash juga bisa menjadi objek Hashtable. Pernyataan berikut menambahkan pasangan kunci/nilai ke tabel hash dalam variabel di $p mana kuncinya adalah string, Hash2, dan nilainya adalah tabel hash dengan tiga pasangan kunci/nilai.

$p = $p + @{"Hash2"= @{a=1; b=2; c=3}}

Anda dapat menampilkan dan mengakses nilai baru dengan menggunakan metode yang sama.

$p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
Hash2                          {a, b, c}

$p.Hash2

Name                           Value
----                           -----
a                              1
b                              2
c                              3

$p.Hash2.b
2

Mengurutkan Kunci dan Nilai

Item dalam tabel hash secara intrinsik tidak diurutkan. Pasangan kunci/nilai mungkin muncul dalam urutan yang berbeda setiap kali Anda menampilkannya.

Meskipun Anda tidak dapat mengurutkan tabel hash, Anda bisa menggunakan metode GetEnumerator tabel hash untuk menghitung kunci dan nilai, lalu menggunakan cmdlet Sort-Object 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.

$p.GetEnumerator() | Sort-Object -Property key

Name                           Value
----                           -----
Notepad                        System.Diagnostics.Process (notepad)
PowerShell                     System.Diagnostics.Process (PowerShell)
System.ServiceProcess.Servi... Running

Perintah berikut menggunakan prosedur yang sama untuk mengurutkan nilai hash dalam urutan menurun.

$p.getenumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running

Membuat Objek dari Tabel Hash

Dimulai di PowerShell 3.0, Anda bisa membuat objek dari tabel hash properti dan nilai properti.

Sintaksnya adalah sebagai berikut:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Metode ini hanya berfungsi untuk kelas yang memiliki konstruktor null, yaitu 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 tabel hash. 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 tabel hash menyertakan tanda kutip. Untuk informasi selengkapnya tentang here-string, lihat about_Quoting_Rules.

Contoh berikut menunjukkan cara membuat string pesan pengguna di sini dalam contoh sebelumnya dan cara menggunakannya ConvertFrom-StringData untuk mengonversinya dari string menjadi tabel hash.

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 tabel hash.

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