編集メモ
重要
Windows PowerShell 言語仕様 3.0 は、2012 年 12 月に公開され、Windows PowerShell 3.0 に基づいています。 この仕様では、PowerShell の現在の状態は反映されません。 現在の状態を反映するようにこのドキュメントを更新する予定はありません。 このドキュメントは、履歴参照のためにここに示されています。
仕様文書は、Microsoft ダウンロード センターから Microsoft Word 文書として入手できます。https://www.microsoft.com/download/details.aspx?id=36389 Word 文書は、Microsoft Learn でプレゼンテーション用に変換されています。 変換中に、Docs プラットフォームの書式設定に対応するために、いくつかの編集の変更が行われました。 一部の入力ミスと軽微なエラーが修正されました。
9.1 概要
PowerShell では、1 つ以上のディメンションを持つ配列がサポートされており、各ディメンションには 0 個以上の 要素を含めることができます。 ディメンション内では、要素は 0 から始まる昇順の整数で番号が付けられます。
配列添字演算子 []
(§7.1.4) を使用して、個々の要素にアクセスできます。 配列内の次元の数は、その ランクと呼ばれます。
要素には、配列型を含む任意の型の値を含めることができます。 任意の配列型の値を持つ 1 つ以上の要素を持つ配列は、ジャグ配列と呼ばれます。 多次元配列 には複数の次元があり、その場合、ディメンションの各行の要素数は同じです。 ジャグ配列の要素には多次元配列を含めることができ、多次元配列の要素にはジャグ配列を含めることも可能です。
多次元配列は、行優先順に格納されます。 配列内の要素の数は、配列の 長呼び出されます。これは、配列の作成時に固定されます。 そのため、長さ N を持つ1次元配列 の要素 は、(すなわち、下付き) 式 A[0], A[1], ..., A[N-1]
を使用してアクセスすることができます。
既定では、配列はポリモーフィックな
$items = 10,"blue",12.54e3,16.30D # 1-D array of length 4
$items[1] = -2.345
$items[2] = "green"
$a = New-Object 'object[,]' 2,2 # 2-D array of length 4
$a[0,0] = 10
$a[0,1] = $false
$a[1,0] = "red"
$a[1,1] = $null
1 次元配列には型 type[]
、2 次元配列には型 type[,]
、3 次元配列には型 type[,,]
などがあり、型 は制約されていない型配列のオブジェクト、または制約付き配列の制約型 (§9.4) です。
すべての配列型は、Array 型 (§4.3.2) から派生します。
9.2 配列の作成
配列は、配列作成式により作成されます。その形式には、単項コンマ演算子 (§7.2.1)、array-expression (§7.1.7)、バイナリコンマ演算子 (§7.3)、範囲演算子 (§7.4)、または New-Object コマンドレット があります。
配列の作成と使用方法の例を次に示します。
$values = 10, 20, 30
for ($i = 0; $i -lt $values.Length; ++$i) {
"`$values[$i] = $($values[$i])"
}
$x = , 10 # x refers to an array of length 1
$x = @(10) # x refers to an array of length 1
$x = @() # x refers to an array of length 0
$a = New-Object 'object[,]' 2, 2 # create a 2x2 array of anything
$a[0, 0] = 10 # set to an int value
$a[0, 1] = $false # set to a boolean value
$a[1, 0] = "red" # set to a string value
$a[1, 1] = 10.50D # set to a decimal value
foreach ($e in $a) { # enumerate over the whole array
$e
}
次のコードがパイプラインに書き込まれます。
$values[0] = 10
$values[1] = 20
$values[2] = 30
10
False
red
10.50
明示的に初期化されていない要素の既定値は、その要素の型 (つまり、$false
、0、または $null
) の既定値です。
9.3 配列連結
任意の型と長さの配列は、+
演算子と +=
演算子を使用して連結でき、どちらも制約のない新しい 1 次元配列が作成されます。 既存の配列は変更されません。 詳細については §7.7.3 を参照し、制約付き型の配列に追加する方法については §9.4 を参照してください。
9.4 要素型の制約
1 次元配列は、配列作成式の前に配列型キャストを付けることで、型制約を受けることができるように作成できます。 例えば
$a = [int[]](1,2,3,4) # constrained to int
$a[1] = "abc" # implementation-defined behavior
$a += 1.23 # new array is unconstrained
多次元配列を作成するための構文では、型の指定が必要であり、その型がその配列の制約型になります。 ただし、object[]
型を指定することで、そのタイプの配列の要素にどんな型の値でも割り当てられるため、実際には制約はありません。
2 つの配列 (§7.7.3) を連結すると、両方の配列が同じ型によって制約されている場合でも、常に制約されていない新しい配列が作成されます。 例えば
$a = [int[]](1,2,3) # constrained to int
$b = [int[]](10,20) # constrained to int
$c = $a + $b # constraint not preserved
$c = [int[]]($a + $b) # result explicitly constrained to int
9.5 参照型としての配列
配列型は参照型です。配列を指定する変数は、任意のランク、長さ、および要素型の任意の配列を参照するように設定できます。 例えば
$a = 10,20 # $a refers to an array of length 2
$a = 10,20,30 # $a refers to a different array, of length 3
$a = "red",10.6 # $a refers to a different array, of length 2
$a = New-Object 'int[,]' 2,3 # $a refers to an array of rank 2
配列の代入には浅いコピーが含まれます。つまり、割り当てられた変数は同じ配列を参照し、配列のコピーは作成されません。 例えば
$a = 10,20,30
">$a<"
$b = $a # make $b refer to the same array as $a
">$b<"
$a[0] = 6 # change value of [0] via $a
">$a<"
">$b<" # change is reflected in $b
$b += 40 # make $b refer to a new array
$a[0] = 8 # change value of [0] via $a
">$a<"
">$b<" # change is not reflected in $b
次のコードがパイプラインに書き込まれます。
>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<
9.6 配列要素としての配列
配列の任意の要素は、それ自体を配列にすることができます。 例えば
$colors = "red", "blue", "green"
$list = $colors, (,7), (1.2, "yes") # parens in (,7) are redundant; they
# are intended to aid readability
"`$list refers to an array of length $($list.Length)"
">$($list[1][0])<"
">$($list[2][1])<"
次のコードがパイプラインに書き込まれます。
$list refers to an array of length 3
>7<
>yes<
$list[1]
は、次に示すように、$list[1][0]
を介してアクセスされる整数 7 の 1 つの要素の配列を参照します。 これを次の微妙に異なるケースと比較します。
$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"
ここで、$list[1]
はスカラーを指し、整数7は、$list[1]
を介してアクセスされる。
次の例を考えてみましょう。
$x = [string[]]("red","green")
$y = 12.5, $true, "blue"
$a = New-Object 'object[,]' 2,2
$a[0,0] = $x # element is an array of 2 strings
$a[0,1] = 20 # element is an int
$a[1,0] = $y # element is an array of 3 objects
$a[1,1] = [int[]](92,93) # element is an array of 2 ints
9.7 負の添字
これについては、§7.1.4.1で説明します。
9.8 境界チェック
これについては、§7.1.4.1で説明します。
9.9 配列スライス
配列スライス は、コレクションから 0 個以上の要素のコピーである要素を持つ制約のない 1 次元配列です。 配列スライスは、添字演算子 []
(§7.1.4.5) を使用して作成されます。
9.10 配列のコピー
連続した要素のセットは、メソッド [Array]::Copy
を使用して、配列間でコピーできます。 例えば
$a = [int[]](10,20,30)
$b = [int[]](0,1,2,3,4,5)
[Array]::Copy($a, $b, 2) # $a[0]->$b[0],
$a[1]->$b[1]
[Array]::Copy($a, 1, $b, 3, 2) # $a[1]->$b[3],
$a[2]->$b[4]
9.11 配列の要素を列挙する
添字演算子を使用して各要素にアクセスする配列をループ処理することはできますが、foreach ステートメントを使用してその配列の要素を列挙できます。 多次元配列の場合、要素は行優先順で処理されます。 例えば
$a = 10, 53, 16, -43
foreach ($elem in $a) {
# do something with element via $elem
}
foreach ($elem in -5..5) {
# do something with element via $elem
}
$a = New-Object 'int[,]' 3, 2
foreach ($elem in $a) {
# do something with element via $elem
}
9.12 多次元配列のフラット化
多次元配列に対する一部の操作 (レプリケーション (§7.6.3) や連結 (§7.7.3) など) では、配列をフラット化 必要があります。つまり、制約のない型の 1 次元配列に変換されます。 結果の配列は、すべての要素を行優先順で受け取ります。
次の例を考えてみましょう。
$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$c
によって指定された配列には、要素 "red"、$true
、10、20、30、40 が含まれています。
PowerShell