PowerShellの配列の扱い方

こんにちは。
けいぞうです。

今回はPowerShellの配列の扱い方についての記事です。

配列の作り方

1から10のInt型の要素をもつ配列を作るには以下のように書きます

①$int_array = 1,2,3,4,5,6,7,8,9,10

②$int_array = 1..10

③$int_array = @(1,2,3,4,5,6,7,8,9,10)

①カンマ区切り

>$int_array = 1,2,3,4,5,6,7,8,9,10
>$int_array
1
2
3
4
5
6
7
8
9
10

カンマ区切りで変数に値を格納すると配列になります。

PowerShellの配列の特徴は、型がバラバラな値も要素として入れることができるところです。

> $array = 1, 1.5, "hogehoge"
> $array
1
1.5
hogehoge

それぞれの要素の方を確認するとこうなっています。

> $array[0].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType


> $array[1].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Double                                   System.ValueType


> $array[2].GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

②「..」でつなぐ

値が数値のときに限って使える方法ですが、

「..」を使って省略して指定することができます。

> $int_array = 1..10
> $int_array
1
2
3
4
5
6
7
8
9
10

この「..」は配列だけに限らず、どこでも使えます。

よく使うのが、foreach文などです。

foreach($i in 1..10){
    $i
}

この場合は、$iが1~10まで繰り返すという意味になります。

③@()で指定する

この記述が一番正攻法の記述方法になります。

> $int_array = @(1,2,3,4,5,6,7,8,9,10)
> $int_array
1
2
3
4
5
6
7
8
9
10

ただのカンマ区切りとの違いは、要素の数が1つの場合でも確実に「配列」として作成してくれるところです。

>$array1 = 1  #要素が「1」だけ
>$array1.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

>$array2 = @(1) #こっちも要素が「1」だけ
>$array2.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

配列に要素を足す方法

11番目に「11」を足したい!

でも、普通にAddするとこうなります。

配列が「固定サイズ」になっていて追加できないようです。

先述した方法で作った配列は固定サイズで、必ずこうなってしまいます。

固定サイズかどうか確認するには「IsFixedSize 」プロパティを使います。

> $int_array.IsFixedSize
True

Trueが返ってきたらこの配列は固定サイズです。

配列に要素を足したい場合は以下の2つの方法があります。

  • 「+=」を使う
  • ArrayListで作り直す

「+=」を使う

この方法は、「固定サイズの配列に別のオブジェクトを結合する」という方法です。

> $int_array += 11
> $int_array
1
2
3
4
5
6
7
8
9
10
11

元々あった$int_arrayと11を結合した別の$int_arrayを作成した感じです。

これで出来上がった配列も固定サイズのままです。

ArrayListで作り直す

この方法は、「可変サイズのオブジェクトとして作り直す」という方法です。

#ArrayListを作成する
$array_list = New-Object System.Collections.ArrayList

#可変サイズになっていることを確認
$array_list.IsFixedSize
False

#$int_arrayに詰めなおす
foreach($i in $int_array){
    $array_list.Add($i)
}

#「11」を追加する
 $array_list.Add(11)

$array_list
1
2
3
4
5
6
7
8
9
10
11

配列から要素を削除する方法

追加と同じで削除に関しても「固定サイズ」だとエラーになります。

こちらも、要素を削除するには2通りの方法があります。

  • 要素を減らした配列を新しく作る
  • ArrayListで作り直す

要素を減らした配列を新しく作る

どうしてもオブジェクトの型を変えたくない場合はこちらの方法でよいでしょう。

例えばこんな風に書けば、先頭の要素だけ削除することが可能です。

$int_array = $int_array[1..$int_array[$int_array.Length -1]]

ArrayListで作り直す

要素を追加する時と同様に、ArrayListを作って値を詰めなおし、その後に消したい要素を削除する方法です。

#ArrayListを作成する
$array_list = New-Object System.Collections.ArrayList

#可変サイズになっていることを確認
$array_list.IsFixedSize
False

#$int_arrayに詰めなおす
foreach($i in $int_array){
    $array_list.Add($i)
}

#「1」を追加する
$array_list.Remove(1)

$array_list
2
3
4
5
6
7
8
9
10

配列の要素を抽出する方法

配列の要素を取り出す方法としは、以下の2つがあります。

  • インデックス指定
  • 比較演算子を使う

インデックス指定

例えば1~10が含まれている配列の3番目を取得したい場合は以下のように書きます。

> $int_array[2]
3

これはどのプログラミング言語でも共通ですが、要素の順番は「0番目」からスタートするので、3つめを取得したい場合は「2」を指定します。

ちゃんと「3」が取得できています。

比較演算子を使う

直接インデックスを指定する以外に比較演算子を使うこともできます。

例えば、「3」の要素を取得したい場合。

> $int_array -eq 3
3

3番目ではなく、「3」を取得したい場合です。


他の演算子も使えます。

「3以上」を取得したい場合

> $int_array -gt 3
4
5
6
7
8
9
10

要素が文字列だった場合は、「s」を含むとか、色々応用が可能です。

比較演算子については以下記事で詳細説明していますので、こちらからどうぞ👇

2つの配列を比較する方法

Compare-Objectというコマンドレットで2つの配列を比較することができます。

例えばこのような配列があったとします。

$a = @(1,2,3,4,5)
$b = @(1,2,3,4,5,6,7)

この2つをCompare-Objectで比較するとこのようになります。

> Compare-Object $a $b

InputObject SideIndicator
----------- -------------
          6 =>
          7 =>

$bにだけ、6,7がありますよーと言うことです。

こんな感じで各配列の過不足を表示してくれます。

>$a = @(1,2,3)
>$b = @(4,5,6)
> Compare-Object $a $b

InputObject SideIndicator
----------- -------------
          4 =>
          5 =>
          6 =>
          1 <=
          2 <=
          3 <=

過不足が無ければ、結果が返ってきません。

>$a = @(1,2,3,4,5)
>$b = @(1,2,3,4,5)
>Compare-Object $a $b
>