[Powershell] Hashtable (ハッシュテーブル) の使い方まとめ(作成・追加・編集・削除・参照)

PowerShell

Powershellでよく利用するハッシュテーブルですが、本投稿ではハッシュテーブルの作成から追加、編集、削除、参照方法まですべてまとめておきます。

ハッシュテーブルを使うことでキーと値のペアとしてデータを保持し、必要なデータに対して迅速かつ効率的にアクセスすることができます。

是非この機会にハッシュテーブルの使い方をマスターしましょう

\ドルで稼ぎたいアフィリエイターの方必見/

  • 円安時代のドル報酬で稼ぎたい!
  • 完全インプレッション報酬!
  • サポートが充実!

The Moneytizer

実行環境

今回の実行環境は下記の通りである

OSWindows 11
PSVersion5.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でスクリプトを書く際、ハッシュテーブルは結構頻繁に利用するケースが存在します。

是非、この際に一通りのお作法を学んでおくと良いかと思います。

タイトルとURLをコピーしました