about_Arrays

簡単な説明

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

長い説明

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

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

配列の作成と初期化

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

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

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

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

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

$B = ,7

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

$C = 5..8

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

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

$A.GetType()

型指定された配列 (つまり、特定の型の値のみを含む配列) を作成するには、変数を string[] 、long[]または int32[] などの配列型としてキャストします。 配列をキャストするには、変数名の前に角かっこで囲まれた配列型を指定します。 たとえば、4 つの整数 $ia (1500、2230、3350、4000) を含む という名前の 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。

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

配列の読み取り

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

$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

配列要素に対する繰り返し

、、 ループなどのループ構造を使用して、配列内の要素 ForEach For While を参照することもできます。 たとえば、 ループを使用して 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 の要素を表示できます。 たとえば、配列インデックスが 4 未満の間に配列内の要素を表示するには、次のコマンド $a を入力します。

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

配列のプロパティ

Count または Length または LongLength

配列内の項目の数を確認するには、 プロパティ Length または別名を使用 Count します。 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 length: $($a.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 次元配列に変換します。 結果の配列は、すべての要素を行メジャー順に受け取る。 次の例を確認してください。

$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

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

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 示しています。 この場合、目的は配列内の要素の 2 乗値を生成します。

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

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

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

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

注意

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

Where

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

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

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

注意

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

はフィルター処理に必要なスクリプト ブロックであり、省略可能な引数では追加の選択機能を使用できます。オプションの引数を使用すると、フィルターから返される項目の数を制限 Expression mode numberToReturn できます。

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

  • Default (0) - すべての項目を返します
  • First (1) - 最初の項目を返します
  • Last (2) - 最後の項目を返します
  • SkipUntil (3) - 条件が 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)

注意

モードと Default モードは First どちらも最初の ( 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

注意

UntilSkipUntil どちらも、項目のバッチをテストしないという前提で動作します。

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

SkipUntil は、最初のパスの 後のすべての 項目を 返します。最初に渡された項目も含まれます。

Split

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

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

残りのオブジェクト (式フィルター を PASS する オブジェクトも含む) は、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
...

注意

メソッド foreach と メソッド where の両方が組み込みメンバーです。 組み込みメンバーの詳細については、「組み込みメンバー」を about_Instrinsic_Members

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

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

配列を にパイプ処理すると、PowerShell は項目を一度に 1 つ送信し、配列内の各項目の型 Get-Member 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 番目の配列に結合することができます。

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

$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 の配列

3.0 Windows PowerShellから、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

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

詳細については、「システム」を参照 Tuple してください

関連項目