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)]
(詳細記事: 多次元配列の作成、データの追加・削除)