PowerShellの配列とは?基本的な使い方と各種の操作を解説

基本情報技術者試験の試験対策はこちら>>

PowerShellの配列とは?


配列とは、数値や文字列、オブジェクトなどの要素となるものを、いくつかひとまとめにして順序付けて管理する為のデータ構造です。英語ではArrayと呼ばれ、どのプログラミング言語にも備わっています。PowerShellはプログラミング言語ではありませんが、同じように配列が扱えます。PowerShellの配列は難しいものではありませんが、使いこなせればPowerShellの操作が格段に便利になります。データをまとめて管理する構造として連想配列(ハッシュテーブル)もPowerShellには存在しますが、この記事では連想配列は扱いません。以降では配列(Array)の基本的な扱い方や便利な操作を説明します。

配列の初期化と宣言


PowerShellでは、配列の宣言と初期化は基本的に同時に行います。PowerShellで配列を利用したいときは、まずは変数名に配列の要素を代入し初期化します。例えば、変数$arrayに整数値0,1,2,3を要素に持つ配列を代入すると以下のようになります。

 

要素はカンマ(,)で列挙することで、配列として代入できます。また、PowerShellは代入されたデータに対して適切なデータ型を与えてくれる為、入力者はデータ型を気にすることなく操作できます。その為、整数値以外にも文字列やその他オブジェクトが代入可能です。このように連続する整数値を要素とする配列を作成する場合には、以下の演算子も利用できます。

 

範囲演算子(range operator)..を使用することで、簡単に連続した数値を持つ配列の作成が可能です。上記では複数の要素を持つ配列を例に挙げました。続いて要素を持たないサイズ0の配列を作成する方法をご紹介します。この場合は配列の初期化に、配列部分式(array sub-expression)を使用します。

 

@( )を使用すると、$arrayは要素を持たない空の配列となります。コマンドの実行結果がいくつ返されるかがわからなくても、その全てを配列としてセットしたい場合などには@(コマンド)を使用します。

配列の基本的な操作


PowerShellでは、初期化した配列を変数にセットすることで、この配列を操作できるようになります。まずはPowerShellの配列に対する基本的な操作として、要素の「参照」と「変更」「追加」「結合」を確認していきましょう。例として、0から9の整数値が格納された「$array = 0..9」と初期化した配列を用います。

参照・変更

配列内の要素を参照したい時、配列名に[]を用いて参照対象の要素を指定します。

 

要素の位置、インデックスは常に0から始まる為、上記の場合は配列の先頭要素である整数値「0」を参照します。また、このインデックスは変数での指定も可能です。例えば、$i = 3という変数を用意した時に、$array[$i]とすれば、$array[3]と同様になります。つまり、$array配列の先頭から4番目に格納された整数値「3」を参照します。また、参照したインデックスに対し「=」で値をセットすることで、対象の要素が変更できます。

 

これで$array[0]は整数値0から100へと書き換えられました。

末尾からx番目を参照する

インデックスを負数にすると、末尾からの参照となります。例えば、リスト最後の項目を参照したい場合はインデックスに[-1]を指定します。つまり、末尾からx番目を参照したい時は以下のコードとなります。

要素の追加

配列に要素を追加したい時は「+=演算子」を使用します。これによって、既存の配列の末尾に、+=で指定された値の要素が追加されます。

 

ただし、PowerShellは初期化済みの配列のサイズ変更ができません。つまり、この作業は元の配列の要素と追加した要素を持つ配列を、新しく作成しています。元の配列の要素を再作成する為、要素の数が何万と言った巨大な配列に要素の追加をする場合は、処理時間に影響を与える要因となります。

結合

加算演算子「+」を利用することで、配列と配列を結合できます。

 

これで$array_testは、$arrayと$array_subの結合された配列となります。ただし、これも+=と同様に、元々の配列とは別に結合された配列を新たに作成します。その為、結合される配列が巨大なものであればあるほど、処理が重くなる要因となることに注意が必要です。

可変サイズの配列はArrayList

固定サイズの配列では処理が困る場合、可変サイズのオブジェクトを作成する方法があります。

 

これで作成された変数$array_listの配列へは、「+=」または「Add()」メソッドを利用して要素が追加できます。

配列の各要素の処理


配列の用途は、いくつかの要素を順序付けて管理することです。ただまとめて置くだけでは意味がありません。各要素に順序よくアクセスして、それぞれの要素を活用する必要があります。配列の各要素を順番に処理する為に、PowerShellにはいくつかの方法があります。以下ではその方法の説明をします。

forとforeach

forは配列の各要素に対し[ ]を使った添え字を用いてアクセスする方法です。

 

for (初期値の設定; 反復条件; 反復ごとに変化させる処理) { 反復ごとの処理 }というように書きます。上記の場合は初期値として$iに0をセットし、繰り返す条件として$iが10未満の場合、と指定しています。-ltはLess Thanで、~よりも小さい場合、という表記です。そして処理を繰り返すごとに$i++として$iを1ずつ増加させています。これにより反復ごとに$iは0から9まで変化していき、配列$arrayの各要素に順番にアクセスして処理を実行できます。反復ごとに変化させる処理は決して1ずつ値を増やさなければならないわけではありません。$i += 2とすれば$iは0,2,4,…と2ずつ増えていき、配列の要素に1つ飛ばしでアクセスすることができます。配列の要素を順番に処理する方法にはforeachもあります。

 

forと違い、foreachは添え字を使いません。$elem in $arrayと書くように、反復ごとに配列の各要素を先頭から順に変数にセットしてアクセスします。上記では$elemという変数名にしていますが、要素をセットする変数名は任意の名前で構いません。配列の先頭から末尾の要素まで順に処理する場合にはforeachの方がより簡潔です。

ForEach-Object

要素ごとの処理を実現するものとして最後にもう1つ紹介します。ForEach-Objectコマンドです。ForEach-Objectは配列のようなコレクションを入力として受け取り、そのコレクションの各要素に対してスクリプトブロックで記述した処理を行うものです。このコマンドは別のコマンドの実行結果を処理する場合に非常に便利です。

 

記号%はForEach-Objectコマンドレットのエイリアスです。短くタイプしやすいようにデフォルトで設定されています。もちろんForEach-Object { 処理 }のように書いても構いません。上記のコマンドはまず、Get-Alias -Name t*を実行しています。結果は複数あるので配列となります。そしてその配列をパイプライン|でForEach-Objectの入力としています。ForEach-Objectのスクリプトブロックでは$_は現在処理中の要素を指す変数となっています。Get-Aliasコマンドの結果の要素はAliasInfoオブジェクトですので、上記を実行すると”t”から始まるエイリアスのAliasInfoオブジェクトを順番に処理し、そのNameプロパティの値が表示されます。

配列に関するその他の操作


最後に、配列それ自体のプロパティや、配列をより便利に扱う演算子をいくつか紹介します。様々なシーンで組み合わせて使うことにより、わかりやすく簡潔な処理を記述することができるでしょう。

配列のプロパティとメソッド

配列それ自体もオブジェクトです。プロパティやメソッドを備えており、配列の情報の取得や配列の操作に役立ちます。

Lengthプロパティ

配列のサイズ(長さ)を取得します。

 

または

 

CountはLengthのエイリアスです。どちらもまったく同じ動作をします。

Clearメソッド

Clearメソッドは配列内のすべての要素をその配列の型のデフォルト値に置き換えます。

 

注意してほしいのが、配列のサイズを0にして空の配列にするものではない、という点です。$array = 0..2のように何も指定せず配列を初期化した場合、配列の型はSystem.Object[]になります。格納できる要素はObject型ですので、そのデフォルト値はnullです。$array.Clear()を実行すると、すべての要素がnullのサイズ3の配列になります。一方、[int32[]]$array = 0..2のように配列を整数値の配列と明示して初期化した場合は、デフォルト値は0になります。この場合は$array.Clear()を実行すると、すべての要素が0のサイズ3の配列になります。

ForEachメソッド

配列内の各要素に対して処理を適用できます。もっとも簡単な使い方では、foreachやForEach-Objectとあまり変わりはありません。

 

ForEachメソッドは引数にスクリプトブロックを指定できます。上記の例では、配列$arrayの各要素に1を足したものを表示します。しかし、ForEachメソッドは他の引数を指定できる様々なオーバーロードが存在し、処理を記述することなく配列の要素を処理することができます。例えば、引数にメソッド名を指定するオーバーロードです。

 

これを実行すると、配列の各要素に要素のTrim()メソッドが実行され、前後の空白が除去されて表示されます。他にも、要素の型をキャストするオーバーロードや要素のプロパティに値をセットするオーバーロードなどがあります。

Containsメソッド

Containsメソッドは、配列内に指定した値が存在するかを確認できます。引数として検索したい値を与えます。配列に引数の値が含まれればTrueを、含まれなければFalseが返ります。

 

文字列の場合大文字と小文字は区別されることに注意してください。

演算子での操作

PowerShellは、スクリプト言語でありながらプログラミング言語のように様々な演算子を利用できます。算術演算子や代入演算子など多くのプログラミング言語と同様の演算子もあれば、あるプログラミング言語では関数として存在するものがPowerShellでは演算子として便利に利用できる場合もあります。

Split

-Split演算子は既存の文字列から新たに配列を作成するのに役立ちます。例えば”Dog Cat Frog”というような単語がスペースで区切られた文字列があり、その各単語を要素とする配列を作成するとします。それには-Splitを使い以下のようにします。

 

これで、$arrayは”Dog”Cat”Frog”の文字列からなるサイズ3の配列となります。区切り文字であるスペースは配列の要素には含まれません。区切り文字はスペース以外も指定できます。カンマ,区切りの文字列の場合は以下のようにします。

 

分解したい文字列 -Split 区切り文字のように書くことで任意の文字を区切り文字として指定できます。

Join

-Join演算子は配列の各要素を結合して一つの文字列を作ります。-Split演算子とは逆のことをするのが-Joinです。

 

上記の場合は$sentenceは”PowerShelliscool.”という文字列になります。各要素は区切り文字なくそのまま結合されます。区切り文字を指定する場合は以下のようにします。

 

これで、”PowerShell is cool.”というようにスペースが間に挿入されます。結合時に区切り文字を指定する場合は、文字列の配列 -Join 区切り文字と記述してください。

配列を覚えてPowerShellをより便利に使おう


PowerShellにおける配列の初期化、要素へのアクセス方法、反復(イテレーション)方法、その他の操作について説明してきました。上記で説明した以外にも多くの配列を扱う方法があります。配列は基本的なデータ構造であり、かつ重要なものです。PowerShellのコマンドの多くが実行結果を配列として返します。例えば、現在OS上に存在しているプロセスを取得するGet-Processコマンドも結果が複数ある場合にはそれらをProcessオブジェクトの配列として返します。コンピュータシステムを管理する上ではプロセスの管理も必要になります。PowerShellを用いれば、プロセスの情報を素早く配列として入手でき、要素である各プロセスに対して処理を実行できるのです。その為には配列の知識は欠かせません。配列の操作を覚えれば、よりPowerShellが楽しく、便利になることでしょう。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。