Bagikan melalui


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 menggunakan Item(int index) kelebihan beban properti berparameter. Nilai array [[object]1] bukan indeks tetapi nilai kunci menggunakan Item(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.

Lihat juga