PowerShell: 配列の使い方まとめ

PowerShellでの配列の作成・初期化、要素の参照・値の代入、 要素数、スライス(切り出し)、要素の追加・削除など、 配列の使い方をまとめて紹介しています。

配列を作成・初期化する

PowerShellで配列を作成する場合は各要素をカンマ区切りで記述します。 この記述で配列の宣言と初期化を兼ねています。

# 各要素が文字列の場合
$arr = "a", "b", "c", "d", "e"

# 各要素が数値の場合
$arr = 1, 2, 3, 4, 5

# 要素が連続した数値の場合
$arr = 1..5

# 文字列と数値が混在した配列
$arr = 1, "a", 2, "b", 3

# 要素が1つの場合①: 先頭にカンマを付ける
$arr = , "a"

# 要素が1つの場合②: @()演算子を使う
$arr = @("a")

# 空の配列を作成
$arr = @()

(詳細記事:配列を作成・初期化する

要素の参照、値の代入

参照も代入もどちらも配列名の後に[インデックス]を付けて要素を指定します。

書式
配列名[インデックス]

要素の参照

配列の要素を参照する場合、 配列名[インデックス]と記述します。 配列の要素数以上のインデックスを指定した場合、 エラーにはならずに「Null」となります。

$arr = "a", "b", "c"

# 要素の参照
Write-Host $arr[1]  # b

値を代入

配列の各要素に値を代入する場合は配列名[インデックス] を代入演算子の左側(左辺)に記述します。 配列の要素数以上のインデックスを指定した場合は エラーが発生します。

$arr = "a", "b", "c"

# 代入
$arr[1] = "x"

Write-Host $arr  # a x c

(詳細記事:配列の要素の参照、値の代入

配列の要素数(長さ) Length

PowerShellで配列の要素数(長さ)を取得する場合は、 Lengthプロパティを使用します。 Lengthプロパティのエイリアス(別名) としてCountも使用できます。

書式
配列.Length

配列.Count
$arr1 = 1, 2, 3, 4, 5

# 要素数を取得
$arr1.Length  # 5
$arr1.Count   # 5


# 空の配列の場合
$arr = @()

$arr.Length  # 0

(詳細記事:配列の要素数(長さ)を取得する Length

配列のスライス(切り出し)

PowerShellでスライスを行う場合、 配列のインデックスに要素の範囲を示す配列を指定します。

次のコードではインデックスをカンマで区切ることで、 2番目、4番目、6番目の要素を取り出します。

$arr = 10..20

# 特定の要素
Write-Host $arr[1, 3, 5]  # 11, 13, 15

要素の順番を入れ替えて取得。

$arr = 10..20

# 順序を入れ替えて取得
Write-Host $arr[1, 4, 2, 8]  # 11 14 12 18

連続した要素を取得する場合は「..」が使えます。 次のコードでは2番目から4番目までを切り出しています。

$arr = 10..20

# 連続した要素
Write-Host $arr[1..3]  # 11 12 13

連続して切り出した要素同士を+演算子で 結合。

$arr = 10..20

# +演算子で連続した要素同士を結合
Write-Host $arr[1..3 + 6..8]  # 11 12 13 16 17 18

マイナスの数値を使うことで末尾から取り出すこともできます。 「-1」を指定した場合は末尾要素。

# 末尾から
$arr = 10..20

Write-Host $arr[-1]  # 20
(詳細記事:配列のスライス(切り出し)

配列の先頭・末尾に要素を追加する

配列の末尾に要素を追加する

末尾に要素を追加する場合は「+」演算子、 又は「+=」演算子を使用します。

$arr = "a" , "b" , "c"

$arr = $arr + "d"

Write-Host $arr  # a b c d

「+=」演算子でも同じです。

$arr = "a" , "b" , "c"

$arr += "d"

Write-Host $arr  # a b c d

配列の先頭に要素を追加する

先頭に追加する場合は「+」演算子を使用しますが、 単純に「値 + 配列」と記述してもうまくいきません。 「配列 + 配列」として結合する必要があります。
そのため、追加したい値を「@()」を使って配列にします

$arr = "a" , "b" , "c"

$arr = @("d") + $arr

Write-Host $arr  # d a b c

(詳細記事:配列の先頭・末尾に要素を追加する

配列の先頭・末尾要素を削除する

PowerShellでは要素を削除するpop等のメソッドや関数は用意されていません。 ですが配列のスライス(切り出し・範囲取得)機能を使えば実現できます。

配列の末尾の要素を削除する

末尾の要素を削除するには、 スライス機能を使って「先頭」から「末尾の1つ前」 までのインデックスを指定します。 そうすることで末尾を削除するのと同じ効果を得られます。

$arr = "a" , "b" , "c", "d", "e"

$n = $arr.Length - 2

# 末尾要素を削除
$arr = $arr[0..$n]

Write-Host $arr # a b c d

又は

# 末尾要素を削除
$arr = $arr[0..($arr.Length - 2)]

配列の先頭の要素を削除する

「2番目」から「末尾」までのインデックスを指定

$arr = "a" , "b" , "c", "d", "e"

$arr = $arr[1..($arr.Length-1)]

Write-Host $arr  # b c d e

(詳細記事:配列の先頭・末尾要素を削除する

配列の結合

PowerShellで配列を結合する場合は、 主に+演算子や+=演算子を使って行います。

+演算子での結合

「配列+配列」

$arr1 = "a", "b"

$arr2 = "c", "d"

$arr3 = $arr1 + $arr2

Write-Host $arr3  # a b c d

+演算子の右辺に配列ではなく、文字列等の単一の値。

$arr1 = "a", "b"

$arr2 = $arr1 + "c"

Write-Host $arr2  # a b c

+=演算子での結合

右辺に配列を指定して結合しています。

$arr1 = "a", "b"

$arr2 = "c", "d"

$arr1 += $arr2

Write-Host $arr1

右辺に単一の値を指定する例です。

$arr1 = "a", "b"

$arr1 += "c"

Write-Host $arr1  # a b c

(詳細記事:配列を結合する方法

配列から重複している要素を削除

Select-Objectに「-Unique」を指定すると配列の重複削除が簡単にできます。

$arr = "c", "b", "c", "c", "a", "b"

$arr = $arr | Select-Object -Unique

Write-Host $arr  # c b a

Select-Objectのエイリアス(別名)はselectなので次のように記述しても 同じ結果を得られます。

$arr = $arr | select -Unique

(詳細記事:配列から重複を削除

配列内のNullや空文字の要素を削除

PowerShellで配列内にあるNullや空文字が入った要素を削除する場合、 使用するのは比較演算子の「-ne」です。
比較演算子の左辺が配列の場合、 配列の各要素と右辺の値を比較してTrueとなる要素のみを抽出します。 つまり配列要素のフィルタリングの役目を果たしてくれます。

$arr = "a", "b", $null, "c", $null, "d"

Write-Host $arr
Write-Host $arr.Length

# Nullを削除
$arr = $arr -ne $null

Write-Host $arr
Write-Host $arr.Length

# 実行結果
a b  c  d
6
a b c d
4

空文字の要素を削除する場合

# 空文字を削除
$arr = $arr -ne ""

(詳細記事:配列内のNullや空文字の要素を削除する

配列から条件に一致する要素を抽出(フィルタ)

PowerShellで配列から条件に一致する要素のみを抽出したい場合、 Where-Objectコマンドレットを使用します。

数値配列から要素を抽出

数値配列の中から10以上の要素のみを抽出しています。

$arr = 12, 3, 25, 9, 14, 10

$arr = $arr | Where-Object {$_ -ge 10}

Write-Host $arr  # 12 25 14 10

奇数のデータを取得します。

$arr = 12, 3, 25, 9, 14, 10

$arr = $arr | Where-Object {($_ %  2) -eq 1}

Write-Host $arr  # 3 25 9

文字列配列から要素を抽出

次のコードは文字列"a"以外の要素を抽出しています。

$arr = "a", "b", "a", "c", "d", "a"

$arr = $arr | Where-Object {$_ -ne "a"}

Write-Host $arr  # b c d

like演算子を使ったワイルドカード検索によるフィルタです。

$arr = "cat", "bat", "but", "cut"

$arr = $arr | Where-Object {$_ -like "*a*"}

Write-Host $arr  # cat bat

使用する演算子

種類演算子
比較演算子 -eq, -ne, -gt, -ge, -lt, -le
文字列演算子 -like, -notlike, -match, -notmatch

(詳細記事: 配列から条件に一致する要素を抽出(フィルタ)

配列のループ

配列のループはいくつか方法がありますが、 最も使われるforeachを使ってのループと forループを紹介します。

foreachループ

$arr = "a", "b", "c"

foreach ($item in $arr) {
	Write-Host $item
}

# 実行結果
a
b
c

forループ

配列のインデックスが偶数の場合(要素の順番は奇数)のみ要素を表示しています。

$arr = "a", "b", "c"

for ($i = 0; $i -lt $arr.Length; $i++) {

	if (($i % 2) -eq 0){
		Write-Host $arr[$i]
	}
}

# 実行結果
a
c

(詳細記事:配列のループ処理 3通り

配列の要素をソートする Sort-Object

PowerShellで配列の要素をソートする場合は、 Sort-Objectコマンドレットを使用します。

数値が入った配列のソートを実行してみます。

$arr = 3, 4, 2, 5, 1

$arr = $arr | Sort-Object

Write-Host $arr  # 1 2 3 4 5

降順の場合はスイッチパラメータの「-Descending」を指定。

$arr = 3, 4, 2, 5, 1

$arr = $arr | Sort-Object -Descending

Write-Host $arr  # 5 4 3 2 1

英字のソートです。

$arr = "d", "b", "e", "a", "c"

$arr = $arr | Sort-Object

Write-Host $arr  # a b c d e

(詳細記事:配列の要素をソートする Sort-Object

配列の要素を逆順にする Reverse

配列の要素を逆順にする場合はReverseメソッドを使います。

書式
[array]::Reverse(配列)

0から5までの数値が入った配列の要素を 逆順にしています。

$arr = 0..5

[array]::Reverse($arr)

Write-Host $arr  # 5 4 3 2 1 0

(詳細記事:配列の要素を逆順にする Reverse

配列をシャッフルする Get-Random

PowerShellで配列をシャッフルしたい場合は、 Get-Randomコマンドレットを使うと実現できます。

書式
Get-Random オブジェクト [-Count 取得数]

オブジェクトに配列を指定した場合、 配列の要素を「ランダムにダブルことなく」取得できます。 この機能を応用して配列のシャッフルを行います。

配列$arrをシャッフルしたい場合は次のように記述します。

Get-Random $arr -Count $arr.Length
$arr = 1..10

$arr2 = Get-Random $arr -Count $arr.Length

Write-Host $arr2

# 実行結果
1 7 4 9 2 6 5 3 8 10

(詳細記事:配列をシャッフルする Get-Random

多次元配列

ジャグ配列と呼ばれる配列の中に配列を作成する方法で 多次元配列を作成し、 さらにデータを追加・削除する方法を紹介します。

多次元配列を作成

配列の中に配列を宣言することで多次元配列になります。

$arr = @((1, "田中"),
		(2, "佐藤"),
		(3, "山田"))

Write-Host $arr

# 実行結果
1 田中 2 佐藤 3 山田

要素の参照

Write-Host $arr[2][1]

# 実行結果
山田

要素値の変更

$arr[2][1] = "高山"

データの追加

+=演算子を使って、多次元配列$arrの末尾に1行分のデータを追加します。
重要なのは@の前にあるカンマ(,)を付け忘れないことです。 カンマがないとうまく追加されません。
最後にLengthプロパティで配列の要素数が4になっていることが確認できます。

$arr = @((1, "田中"),(2, "佐藤"),(3, "山田"))

$arr += ,@(4, "鈴木")

Write-Host $arr
Write-Host ("要素数: " + $arr.Length)

# 実行結果
1 田中 2 佐藤 3 山田 4 鈴木
要素数: 4

データの削除

上で紹介した要素の削除と同じです。

先頭行を削除する場合。

$arr = $arr[1..($arr.Length - 1)]

最終行を削除する場合。

$arr = $arr[0..($arr.Length - 2)]

(詳細記事: 多次元配列の作成、データの追加・削除

PowerShell
PR