Share via


about_Arrays

簡単な説明

項目のコレクションを格納するように設計されたデータ構造である配列について説明します。

長い説明

配列は、項目のコレクションを格納するように設計されたデータ構造です。 項目には、同じ型または異なる型を指定できます。

Windows PowerShell 3.0 以降では、0 個または 1 つのオブジェクトのコレクションに配列のいくつかのプロパティがあります。

配列の作成と初期化

配列を作成して初期化するには、変数に複数の値を割り当てます。 配列に格納されている値はコンマで区切られ、代入演算子 (=) によって変数名から区切られます。

たとえば、22、5、10、8、12、9、80 の 7 つの数値 (int) 値を含む という名前 $A の配列を作成するには、次のように入力します。

$A = 22,5,10,8,12,9,80

コンマを使用して、1 つの項目の前にコンマを配置することで、1 つの項目配列を初期化することもできます。

たとえば、単一の値 7 を含む という名前 $B の単一項目配列を作成するには、次のように入力します。

$B = ,7

範囲演算子 (..) を使用して配列を作成および初期化することもできます。 次の例では、値 5 から 8 を含む配列を作成します。

$C = 5..8

その結果、5、 $C 6、7、8 の 4 つの値が含まれます。

データ型が指定されていない場合、PowerShell は各配列をオブジェクト配列 (System.Object[]) として作成します。 配列のデータ型を確認するには、 GetType() メソッドを使用します。 たとえば、配列のデータ型を決定するには、次のように $A 入力します。

$A.GetType()

厳密に型指定された配列(つまり、特定の型の値のみを含むことができる配列)を作成するには、 string[]long[]int32[]などの配列型として変数をキャストします。 配列をキャストするには、変数名の前に、角かっこで囲まれた配列型を指定します。 たとえば、4 つの整数 (1500、2230、3350、4000) を含む という名前 $ia の 32 ビット整数配列を作成するには、次のように入力します。

[int32[]]$ia = 1500,2230,3350,4000

その結果、配列には $ia 整数のみを含めることができます。

.NET でサポートされている任意の型にキャストされる配列を作成できます。 たとえば、プロセスを表すために取得する Get-Process オブジェクトは 、System.Diagnostics.Process 型です。 厳密に型指定されたプロセス オブジェクトの配列を作成するには、次のコマンドを入力します。

[Diagnostics.Process[]]$zz = Get-Process

配列サブ式演算子

配列サブ式演算子は、その中のステートメントから配列を作成します。 演算子内のステートメントによって生成されるものはすべて、演算子によって配列に配置されます。 0 個または 1 個のオブジェクトがある場合でも。

配列演算子の構文は次のとおりです。

@( ... )

配列演算子を使用して、0 個または 1 つのオブジェクトの配列を作成できます。 例:

$a = @("Hello World")
$a.Count
1
$b = @()
$b.Count
0

配列演算子は、オブジェクトを取得するときにスクリプトで役立ちますが、取得するオブジェクトの数がわかりません。 例:

$p = @(Get-Process Notepad)

配列サブ式演算子の詳細については、「 about_Operators」を参照してください。

配列要素へのアクセスと使用

配列の読み取り

変数名を使用して配列を参照できます。 配列内のすべての要素を表示するには、配列名を入力します。 たとえば、 が 9 までの整数 0、1、2 を含む配列であるとします $a 。次のように入力します。

$a
0
1
2
3
4
5
6
7
8
9

位置 0 から始まるインデックスを使用して、配列内の要素を参照できます。 インデックス番号を角かっこで囲みます。 たとえば、配列の最初の要素を表示するには、次のように $a 入力します。

$a[0]
0

配列の 3 番目の要素を表示するには、次のように $a 入力します。

$a[2]
2

インデックスの範囲演算子を使用して、配列の一部を取得できます。 たとえば、配列の 2 番目から 5 番目の要素を取得するには、次のように入力します。

$a[1..4]
1
2
3
4

負の数は、配列の末尾からカウントされます。 たとえば、"-1" は配列の最後の要素を参照します。 配列の最後の 3 つの要素をインデックスの昇順で表示するには、次のように入力します。

$a = 0 .. 9
$a[-3..-1]
7
8
9

負のインデックスを降順に入力すると、出力が変わります。

$a = 0 .. 9
$a[-1..-3]
9
8
7

ただし、この表記を使用する場合は注意が必要です。 表記は、末尾の境界から配列の先頭まで循環します。

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

また、一般的な間違いの 1 つは、最後の要素を除く配列のすべての要素を参照していると仮定 $a[0..-2] することです。 これは、配列内の最初の要素、最後の要素、および 2 番目から最後の要素を参照します。

プラス演算子 (+) を使用して、範囲と配列内の要素のリストを組み合わせることができます。 たとえば、インデックス位置 0、2、4 ~ 6 に要素を表示するには、次のように入力します。

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

また、複数の範囲と個々の要素を一覧表示するには、プラス演算子を使用できます。 たとえば、要素 0 から 2、4 から 6、および 8 番目の位置の型の要素を一覧表示するには、次のようにします。

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

配列要素に対する反復

また、ループWhileなどのForEachForループ コンストラクトを使用して、配列内の要素を参照することもできます。 たとえば、ループを ForEach 使用して配列内 $a の要素を表示するには、次のように入力します。

$a = 0..9
foreach ($element in $a) {
  $element
}
0
1
2
3
4
5
6
7
8
9

ループは Foreach 配列を反復処理し、配列の末尾に達するまで配列内の各値を返します。

ループは For 、配列内の要素を調べながらカウンターをインクリメントする場合に便利です。 たとえば、ループを For 使用して配列内の他のすべての値を返すには、次のように入力します。

$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
  $a[$i]
}
0
2
4
6
8

ループを使用すると、 While 定義された条件が true でなくなるまで、配列内の要素を表示できます。 たとえば、配列インデックスが 4 未満の場合に $a 配列内の要素を表示するには、次のように入力します。

$a = 0..9
$i=0
while($i -lt 4) {
  $a[$i]
  $i++
}
0
1
2
3

配列のプロパティ

Count または Length または LongLength

配列内の項目の数を確認するには、 プロパティまたはそのCountエイリアスをLength使用します。 Longlength は、配列に 2,147,483,647 を超える要素が含まれている場合に便利です。

$a = 0..9
$a.Count
$a.Length
10
10

Rank

配列内の次元数を返します。 PowerShell のほとんどの配列には、1 つのディメンションのみが含まれます。 次の例のように多次元配列を構築していると思う場合でも、

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"

この例では、他の配列を含む 1 次元配列を作成しています。 これはジャ グ配列とも呼ばれます。 プロパティは Rank 、これが 1 次元であることを証明しました。 ジャグ配列内の項目にアクセスするには、インデックスを別々の角かっこ ([]) に含める必要があります。

$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32

多次元配列は、 行メジャー順に格納されます。 次の例は、真に多次元配列を作成する方法を示しています。

[string[,]]$rank2 = [string[,]]::New(3,2)
$rank2.rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d

多次元配列内の項目にアクセスするには、角かっこ () の 1 つのセット内でコンマ (,) を使用してインデックスを[]区切ります。

レプリケーションや連結など、多次元配列に対する一部の操作では、その配列をフラット化する必要があります。 フラット化により、配列は制約のない型の 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
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c

出力は、 が行メジャー順と $b 行メジャー順の項目$aを含む 1 次元配列であることを$c示しています。

Object[]
Int32[,]
Object[]
red
True
10
20
30
40

配列のメソッド

Clear

すべての要素値を配列の要素型の 既定値 に設定します。 メソッドは Clear() 配列のサイズをリセットしません。

次の例 $a では、 オブジェクトの配列です。

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

この例では、 $intA は整数を含むに明示的に型指定されています。

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

ForEach

配列内のすべての要素を反復処理し、配列の各要素に対して特定の操作を実行できるようにします。

ForEachメソッドには、さまざまな操作を実行するいくつかのオーバーロードがあります。

ForEach(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

ForEach(scriptblock 式)

ForEach(scriptblock expression, object[] arguments)

このメソッドは PowerShell v4 で追加されました。

注意

構文には、スクリプト ブロックを使用する必要があります。 scriptblock が唯一のパラメーターである場合、かっこは省略可能です。 また、 メソッドと左かっこまたは中かっこの間にスペースを入れてはなりません。

次の例は、 メソッドの使用方法を ForEach 示しています。 この場合、意図は配列内の要素の二乗値を生成することです。

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

の パラメーターForEach-Objectと同様に-ArgumentListarguments パラメーターを使用すると、引数を受け入れるように構成されたスクリプト ブロックに引数の配列を渡すことができます。

ArgumentList の動作の詳細については、「about_Splatting」を参照してください。

ForEach(型 convertToType)

メソッドを ForEach 使用すると、要素を別の型にすばやくキャストできます。次の例は、文字列の日付のリストを型に変換する方法を [DateTime] 示しています。

@("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])

Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM

ForEach(string propertyName)

ForEach(string propertyName, object[] newValue)

メソッドを ForEach 使用して、コレクション内のすべての項目のプロパティ値をすばやく取得または設定することもできます。

# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM

ForEach(string methodName)

ForEach(string methodName, object[] arguments)

Lastly, ForEach メソッドを使用して、コレクション内のすべての項目に対してメソッドを実行できます。

("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE

の パラメーターForEach-Objectと同様に-ArgumentList、 パラメーターをArguments使用すると、値を受け入れるように構成されたスクリプト ブロックに値の配列を渡すことができます。

注意

Windows PowerShell 3.0 以降では、コレクション内の各項目のプロパティの取得とメソッドの実行は、"スカラー オブジェクトとコレクションのメソッド" を使用して行うこともできます。 詳細については 、about_methodsを参照してください。

場所

配列の要素をフィルター処理または選択できます。 スクリプトは、0 (0)、空の文字列、 $false または $null の後に要素が表示される以外の値に評価される Where必要があります。 ブール評価の詳細については、「 about_Booleans」を参照してください。

メソッドには 1 つの定義 Where があります。

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

注意

構文には、スクリプト ブロックを使用する必要があります。 scriptblock が唯一のパラメーターである場合、かっこは省略可能です。 また、 メソッドと左かっこまたは中かっこの間にスペースを入れてはなりません。

Expressionはフィルター処理に必要な scriptblock であり、mode省略可能な引数では追加のnumberToReturn選択機能が許可され、省略可能な引数ではフィルターから返される項目の数を制限できます。

に使用できる値 mode は次のとおりです。

  • Default (0) - すべてのアイテムを返す
  • First (1) - 最初の項目を返す
  • Last (2) - 最後の項目を返す
  • SkipUntil (3) - 条件が true になるまで項目をスキップし、残りのすべての項目 (条件が true である最初の項目を含む) を返します。
  • Until (4) - 条件が true になるまですべてのアイテムを返す
  • Split (5) - 2 つの要素の配列を返します
    • 最初の要素には、一致する項目が含まれています
    • 2 番目の要素には、残りの項目が含まれています

次の例は、配列からすべての奇数を選択する方法を示しています。

(0..9).Where{ $_ % 2 }
1
3
5
7
9

この例では、空でない文字列を選択する方法を示します。

('hi', '', 'there').Where({$_.Length})
hi
there

Default

モードでは、 Default scriptblock を使用して項目がフィルター処理されます Expression

numberToReturn 指定されている場合は、返される項目の最大数を指定します。

# Get the zip files in the current users profile, sorted by LastAccessTime.
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)

注意

モードとFirstモードの両方がDefault最初の (numberToReturn) 項目を返し、同じ意味で使用できます。

Last

$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour.
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)

SkipUntil

モードは SkipUntil 、オブジェクトがスクリプト ブロック式フィルターを渡すまで、コレクション内のすべてのオブジェクトをスキップします。 次に、残りのコレクション項目 をすべて テストせずに返します。 合格した項目は 1 つだけテストされます

つまり、返されるコレクションには、テストされていない 合格 項目と 不合格 項目の両方が含まれます。

返される項目の数は、 引数に値 numberToReturn を渡すことによって制限できます。

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Until

モードは Until モードを SkipUntil 反転します。 項目がスクリプト ブロック式を渡すまで、コレクション内 のすべての 項目を返します。 項目が scriptblock 式 を渡 すと、 メソッドは項目の処理を Where 停止します。

つまり、 メソッドから最初の一連の 非合格 アイテムを Where 受け取ります。 1 つの 項目に合格すると、残りの項目はテストも返もされません。

返される項目の数は、 引数に値 numberToReturn を渡すことによって制限できます。

# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10

注意

SkipUntil の両方Untilが、項目のバッチをテストしないという前提で動作します。

Until は、最初のパスの の項目を返 します

SkipUntil は、最初のパスの のすべての項目 (最初の 合格項目を含む) を返します。

Split

モードは Split 、コレクション項目を 2 つの個別のコレクションに分割またはグループ化します。 scriptblock 式を渡すものと渡さないもの。

numberToReturn 指定されている場合、最初のコレクションには、指定された値を超えないように、 渡される 項目が含まれます。

残りのオブジェクト (式フィルターを すオブジェクトも含む) は、2 番目のコレクションで返されます。

$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
...
$stopped
Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
...

注意

メソッドと where メソッドはどちらもforeach組み込みメンバーです。 組み込みメンバーの詳細については、「about_Instrinsic_Members」を参照してください。

配列のメンバーを取得する

プロパティや SetValue メソッドなど、配列のプロパティとメソッドをLength取得するには、コマンドレットの InputObject パラメーターをGet-Member使用します。

配列を にパイプすると、PowerShell は一度に Get-Member1 つずつ項目を送信し、 Get-Member 配列内の各項目の型を返します (重複は無視されます)。

InputObject パラメーターを使用すると、Get-Member配列のメンバーが返されます。

たとえば、次のコマンドは配列変数のメンバーを $a 取得します。

Get-Member -InputObject $a

コマンドレットにパイプされる値の前にコンマ (,) を入力して、配列のメンバーを Get-Member 取得することもできます。 コンマは、配列を配列の配列の 2 番目の項目にします。 PowerShell は配列を一度に 1 つずつパイプし、 Get-Member 配列のメンバーを返します。 次の 2 つの例と同様です。

,$a | Get-Member

,(1,2,3) | Get-Member

配列の操作

配列内の要素を変更し、配列に要素を追加し、2 つの配列の値を 3 番目の配列に結合できます。

配列内の特定の要素の値を変更するには、変更する要素の配列名とインデックスを指定し、代入演算子 (=) を使用して要素の新しい値を指定します。 たとえば、配列内 $a の 2 番目の項目の値 (インデックス位置 1) を 10 に変更するには、次のように入力します。

$a[1] = 10

配列の SetValue メソッドを使用して値を変更することもできます。 次の例では、配列の 2 番目の値 (インデックス位置 1) を $a 500 に変更します。

$a.SetValue(500,1)

演算子を += 使用して、配列に要素を追加できます。 次の例は、配列に要素を追加する方法を $a 示しています。

$a = @(0..4)
$a += 5

注意

演算子を += 使用すると、PowerShell は実際には元の配列の値と加算された値を含む新しい配列を作成します。 操作が複数回繰り返されるか、配列のサイズが大きすぎる場合、パフォーマンスの問題が発生する可能性があります。

配列から要素を削除するのは簡単ではありませんが、既存の配列の選択された要素のみを含む新しい配列を作成できます。 たとえば、インデックス位置 2 の $t 値を除く、配列内のすべての要素を $a 含む配列を作成するには、次のように入力します。

$t = $a[0,1 + 3..($a.length - 1)]

2 つの配列を 1 つの配列に結合するには、プラス演算子 (+) を使用します。 次の例では、2 つの配列を作成し、それらを結合し、結果の結合された配列を表示します。

$x = 1,3
$y = 5,9
$z = $x + $y

その結果、 $z 配列には 1、3、5、9 が含まれます。

配列を削除するには、 の $null 値を配列に割り当てます。 次のコマンドは、 変数の配列を $a 削除します。

$a = $null

コマンドレットを Remove-Item 使用することもできますが、特に大きな配列の場合は、 の値を $null 割り当てる方が高速です。

0 または 1 の配列

Windows PowerShell 3.0 以降では、0 個または 1 つのオブジェクトのコレクションに Count および Length プロパティがあります。 また、1 つのオブジェクトの配列にインデックスを作成することもできます。 この機能は、コレクションを想定するコマンドが 2 つ未満の項目を取得したときに発生するスクリプト エラーを回避するのに役立ちます。

この機能の例を次に示します。

0 個のオブジェクト

$a = $null
$a.Count
$a.Length
0
0

1 つのオブジェクト

$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4

System のインデックス作成のサポート。Tuple オブジェクト

PowerShell 6.1 では、配列と同様に、オブジェクトのインデックス付きアクセスの Tuple サポートが追加されました。 例:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

配列やその他のコレクション オブジェクトとは異なり、オブジェクトは、 Tuple パイプラインを介して渡されたとき、またはオブジェクトの配列をサポートするパラメーターによって 1 つのオブジェクトとして扱われます。

詳細については、「 System.Tuple.」を参照してください。

メンバーアクセス列挙

PowerShell 3.0 以降では、メンバー アクセス演算子を使用してリスト コレクションに存在しないメンバーにアクセスすると、PowerShell はコレクション内の項目を自動的に列挙し、各アイテムの指定されたメンバーにアクセスしようとします。 詳細については、「 about_Member-Access_Enumeration」を参照してください。

次の例では、2 つの新しいファイルを作成し、結果のオブジェクトを配列変数 $filesに格納します。 配列オブジェクトには LastWriteTime メンバーがないため、配列内の各項目に対して WriteTime のLast値が返されます。

$files = (New-Item -Type File -Force '/temp/t1.txt'),
         (New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM

メンバー アクセス列挙を使用すると、コレクション内の項目から値を 取得 できますが、コレクション内の項目に値を 設定 することはできません。 例:

$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.

値を設定するには、 メソッドを使用する必要があります。

$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM

メソッドは set_LastWriteTime()FileInfo オブジェクトの非表示のメンバーです。 次の例は、 非表示set のメソッドを持つメンバーを検索する方法を示しています。

$files | Get-Member | Where-Object Definition -like '*set;*'
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}

注意事項

メソッドはコレクション内の各項目に対して実行されるため、メンバー列挙を使用してメソッドを呼び出すときは注意が必要です。

こちらもご覧ください