PowerShell Hashtable の使用初心者ガイド

はじめてハッシュテーブルに出会うと、それが何であり、どのようにスクリプトやコマンドで重要な役割を果たすのかについて疑問に思うかもしれません。心配しないでください!このチュートリアルでは、PowerShellハッシュテーブルの使い方を始めるのに役立ちます。

要するに、ハッシュテーブルは、キーと値のペアを使ってデータを格納し、効率的にアクセスできるようにするものです。そして、このチュートリアルでは、ハッシュテーブルの基礎を学び、PowerShellスクリプトやコマンドでそれらをどのように使用するかを学びます。

さらに学んで、PowerShellハッシュテーブルでスキルを拡張しましょう!

前提条件

このチュートリアルは、実演形式で行われます。一緒に進むためには、PowerShell v5以上がインストールされ、設定されているシステムがあることを確認してください。このチュートリアルでは、PowerShell 7を使用したWindows 10を使用しますが、他のバージョンのPowerShellやWindowsでも機能します。

PowerShellハッシュテーブルの作成

特定のデータを取得することは、「草の中の針を探す」状況になることがあります。しかし、ハッシュテーブルを使用すると、膨大なデータコレクションの中から特定のアイテムを素早く検索することができます。

PowerShellでは、ハッシュテーブルは、構成データの格納、コマンドレットへの引数の渡し、およびスクリプトでのデータの格納など、さまざまな方法で使用される柔軟なデータ構造です。

PowerShellハッシュテーブルの動作を確認するには、まず次のようにしてハッシュテーブルを作成する必要があります:

1. PowerShellセッションを開き、以下のコマンドを実行します。このコマンドは出力を生成しないが、空のハッシュテーブルを参照するためのnameという変数を宣言します。

下記のように、PowerShellの配列と同様に、ハッシュテーブルも@記号を使用して定義されます。

$name = @{}

2. 次に、以下のコマンドを実行してname変数の型(GetType())を確認します。

$name.GetType()

name変数の型は、下記のようにHashtableです。この情報により、ハッシュテーブルが正常に作成されたことが確認されます。

Verifying the newly-created hashtable

3. ハッシュテーブルの確認が完了したら、以下のコードを実行してハッシュテーブルが空であるかどうかをチェックします。

以下のコードは、Countプロパティが0と等しい(-eq)かどうかを判定し、対応するメッセージを表示します。

# Countプロパティの値が0と等しいかどうかを比較します。
if ($name.Count -eq 0) {
	# もし等しい場合は、以下のメッセージを表示します。
  Write-Output "The hashtable is empty."
} else {
	# そうでなければ、代わりに以下のメッセージを表示します。
  Write-Output "The hashtable is not empty."
}

以下は、ハッシュテーブルが空であり、キーと値のペアが定義されていないことがわかります。

Checking if the hashtable is empty or not

PowerShellのハッシュテーブルにアイテムを追加する

まず、実質的に空のPowerShellのハッシュテーブルを作成しましたが、アイテムを追加しない限りは役に立ちません。では、どのように追加するのでしょうか? ハッシュテーブルにキーと値のペアを追加することで行います。

配列と似ていますが、インデックスとして整数ではなく、PowerShellのハッシュテーブルではキー(任意のデータ型)を使用して値を識別します。この機能により、キーは対応する値を素早く見つけることができるため、ハッシュテーブルからのアイテムの挿入、検索、削除が迅速に行えます。

以下は、PowerShellのハッシュテーブルにキーと値のペアを追加するための構文です。ここで:

  • $hashtable – ハッシュテーブルの名前。
  • $key – キーの名前で、大文字と小文字を区別しません。たとえば、「FirstName」と「firstname」はハッシュテーブル内では同じキーと見なされます。
  • $value – キーに関連付ける値。
$hashtable[$key] = $value

次のコードを実行し、コンソールに出力は生成されませんが、キーと値のペアを宣言し、それらをハッシュテーブル($name)に追加します。

ハッシュテーブルでは、キーに対してハッシュ関数を実行することで、キーをハッシュテーブルの内部データ構造内の特定の場所にマップします。

? ハッシュテーブルの値は、数値、文字列、配列、オブジェクト、およびその他のデータ型といった任意の型にすることができます。

キーFirstNameを宣言します。
$key = "FirstName"
キーの値を宣言します。
$value = "John"
アイテムをハッシュテーブルに追加します。
$name[$key] = $value

キーLastNameを宣言します。
$key = "LastName"
キーの値を宣言します。
$value = "Doe"
アイテムをハッシュテーブルに追加します。
$name[$key] = $value

以下のコードを再実行して、ハッシュテーブルが空でないかどうかを確認してください。

if ($name.Count -eq 0) {
  Write-Output "The hashtable is empty."
} else {
  Write-Output "The hashtable is not empty."
}

以下に示すように、今回はハッシュテーブルが空でないというメッセージが表示されます。

Checking if the hashtable is empty or not

PowerShellハッシュテーブルからアイテムを取得する

ハッシュテーブルが空でないと自信を持っているとします。ハッシュテーブルにどのアイテムが存在するかをどのように知ることができますか?幸いなことに、ハッシュテーブルからアイテムを取得することもできます。

以下のコードを実行して、ハッシュテーブルからすべてのアイテムをキーと値のペアで1行ずつ取得して出力します。

# ハッシュテーブル内のすべてのキーと値のペアを反復処理します。
foreach ($key in $name.Keys) {
	$value = $name[$key]
  # ハッシュテーブル内のすべてのキーと値のペアを1行ずつ出力します。
	Write-Output "${key}: ${value}"
}
Retrieving items from a PowerShell hashtable

以下のコードを実行して、ハッシュテーブル内のすべてのアイテムをコンソールに取得して出力します。

? このチュートリアルでは、しばしば以下のコードを使用します。同じコードを複数回コピーして貼り付けることを避けるために、関数を作成することができますが、それはこのチュートリアルの範囲外です。

# コレクションの要素を反復処理するために使用できるオブジェクトを取得します。
$enumerator = $name.GetEnumerator()
foreach ($element in $enumerator) {
	# コレクション内の各要素のキーと値を含む文字列を出力します。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

今回は、リストされたアイテムの中でキーと値がどれかの指示を見ることができます。

Retrieving items from a PowerShell hashtable, indicating which are the keys and value pairs

事前定義値を使用してハッシュテーブルを作成する

これまで、空のハッシュテーブルの作成だけを見てきました。しかし、特定の値が常にハッシュテーブルで必要になることがわかっている場合は、事前に値を定義して作成することができます。

事前定義値を持つハッシュテーブルを使用すると、後で値をハッシュテーブルに追加する必要がないため、時間を節約し、コードを効率的にすることができます。

? ハッシュテーブルを作成しても、出力されません。しかし心配はいりません。このチュートリアルでは、作成後の各ハッシュテーブルを確認します。

1. 以下のコマンドを実行して、3つのキーと値のペアを持つハッシュテーブル ($hashtable1) を作成します。

$hashtable1 = @{
  "Key1" = "Value1"
  "Key2" = "Value2"
  "Key3" = "Value3"
}

2. 次に、以下のコードを実行して、新しいハッシュテーブル (hashtable1) が存在することを確認します。

# コレクションの要素を反復処理するために使用できるオブジェクトを取得します。
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
  # コレクション内の各要素のキーと値を含む文字列を出力します。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

各キーと値のペアの値が期待通りに画面に表示されることがわかります。この出力により、事前に定義された値がハッシュテーブルの適切な場所に格納されていることが確認されます。

Verifying that hashtable was created successfully with predefined values

3. 以下のコードを実行して、ループ(または配列)を使用して事前定義された値を持つハッシュテーブル($hashtable2)を作成します。

$keys = "Key1", "Key2", "Key3"
$values = "Value1", "Value2", "Value3"
$hashtable2 = @{}
for ($i = 0; $i -lt $keys.Count; $i++) {
  $hashtable2[$keys[$i]] = $values[$i]
}

4. 最後に、以下のコードを実行して、新しいハッシュテーブル(hashtable2)が正常に作成されたことを確認します。

# コレクションの要素を反復処理するために使用できるオブジェクトを取得します。
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
	# コレクション内の各要素のキーと値を含む文字列を出力します。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

以下の出力により、ループメソッドが、事前定義された値を持つハッシュテーブルを作成する際に機能することが確認されます。ただし、アイテムがランダムにリストされているため、修正方法については次のセクションに進んでください。

Verifying the new hashtable was created successfully

ハッシュテーブル内のアイテムの順序付きリストの作成

デフォルトでは、ハッシュテーブル内のアイテムは特定の順序で格納されません。しかし、順序付きのリストが必要な場合はどうしますか?ハッシュテーブル内のアイテムの順序付きリストを作成して、データを特定の順序で配置することもできます。

ハッシュテーブル内のアイテムの順序付きリストを作成するには、次のように[ordered]属性を使用します:

1. 以下のコードを実行して、ハッシュテーブル($hashtable3)内のアイテムの[ordered]リストを作成します。

$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}

2. 次に、以下のコードを実行して、ハッシュテーブルの順序付きリストが正常に作成されたことを確認します。

# コレクションの要素を反復処理するために使用できるオブジェクトを取得します。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# コレクション内の各要素のキーと値を含む文字列を出力します。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

以下に示すように、リストされたアイテムは、ハッシュテーブルを作成したときに定義した順序で保持されます。

順序付きハッシュテーブルを使用することの可能な利点には、以下のようなものがありますが、これらに限定されません。

Benefits Description
Easier to read and debug The elements are displayed in a predictable order, which can be especially useful if you work with many elements of a large hashtable.
Improved performance An ordered hashtable can be more efficient when accessing elements frequently in a specific order.
Verifying that the ordered list of hashtables has been created

3. 最後に、順序付きハッシュテーブル($hashtable3)を呼び出して、引き続き順序付きのアイテムのリストを取得できることを確認します。

$hashtable3

以下の出力は、ハッシュテーブルにアクセス方法に関係なく、順序付きのアイテムのリストが取得できることを確認しています。

Verifying the list of items is still in an ordered format

ハッシュテーブル内の既存のアイテムを更新する

データは常に変化し、既存のハッシュテーブルを更新することは重要なタスクです。たとえば、設定値を保存するためにハッシュテーブルを使用している場合、設定が変更された場合にキーの値を更新する必要があります。

PowerShellのハッシュテーブルを更新するには、=代入演算子を使用します。

1. 下記のコマンドを実行します。このコマンドは出力を提供しませんが、$hashtable3内のKey2の値をNewValue2に更新します。

$hashtable3["Key2"] = "NewValue2"

次に、以下のコマンドを実行して、ハッシュテーブル($hashtable3)に新しいキーと値のペア(Key4 = NewValue4)を追加します。

新しいキーと値のペアを追加すると、既存のハッシュテーブルのリストを更新するような出力は生成されませんが、次の手順で変更が確認されます。

$hashtable3.Add("Key4", "NewValue4")

3. 以下のコードを実行して、ハッシュテーブル($hashtable3)のキーの値が更新されたことを確認します。

# コレクションの要素を反復処理するために使用できるオブジェクトを取得します。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# コレクションの各要素のキーと値を含む文字列を出力します。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
Verifying the key values have been updated

? PowerShellでは、ハッシュテーブルの各キーは一意である必要があります。既にハッシュテーブルに存在するキーと値のペアを追加しようとすると、以下のようなエラーが発生します。このエラーを避けるためには、次の手順に進んでください。

Adding a key that already exists

4. 以下のコードを実行し、キーを追加する前にハッシュテーブル内にキーが既に存在するかどうかを確認するためにContains()メソッドを使用します。

# 新しいキーを保持する変数を定義します。
$newkey="Key5"
# $newkey がハッシュテーブル内に既に存在するかどうかをチェックします。
if (-not $hashtable3.Contains($newkey)) {
	# 存在しない場合は、新しいキーと値のペアを追加します。
	$hashtable3.Add($newkey, "NewValue5")
	Write-Output "The new key '$newkey' has been added to the hashtable."
} else {
	# キーが存在する場合は、メッセージを表示します。
	Write-Output "The key '$newkey' already exists."
}

新しいキーが存在しない場合、以下のメッセージが表示されます。新しいキーがハッシュテーブルに追加されました。

Checking if a key exists before adding it to the hashtable

さもなければ、以下のように、すでに存在するキーを試している場合はメッセージが表示されます。

Adding a key that already exists

5. 最後に、下記のコードを再実行して、ハッシュテーブル($hashtable3)内のすべてのアイテムを取得します。

# コレクションの要素を反復処理するために使用できるオブジェクトを取得します。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# コレクション内の各要素のキーと値を含む文字列を出力します。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

以下では、新しく追加されたキー(Key5)と、これまでにハッシュテーブルに追加したその他のアイテムが表示されます。

Checking all items listed in a hashtable

ハッシュテーブルからアイテムを削除する

特に不要なものを含むハッシュテーブルには、混乱を招く可能性があります。不要なアイテムを削除することで、ハッシュテーブルから必要のないアイテムを削除することができます。

ハッシュテーブルにユーザーとその情報のリストが含まれていると仮定します。その場合は、ハッシュテーブルから、もはやアクティブでないユーザーを削除します。

以下のコードを実行して、ハッシュテーブル($hashtable3)から特定のアイテム(Key1)を削除します。

$key = "Key5"
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."
}

以下の出力では、キーが削除されたことを示すメッセージが表示されます。しかし、キーが存在しない場合は、キーが見つからなかったことを示すメッセージが表示されます。

Removing items from a hashtable

次に、ハッシュテーブル内のすべてのアイテムをチェックして、アイテムの削除が成功したかどうかを検証するために、次のコードを実行します。

# コレクションの要素を反復処理するために使用できるオブジェクトを取得します。
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# コレクション内の各要素のキーと値を含む文字列を出力します。
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

以下、ハッシュテーブル内において、’Key5’というキーのキー-値のペアが存在しなくなったことを確認できます。

Verifying item deletion is successful

結論

キー-値のペア構造と高速なアクセスを備えたPowerShellのハッシュテーブルは、さまざまなシナリオで大量のデータを管理するのに適しています。そして、このチュートリアルでは、ハッシュテーブルの作成、追加、更新、および削除方法を学びました。これらすべてが、スクリプトでハッシュテーブルを効果的に使用するスキルを提供します。

なぜ新しく獲得したスキルを次のレベルに引き上げないのでしょうか?ハッシュテーブルをより高度なタスクに取り込んでみてください。例えば、データの操作や変換などです。または、PowerShellで他のデータ構造(配列やオブジェクトなど)と組み合わせて、より複雑な問題を解決するためにハッシュテーブルを実験的に使用してみてください。

Source:
https://adamtheautomator.com/powershell-hashtable/