HOWTO · PowerShell

PowerShell で配列、ハッシュテーブル、辞書を作成する方法

この包括的なガイドで、PowerShell における配列、ハッシュテーブル、順序付き辞書の作成方法と使用方法を学びましょう。主な違い、項目へのアクセス、追加、削除の方法、そして各データ構造をいつ使うべきかを理解します。実践的な例、実際のユースケース、そして PowerShell のスクリプトとデータ操作を効率的に習得するのに役立つ FAQ セクションを含みます。自動化や PowerShell でのデータ整理を向上させたい初心者にも上級者にも最適です。

このページの内容

値の並びには配列(@())を、キーと値の検索にはハッシュテーブル(@{})を、キーが追加された順序を保持しなければならない場合は順序付き辞書([ordered]@{})を選んでください。以下の例は自己完結した PowerShell の断片です。これらの例については実行時の観測結果が得られていないため、出力は主張されません。

PowerShell で配列を作成する

配列は、複数の値を 1 つの変数に格納します。PowerShell の配列のインデックスは 0 から始まり、-1 は最後の要素を指します。@() は、コマンドが単一の値を返す場合も含めて、結果を明示的に配列として集めます。この例を実行してください。

$items = @('apple', 'banana', 'cherry')
$items[0]
$items[-1]
$items += 'date'
$items = @($items | Where-Object { $_ -ne 'banana' })
$items -join ', '

この例では、最初と最後の値を読み取り、1 つの値を追加した後、banana を除いたフィルタ済みの配列を割り当てます。PowerShell の配列はサイズが固定です。+= は結果の配列を作成して割り当て直すため、大きな配列への追加を繰り返すと、コピーが繰り返し必要になることがあります。追加と削除が頻繁な場合は、System.Collections.Generic.List[object] のような変更可能なコレクションの方が適しているかもしれません。配列の型を調べるには $items.GetType().FullName を使用してください。これらの文字列値に対して @() は Object[] を生成します。

PowerShell でハッシュテーブルを操作する

PowerShell のハッシュテーブルは、キーを値にマッピングします。@{} で作成し、角かっこ表記で項目を読み取り、キーを割り当てて項目を追加または置き換え、.Remove() を呼び出して削除します。角かっこは任意のキー名に対して確実に機能します。ドット表記は、キーがプロパティに似た単純な名前である場合に便利ですが、Count のような組み込みメンバーと競合することがあります。

$inventory = @{ Fruit = 'Apple'; Color = 'Red'; Count = 5 }
$inventory['Color']
$inventory['Shape'] = 'Round'
$inventory.Remove('Color')
$inventory.GetEnumerator() | Sort-Object Name | ForEach-Object {
    "{0}={1}" -f $_.Name, $_.Value
}

最後のパイプラインは、表示のために出力された項目をキーで並べ替えます。元のハッシュテーブルを並べ替えたり置き換えたりはしません。PowerShell のハッシュテーブルのキーは、デフォルトでは大文字と小文字を区別しません。キーの比較セマンティクスを変える必要がある場合は、別のコレクションを使用してください。

PowerShell で順序付き辞書を作成する

[ordered] リテラルは、順序付き辞書を作成し、項目が挿入された順序を保持します。ハッシュテーブルの場合と同様に、キーを使用して項目へのアクセスや更新を行います。挿入順序はアルファベット順の並べ替えとは異なります。別の結果を明示的に並べ替えない限り、元の順序は挿入された順序のままです。

$settings = [ordered]@{ Name = 'Delft'; Region = 'South Holland'; Active = $true }
$settings['Region']
$settings['Timezone'] = 'Europe/Amsterdam'
$settings.GetEnumerator() | ForEach-Object {
    "{0}={1}" -f $_.Key, $_.Value
}

ハッシュテーブルと順序付き辞書:主な違い

| 特徴 | ハッシュテーブル | 順序付き辞書 |
| PowerShell リテラル | @{} | [ordered]@{} |
| データモデル | キーが値にマッピングされる | キーが値にマッピングされる |
| 反復の順序 | 挿入順序には依存しない | 挿入順序を保持する |
| 項目を読み取るか更新する | $table['key'] | $dictionary['key'] |
| 最適な用途 | 表示順序が重要でない場合のキーによる検索 | 挿入順序が重要であるキーと値のデータ |

PowerShell のハッシュテーブルは、あらゆる .NET の辞書型と同じものではありません。System.Collections.Hashtable は PowerShell の @{} リテラルが使用する .NET の型であり、一方で .NET は、独自の順序や比較の振る舞いを持つ他の辞書の実装も提供します。コードが必要とする具体的な型と振る舞いに基づいて選択してください。実際の作業量を測定せずに、どちらのコレクションの方が高速だと決めつけることは避けてください。

実践的なユースケース

出力が選んだ順序に従うべき場合は、ユーザーフィールドや設定フィールドに順序付き辞書を使用してください。キーごとに単語を数えるにはハッシュテーブルを使用してください。これらの例は両方の作業を示します。コードは独立しており、その出力は主張されません。

$user = [ordered]@{
    Name = 'John Doe'
    Email = 'johndoe@example.com'
    Role = 'Admin'
}
$user.GetEnumerator() | ForEach-Object { "{0}: {1}" -f $_.Key, $_.Value }

$text = 'apple banana apple orange apple banana'
$wordCount = @{}
$text.Split() | ForEach-Object {
    if ($wordCount.ContainsKey($_)) {
        $wordCount[$_] += 1
    } else {
        $wordCount[$_] = 1
    }
}
$wordCount.GetEnumerator() | Sort-Object Name | ForEach-Object {
    "{0}: {1}" -f $_.Name, $_.Value
}

まとめ

位置で処理する順序付きの並びには配列を、キーに基づく検索にはハッシュテーブルを、挿入された順序自体が提示するデータの一部である場合は順序付き辞書を使用してください。配列の += は新しい配列を割り当てること、フィルタリングは割り当てるべき結果を返すこと、そしてハッシュテーブルの列挙された項目の並べ替えは、テーブル自体ではなく表示される結果を変えることを覚えておいてください。

よくある質問(FAQ)

PowerShell におけるハッシュテーブルと辞書の違いは何ですか?

日常の PowerShell の使用では、「辞書」は一般的なキーと値の構造を表す場合があり、@{} は .NET の System.Collections.Hashtable 型に基づく PowerShell のハッシュテーブルを作成します。.NET クラスライブラリには異なる辞書型もあるため、API が特定の実装を必要とする場合は具体的な型を確認してください。

PowerShell の配列に項目を追加したり、配列から項目を削除したりするにはどうすればよいですか?

$array += 'newItem' で追加し、その結果を変数に割り当て直してください。一致する値を削除するには、フィルタしてその結果を割り当てます。たとえば $array = @($array | Where-Object { $_ -ne 'itemToRemove' }) です。これらの操作は結果として配列を生成します。既存の配列をその場でサイズ変更するわけではありません。

PowerShell でハッシュテーブルを並べ替えることはできますか?

$hash.GetEnumerator() | Sort-Object Name を使って、その項目を表示用に並べ替えてください。これは並べ替えられた項目を返し、$hash は変更されません。挿入順序が必要な場合は [ordered]@{} を使用してください。これはキーをアルファベット順に並べ替えるのではなく、項目が追加された順序を保持します。