晴耕雨読

working in the fields on fine days and reading books on rainy days

PowerShellの配列と連想配列

PowerShellで配列を定義するには、配列キャスト構文 @() を使用します。 しかし、実際はこの構文を使用しなくても配列を作ることは可能です。 また、連想配列を定義するには @{} を使用します。

1. 配列

配列の定義は @() を使用します。

配列の定義

空の配列を定義する場合は、@() を使用します。

PS> @().Count
0

配列の要素が2個以上あるときは、カンマ区切りにするだけで自動的に配列として評価されます。

PS> ("a", "b", "c").Count
3

配列の要素が一つだけの時は、要素の前にカンマを追加するだけで自動的に配列として評価されます。 もちろん、配列キャスト構文 @() を使って配列を定義することもできます。

PS> (,"a").Count
1
PS> @("a").Count
1

配列の宣言時に型付けをする場合は、代入する部分の行頭で [int[]] のような記述を追加します。 型付けした場合は、その型にキャストできる値だけを要素に入れることができます。

PS> [int[]] $array = 1, 2, 3.14
PS> $array[2]
3

配列の中に配列を入れることで、ジャグ配列を定義することができます。

PS> $jaggedArray = @((1,2,3), (4,5,6))
PS> $jaggedArray[0][1]
2

多次元配列を作成したい場合は、.NETの多次元インスタンスを作成します。

PS> $ndarray = New-Object "int[,]" 2,3
PS> $ndarray[0,1] = 2

配列へのアクセス

配列へのアクセスは [ ] と添字を使って、要素の読み書きを行います。

PS> $myArray = 0,1,2,3,4,5
PS> $myArray[1]
1
PS> $myArray[-1]
5
PS> $myArray[1..3]
1
2
3

配列への要素の追加

配列への要素の追加は += を使います。

PS> $myArray = @(1,2)
PS> $myArray += 4
PS> $myArray
1
2
4 

配列スライス

配列スライスは、配列から特定の添字の範囲で要素を抽出するために使用します。 配列スライスは + (配列の結合) を使って範囲を複数組み合わせることも可能です。

PS> $myArray = 0,1,2,3,4,5
PS> $myArray[0,2,4]
0
2
4
PS> $myArray[0..2+4,5]
0
1
2
4
5

特殊な例として、配列スライス構文を使って配列を作ることも可能です。

PS> $sample = 0,2 + 4..6
PS> $sample
0
2
4
5
6

並列代入 (複数の変数への同時代入)

配列スライスは代入時にも使用することができます。以下は変数 $a と $b の値を入れ替える例です。

PS> $a = 1; $b = 2
PS> $a, $b = $b, $a
PS> $a
2
PS> $b
1

配列演算子

-join 演算子は、左辺の文字列配列を右辺の文字列を用いて結合します。

PS> @("Apple","Banana","Cherry") -join ", "
Apple, Banana, Cherry

-split 演算子は、左辺の文字列を右辺の文字列 (正規表現) で分割して配列にします。

PS> "Apple,  Banana,`n  Cherry" -split ",\s+"
Apple
Banana
Cherry


2. 連想配列

連想配列の定義は @{} を使用します。

連想配列の定義

連想配列(ハッシュテーブル)の定義は @{} を使います。 宣言時に定義する場合、要素は 要素名=値 で記述し、要素はセミコロン区切りにします。

PS> $product = @{name="Apple"; price=200}
PS> $product.name
Apple
PS> $product.price += 100
PS> $product.price
300
PS> $product.memo = "Sample text."
PS> $product.memo
Sample text.

要素名を動的に決める場合や、要素名に空白などの記号が含まれている場合は、[ ] と添字を使ってアクセスします。

PS> $hashtable = @{}
PS> $hashtable["key 1"] = 111
PS> $hashtable["key 1"]
111

また、連想配列に対して普段使用することはありませんが、."要素名" でアクセスすることも可能です。要素名に空白などの記号が含まれる場合は、要素名をダブルクオートを囲うことで、アクセスすることができます。 この記法は、XML文字列を組み込みのXML型にキャストした時、そのタグの内容にアクセスするときなどに使用します。

PS> $myXml = [xml] @'
<Person>
  <Name>Alice</Name>
  <Phone type="home">000-123-4567</Phone>
</Person>
'@
PS> $myXml.Person.Phone."#text"
000-123-4567

連想配列の要素一覧

連想配列から key と value のペアを取得したいときは、まず key (キー) を取得して、それを利用して value (要素) を取得します。 連想配列のキーの一覧は Keys プロパティで取得できます。

PS> $myHash = @{}
PS> $myHash["foo"] = 123
PS> $myHash["bar"] = 456
PS> $myHash["baz"] = 789
PS> foreach ($key in $myHash.Keys) { "$key => $($myHash[$key])" }
baz => 789
bar => 456
foo => 123

連想配列の value (要素) だけ取得したい場合は、Keys の代わりに Values プロパティを使用します。

PS> $myHash = @{}
PS> $myHash["foo"] = 123
PS> $myHash["bar"] = 456
PS> $myHash["baz"] = 789
PS> foreach ($value in $myHash.Values) { $value }
789
456
123

順序付き連想配列

連想配列で Keys や Values で取得する順番を、連想配列に格納した順番にしてほしい時は、定義時に [ordered] をつけて順序付きにします。

PS> $myHash = [ordered]@{}
PS> $myHash["foo"] = 123
PS> $myHash["bar"] = 456
PS> $myHash["baz"] = 789
PS> foreach ($key in $myHash.Keys) { "$key => $($myHash[$key])" }
foo => 123
bar => 456
baz => 789

以上です。

参考文献