Powershellでよく利用するハッシュテーブルですが、本投稿ではハッシュテーブルの作成から追加、編集、削除、参照方法まですべてまとめておきます。
ハッシュテーブルを使うことでキーと値のペアとしてデータを保持し、必要なデータに対して迅速かつ効率的にアクセスすることができます。
是非この機会にハッシュテーブルの使い方をマスターしましょう
\自身のスキルを向上するには技術書で!!/
月額¥980で技術書が読み放題!!
- ビジネススキルとマインド向上したい!!
- 決断や行動を先送りにしてしまう方!!
実行環境
今回の実行環境は下記の通りである
OS | Windows 11 |
PSVersion | 5.1.22000.653 |
ハッシュテーブルの作成
空のハッシュテーブルを作成する場合は、下記のように「@」記号をつかって定義します。
$htable = @{}
下記を実行し実際にハッシュテーブルとなっていることを確認します。
$htable.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object
次に作成したハッシュテーブルが空かどうかを確認します。
ここではCountプロパティを使って、件数が0件であるかどうかを確認しておきます。
if ($htable.Count -eq 0) {
Write-Output "The hashtable is empty."
} else {
Write-Output "The hashtable is not empty."
}
# The hashtable is empty.
The hashtable is empty. が出力されたので、空であることが確認できました。
事前にハッシュテーブルのデータを定義する
先ほどは空のハッシュテーブルを作成しましたが、事前にデータを定義しておくことも可能です。
$hashtable1 = @{
"Key1" = "Value1"
"Key2" = "Value2"
"Key3" = "Value3"
}
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
# Key: Key3, Value: Value3
# Key: Key1, Value: Value1
# Key: Key2, Value: Value2
“Key” = “Value” 形式で事前に定義できます。
ハッシュテーブルにデータを追加する
先ほど作成した空のハッシュテーブルにデータを追加します。
ハッシュテーブルは配列と似ていますが、インデックスに整数を使う代わりにキー(任意のデータ型)を利用して特定の値にアクセスします。
ハッシュテーブルへのデータ追加は下記のような形式で追加していきます。
$htable[$key] = $value
早速データを追加して行ってみましょう
$key = "FirstName"
$value = "John"
$htable[$key] = $value
$key = "LastName"
$value = "Kunisura"
$htable[$key] = $value
上記の状態で、ハッシュテーブルが空かどうかを確認してみます。
if ($htable.Count -eq 0) {
Write-Output "The hashtable is empty."
} else {
Write-Output "The hashtable is not empty."
}
# The hashtable is not empty.
データは空ではないことがわかります。
Key/Valueの配列を用意してループでデータを追加する
事前に配列を用意しておき、ループさせてデータを追加することができます
$keys = "Key1", "Key2", "Key3"
$values = "Value1", "Value2", "Value3"
$hashtable2 = @{}
for ($i = 0; $i -lt $keys.Count; $i++) {
$hashtable2[$keys[$i]] = $values[$i]
}
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
key用の配列とValue用の配列を用意します。配列のインデックス整数同士の値をハッシュテーブルに追加していきます。
結果を見てみてもわかる通り、期待通り追加されています。
Add メソッドを利用してデータを追加する
ハッシュテーブルにはAddメソッドが用意されており、このメソッドを使うことでデータを追加することができます。
$hashtable2.Add("Key4", "Value4")
# hashtable2 /// Key: Key4, Value: Value4
注意点として、すでに存在するキーを追加すると、下記エラーが発生します。
"2" 個の引数を指定して "Add" を呼び出し中に例外が発生しました: "項目は既に追加されています。辞書のキー: 'Key4' 追加されるキー:'Key4'"
ハッシュテーブルからデータを取得する
ハッシュテーブルに追加したデータを取得し、標準出力で出力してみます。
ハッシュテーブルのデータを全部取得するためにはforeachを利用して取得します。ハッシュテーブル.Keysを使うことで、すべてのキーを取得することができます。
foreach ($key in $htable.Keys) {
$value = $htable[$key]
Write-Output "${key}: ${value}"
}
# LastName: Kunisura
# FirstName: John
注意点として、以下のようにKeysで取得した情報を一度変数に格納して配列のように変数[インデックス] のように情報を取得することはできません。
# NG
$hkeys = $htable.Keys
Write-Output $hkeys[1]
# なにも出力なし
配列のように扱いたい場合は、一度配列に入れ直す必要があります。
$hkeys = $htable.Keys
$keyArr = @()
foreach ( $hkey in $hkeys ){
$keyArr += $hkey
}
Write-Output $keyArr[1]
# FirstName
Enumeratorを利用してハッシュテーブルの情報を取得する
Enumeratorを利用して情報を出力することも可能です。
$enumerator = $htable.GetEnumerator()
foreach ($element in $enumerator) {
# Outputs a string that includes the key and value of each element in the collection.
Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
# Key: LastName, Value: Kunisura
# Key: FirstName, Value: John
順序付きのハッシュテーブルを作成する
ハッシュテーブルでは基本的に順不同でデータが保存されます。順序付きでハッシュテーブルのリストを作成したい場合は[orderd]属性をつけて作成します。
$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
# Outputs a string that includes the key and value of each element in the collection.
Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
# Key: Key1, Value: Value3
# Key: Key2, Value: Value2
# Key: Key3, Value: Value1
上記結果からKey1〜Key3までが順序通り出力されていることがわかります。
ハッシュテーブルの値を更新する
ハッシュテーブルとして定義したKey/Valueに対して値を変更させたい場合は下記のように、対象のキーに対して値を再設定させてあげる必要があります。
$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}
$hashtable3["Key2"] = "Value4"
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
# Outputs a string that includes the key and value of each element in the collection.
Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
# Key: Key1, Value: Value3
# Key: Key2, Value: Value4
# Key: Key3, Value: Value1
最初はKey2に対して「Value2」の値を設定していましたが、そのキーに対して「Value4」を再設定しています。
ハッシュテーブルにキーが存在するかどうかチェックする
すでに作成済みのハッシュテーブルに対して追加したいキーが存在するかどうかチェックしたい場合などは「Contains」メソッドを利用します。
if (-not $hashtable3.Contains("Key2")) {
Write-Output "The key 'Key2' is not exists."
} else {
Write-Output "The key 'Key2' already exists."
}
# The key 'Key2' already exists.
もともとキーに「Key2」が存在していたため、else側に処理が倒れました。
Containsの代わりに「ContainsKey」を使ってキーをチェックすることもできます。
ハッシュテーブルから対象のキーを削除する
ハッシュテーブルから該当するキーを削除したい場合は、ContainsメソッドとRemoveメソッドを利用して処理します。
キーが存在していることを確認した後で削除するという感じですね
$key = "Key2"
if ($hashtable3.Contains($key)) {
$hashtable3.Remove($key)
Write-Output "The key-value pair with the key '$key' was removed from the hashtable."
} else {
Write-Output "The key-value pair with the key '$key' was not found in the hashtable."
}
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
Write-Output "hashtable3 /// Key: $($element.Key), Value: $($element.Value)"
}
# hashtable3 /// Key: Key1, Value: Value3
# hashtable3 /// Key: Key3, Value: Value1
もともと Key2 が存在していましたが、Removeメソッドを利用したことで削除されました。
最後に
PowerShellでスクリプトを書く際、ハッシュテーブルは結構頻繁に利用するケースが存在します。
是非、この際に一通りのお作法を学んでおくと良いかと思います。