よくPowerShellスクリプトを書く際には、アイテムのセットを保存する方法が必要です。これを実現する一般的な方法の1つは、配列またはArrayListと呼ばれる特定のタイプを使用することです。しかし、配列とは何でしょうか?配列は、アイテムのコレクションを保存するために設計されたデータ構造です。これには、同じ型と異なる型のアイテムの両方が含まれることができます。
配列は、さまざまなプログラミング言語で使用されており、PowerShellも例外ではありません。配列を作成、操作、最適化するためのさまざまな方法があります。この記事では、ArrayList、配列、コレクションについて学び、それらをPowerShellで適用する際のベストプラクティスについても紹介します。
前提条件/要件
PowerShell言語自体との作業に関しては、環境の前提条件はありません。PowerShellが実行されているWindows PCがあれば十分です。具体的には、
- Windows PowerShell 3以降
- .NET Framework 4.5以降
このようなヒントがもっと欲しいですか?私の個人的なPowerShellブログをチェックしてみてください:https://nkasco.com/FriendsOfATA
PowerShellでの配列の作成
PowerShellで配列を作成する方法はさまざまです。以下に示すような処理する必要がある名前のリストがあると想定してみましょう。
コンマで区切られた要素を使用して配列を構築する
配列を作成する最も基本的な方法は、下記のように既知の入力をコンマで区切って変数に割り当てることです。
PowerShellのすべてのオブジェクトで使用できるGetType()
メソッドを実行すると、以下のBaseType
プロパティによって、正常に配列が作成されたことがわかります。
サブ式演算子を使用する
サブ式演算子を使用してPowerShellで配列を作成することもできます。この概念は、配列に追加されるアイテムの数を事前に知らない場合によく使用されます。結果は、作成時に0個または複数のアイテムを含む場合があります。
以下に、要素がゼロ個の$MyArray
という名前の配列が作成されていることがわかります。
範囲演算子を使用する
上記の例のように、配列は文字列の保存に限られません。整数などの他のオブジェクト型でも配列を作成することができます。
連続した整数の配列が必要な場合は、範囲演算子..
を使用してショートカットを取ることもできます。以下のコードでは、1行で整数2から5までの配列が作成されていることがわかります。
PowerShell ArrayListコレクションの作成
PowerShell ArrayListを使用すると、アイテムのリストをPowerShellで保存することもできます。ArrayListクラスは.NETのSystem.Collections名前空間の一部です。このタイプの新しいオブジェクトを作成することで、ArrayList内にオブジェクトを保存できます。
以下の例では、New-Object
コマンドレットを使用するか、標準配列をArrayListオブジェクトにキャストすることで、明示的にArrayListオブジェクトを作成する必要があることがわかります。
この場合、BaseType
はオブジェクトであり、一方、上記の例ではBaseTypeは配列であり、Objectクラスからの継承を示しています。最終的に、PowerShellは.NETの型システムへのアクセスを提供しています。
配列への要素の追加
配列を作成する際、要素をすべて定義するか、アドホックに追加することができます。
既存のコレクションに要素を追加するには、+=
演算子またはAdd
メソッドを使用できます。ただし、それらの動作には大きな違いがあることを知っておいてください。
@()
を使用して標準の配列を作成する場合、+=
演算子を使用しますが、ArrayListに要素を追加する場合はAdd
メソッドを使用します。これらの方法の違いは、+=
演算子が実際には既存の配列を破壊し、新しいアイテムを持つ新しい配列を作成する点にあります。
以下の例では、配列またはArrayListのIsFixedSize
プロパティを参照して、イミュータブルなものとそうでないものを判断できます。
基本的な配列は固定サイズのコレクションであるため、変更することはできません。
Add()
メソッドを固定サイズの配列で使用すると、固定サイズのためエラーが発生します。以下では、配列に項目を追加する方法のいくつかの例を示します。
配列から項目を削除する方法
配列に項目を追加する方法がわかったので、配列から項目を削除する方法についても説明します。
基本的な配列は固定されているため、項目を削除することはできません。代わりに、完全に新しい配列を作成する必要があります。たとえば、含めたい要素のみに一致する条件文を作成して、配列から単一の要素を削除することができます。以下に例を示します。
ArrayListは固定されていないため、Remove()
メソッドを使用して要素を削除することができます。頻繁に項目を追加/削除する予定がある場合、ArrayListを使用すると便利な場合があります。
配列またはArrayListから特定の項目を取得する方法
配列またはArrayListから特定の項目を取得するには、さまざまな方法があります。PowerShellの他のオブジェクトと同様に、オブジェクトを呼び出すだけで配列のすべての要素にアクセスできます。
たとえば、最初の要素のみを取得する場合、配列の最初の要素を表す0の起点を持っています。以下に示すように、インデックス番号を角かっこで指定して、配列の最初の要素を取得します。
逆に、配列から最後のX個の要素を呼び出すためにハイフン(マイナス指示子)を使用してインデックスを逆に参照することもできます。配列の最後の要素を見つける一般的な方法は、以下に示すように-1
を使用することです。
前述の範囲演算子は、要素の呼び出し方法と同じ方法で配列のオブジェクトを取得するためにも使用することができます。たとえば、$BasicArray
配列から最初の4つの名前を取得したいとします。
以下のように、0から3の範囲のインデックスを指定すると、最初の4つの要素が返されます。
PowerShellで配列を最適化する
配列の作成と操作方法についての基礎ができたので、どれを使用するべきでしょうか?その答えを見つけるために、Measure-Command
コマンドレットのいくつかの例を実行してみましょう。 Measure-Command
コマンドレットを使用することで、コマンドが要素を処理する際にかかる時間をよりよく理解することができます。
一般的に言って、小さなオブジェクトのコレクションを持っている場合、配列の操作方法にはあまり違いを感じないでしょう。ただし、大きなオブジェクトのコレクションを持っている場合は、最適な結果を得るために違いを理解することが重要です。
さきほど学んだ+=
とAdd()
メソッドの違いを、50,000個のアイテムを含むループで適用してみましょう。
最初に、以下のように空の配列と空のArrayListを作成します。
次に、範囲演算子とforeachループを使用して、各コレクションに50,000の要素を追加します。
最後に、コマンドを式でラップし、その式をMeasure-Command
コマンドレットに渡します。 Measure-Command
を使用して式を実行することで、各プロセスの実行にかかる時間を確認できます。
前に学んだように、
+=
は実際には固定された配列に追加するのではなく、新しい配列を作成します。
結果は?約60秒対139 ミリ秒です!
大規模なコレクションでは、固定サイズの配列の代わりにArrayListを活用する方がはるかに高速です。
これは基本的な例ですが、処理中にコードが何を行っているかを理解することの重要性を強調しています。適切に理解されていない場合、ユーザーエクスペリエンスが低下する可能性があります。
ArrayListではなく配列を使用することで利益を得ることができる既存のスクリプトがある場合、これは一晩での改善の絶好の機会となります!
さらなる読み物
このようなヒントをもっと知りたいですか?私の個人的なPowerShellブログをチェックしてください:https://nkasco.com/FriendsOfATA。