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

PowerShell

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

2018年5月29日

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

 

 

 

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

 

 

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

 

 

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

 

 

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

 

 

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

 

 

 

では早速始めましょう。

 

 

 

配列とは

 

 

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

 

 

 

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

 

 

 

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

 

 

 

インデックス番号は 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 の説明は以上になります。

 

 

 

まとめ

 

 

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

 

 

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

 

 

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

 

 

  • この記事を書いた人

そーまん

セキュリティエンジニアやってます。
ブログ歴3年。PVは月15万PV程度。
趣味はボクシング、筋トレ、登山です。
穏やかで人見知りでマイペースな人です。

人気記事

1

こんにちは!SE ブログの相馬です。       今回は、PC に適用されている GPO を確認する方法について書きました。     グループポリシー ...

2

こんにちは!SE ブログの相馬です。       今回は sysprep について、全体的に PC をセットアップする観点から書いてみました。長々と書いてあります。まずは ...

3

こんにちは!SE ブログの相馬です。       今回は、グループポリシーを使って、特定のコンピューターに対して、ドメインユーザーに Administrators 権限を ...

4

こんにちは!SE ブログの相馬です。       今回は、Windows サインイン後に一時ユーザープロファイルが読み込まれてしまった場合の解決方法について書きました。 ...

5

こんにちは!SEブログの相馬です。       今回は、ユーザープロファイルを削除する方法について書いてみました。     1 台の PC を複数人で ...

6

こんにちは!SE ブログの相馬です。       今回は、繰り返し文について書いてみました。PowerShell では他のプログラミング言語同様、繰り返し処理を行うことが ...

7

コマンドを使って CPU とメモリの使用率をデータで取得してみましたので、例えば PC のトラブルシューティングで問題を再現させる際にデータを取得しておくと、原因の特定に役立つ場合があるかと思います。

8

既存の PC と同じ構成で別のメーカーの PC でマスターイメージを作る際、インストールされているアプリを同一にする為に必要になるかと思います。

9

企業で多くの GPO が適用されている環境では、PC に GPO が適用されなかったりする問題が発生する場合があるかと思います。その中でも、コンピューターの構成またはユーザーの構成のどちらかで、...

10

こんにちは!SE ブログの相馬です。       今回は、Windows Server 2016 で NTP サーバーと同期する方法について書きました。   & ...

-PowerShell
-