SEブログ

【PowerShell】配列(Array)についてまとめてみる

こんにちは!SE ブログの相馬です。

 

 

 

今回は PowerShell で配列について書きました。

 

 

変数に数値や文字列などのデータを代入する方法は以前の記事で書きましたが、ここでは配列を使って複数のデータを代入する事ができます。

 

 

基本的には変数に 1 つのデータを格納する事ができますが、複数のデータを格納したい場合はどうしたら良いでしょうか。

 

 

利用ケースとして例えば、スクリプトの処理でログを 1 つのファイルにまとめてエクスポートしたい場合等課と思います。各々の処理結果を変数に溜め込んで最後にログに書き込むといったイメージです。

 

 

また、変数の使い方がまだ理解できていない方は、配列を理解する前に変数を理解する必要があります。以下の記事がお役に立てればと思います。

 

【PowerShell】変数の基本的な使い方の説明

 

 

では早速始めましょう。

 

 

 

スポンサーリンク

配列とは

 

 

配列はデータの構造体で複数のデータを保管する事ができます。配列という大きな箱にデータという小さな箱が入っているようなイメージです。

 

 

 

保管するデータについて、データ型は同じ種類或いは異なる種類で別々にできます。データ型については、以下の記事を参考にしていただければと思います。

 

【PowerShell】データの種類について(整数型と文字列型)

 

 

配列内のそれぞれのデータのデータにはインデックス番号というものを持ちます。箱に貼ってあるラベルみたいなものだと思ってもらえればと思います。

 

 

 

インデックス番号は 0 から始まり、データが格納される毎に 1 つずつ番号が増えていきます。

 

 

Index にインデックス番号が入り、Value にデータが入ります。0 は配列での最初のインデックス番号。1 は 2 番目のインデックス番号です。

 

 

 

 

スポンサーリンク

配列の宣言について

 

 

PowerShell では配列の宣言は無くても動きますが、宣言する場合は以下のように @() を変数に代入する書き方になります。

 

$arg = @()

 

 

$arg という変数は何でもいいですが、複数のデータが格納されている点において分かりやすい名前にしておくと良いでしょう。思いつかなければ、$Data とか $Array とか、$arg などでも良いでしょう。

 


$arg = @()

$arg += "メッセージ1"
$arg += "メッセージ2"
$arg += "メッセージ3"

Write-Output $arg


# 実行結果

メッセージ1
メッセージ2
メッセージ3

 

 

 

配列を作る

 

 

それでは配列を作ってみましょう。まずは、$var 変数に 10 を代入して、GetType メソッドでデータ型を見てみましょう。データ型は INT 型ですね。

 

$var = 10
$var.GetType()

# 実行結果

IsPublic IsSerial Name BaseType 
-------- -------- ---- --------
True True <strong>Int32</strong> System.ValueType

 

 

 

続いて $var に 200 を代入してみます。 それで $var を見てみますと Object[] になっております。これが配列が格納できる状態、つまり配列の言う名のデータを格納する箱ができた状態になりました。配列が生成された状態がお分かり頂けたかと思います。

 

$var = $var = @(10,200) ← @() で囲みます。
$var.GetType()


# 実行結果

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True <strong>Object[]</strong> System.Array

 

 

 

スポンサーリンク

配列にデータを代入する

 

 

次に、$array に直接、複数の文字列を代入しました。上の宣言で言うと、@() の中にカンマ区切りでデータを入れています。

 

 

代入して変数を実行すると、配列に代入したデータが返ってきます。(こんな事はどうでもいいのですが、とりあえずアベンジャーズのメンバーを追加しました。笑)

 

$array = @("アイアンマン", "キャプテンアメリカ", "ソー", "ハルク", "ブラック・ウィドウ")
$array

# 実行結果

アイアンマン
キャプテンアメリカ
ソー
ハルク
ブラック・ウィドウ

 

 

 

という事で配列に複数のデータを代入しましたが、図にしてみると以下のようになります。アイアンマンがインデックス 0 に入り、キャプテンアメリカが 1 に入って… というイメージです。アパートで言えば、1 号室にキャプテンアメリカがいる感じですね。

 

 

 

 

スポンサーリンク

配列の中を見る

 

 

配列にデータを代入しましたが、この配列の中に何が入っているかを確認する事ができます。

 

 

では早速ですが配列の中にあるデータの数を見てみましょう。.Length メソッドを使います。データの箱が何個あるか確認する事ができるわけです。

 

C:\> $array.Length

# 実行結果
5

 

 

 

実行結果 5 人表示されましたので、ハルクを表示したい場合はインデックス番号を指定します。3 号室にはハルクがいるよって事です。変身後にはアパートなんかに入れる大きさじゃないでしょうけど(汗)まぁそのツッコミは勘弁してください。

 

$array[3]


# 実行結果
ハルク

 

 

 

それでは範囲指定をしてみましょう。インデックス番号の 1 から 3 番には誰がいるか見たい時は以下のように書きます。

 

$array[1..3]


# 実行結果

キャプテンアメリカ
ソー
ハルク

 

 

 

配列を結合したい場合

 

 

今度は、配列と配列をくっつけてみたいと思います。

 

 

とりあえず以下の配列を作ってみました。(アベンジャーズを追加したので今度はガーディアンズ・オブ・ギャラクシー:リミックスのメンバーを追加してみました。)

 

 

 

やり方としては、それぞれの配列を代入している変数を + で足して別の変数に代入するだけです。

 

$array_avengers = $array = @("アイアンマン", "キャプテンアメリカ", "ソー", "ハルク", "ブラック・ウィドウ")
$array_guardians = $array = @("ピーター・クイル", "ガモーラ", "ロケット", "ベビー・グルート", "ドラックス")

$array_total = $array_avengers + $array_guardians

$array_total


# 実行結果

アイアンマン
キャプテンアメリカ
ソー
ハルク
ブラック・ウィドウ
ピーター・クイル
ガモーラ
ロケット
ベビー・グルート
ドラックス

 

 

 

結合結果、変数に Length プロパティを追加して全員で何人いるか確認します。

 

array_total.Length


# 実行結果

10

 

 

 

スポンサーリンク

結合された配列にデータを追加する

 

 

今度は結合された配列に対して、別の方法でデータを個別で追加してみます。

 

 

まずは、この配列が固定サイズかどうか、確認します。IsFixedSize メソッドを使います。

 

 

$array_total.IsFixedSize


# 実行結果

True ← 配列が固定サイズになっている。

 

 

 

配列が固定サイズになっているとはどういう事でしょうか。試しに既存の配列にデータを追加してみたいと思います。

 

$array_total.Add("ドクター・ストレンジ")


# 実行結果

1個の引数を指定してAddを呼び出し中に例外が発生しました: "コレクションは固定サイズです。"
発生場所 行:1 文字:1
+ $array_total.Add("ドクター・ストレンジ")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NotSupportedException

 

 

 

追加できない事がわかりました。またエラーメッセージに “コレクションは固定サイズ” と表示されています。

 

 

つまり、@() で作成した配列の場合は固定長サイズである為に、上の方法で配列を結合して配列を作り直す事はできても、Add メソッドで引数にあるデータを配列に追加する事ができないという事になります。

 

 

この場合は、+= が使えますが、配列を再構成される事になりますので再構成される分、処理負担はかかります。よって大量のデータを扱う場合は使うべきか検討するほうがよいでしょう。

 

$array_avengers = $array = @("アイアンマン", "キャプテンアメリカ", "ソー", "ハルク", "ブラック・ウィドウ")
$array_guardians = $array = @("ピーター・クイル", "ガモーラ", "ロケット", "ベビー・グルート", "ドラックス")
$array_total = $array_avengers + $array_guardians

$array_total += ("キン肉マン")   ← += を使う
$array_total


# 実行結果

アイアンマン
キャプテンアメリカ
ソー
ハルク
ブラック・ウィドウ
ピーター・クイル
ガモーラ
ロケット
ベビー・グルート
ドラックス
キン肉マン

 

 

 

そこで配列を動的に作る場合は、ArrayList を使う事で可能になります。

 

 

ここでは、New-Object System.Collections.ArrayList でオブジェクトを新しく作成します。先ほどのアヴェンジャーズのアイアンマンを追加し、残りのメンバーを追加します。

 

 

この辺の詳しい情報については、以下のサイトで確認できます。(新しいタブで開きます。)

 

https://msdn.microsoft.com/ja-jp/library/system.collections.arraylist(v=vs.110).aspx | ArrayList クラス

 

 

$array_total = New-Object System.Collections.ArrayList
$array_total.Add("アイアンマン")


# 実行結果

$array_total
0
アイアンマン


$array_total.Add("キン肉マン")
1

$array_total


# 実行結果
アイアンマン
キン肉マン


$array_total.Add("Q太郎")
2

$array_total


# 実行結果
アイアンマン
キン肉マン
Q太郎

 

 

 

ということで、量が多くなってきたので、Array の特徴を少しまとめてみました。

 

得意な点 簡単に使える複数のオブジェクトを保管して使える。
不得意な点
  • 固定長である為に、配列に入れる要素を明確にしなければならない。

(後で追加する場合は、新しくオブジェクトを作成しArrayList を使わなければならない。)

  • 検索やソートが遅い。

 

 

Array の説明は以上になります。

 

 

 

スポンサーリンク

まとめ

 

 

以上になります。いかがでしょうか。配列の使い方は概要含め使い方について概ねお分かりいただければと思います。

 

 

今回は配列を扱いましたが、連想配列という方法もありますので、それは次回の記事として書こうと思います。

 

 

では最後までお読みいただきありがとうございました!