PowerShellスクリプトを書くときには、一連の項目を格納する方法が必要になることがよくあります。 これを実現する一般的な方法は、配列またはArrayListとして知られる特定の型を使用することです。 しかし、とにかく配列は何ですか? 配列は、アイテムのコレクションを格納するように設計されたデータ構造です。 こも同じ、異なる種類の項目です。
配列は多くの異なるプログラミング言語で使用されており、PowerShellも違いはありません。 配列を作成、操作、および最適化するには、多くの方法があります。, この記事を学びまArrayLists、配列やコレクションと最良の実践用に際してユー.
目次
前提条件/要件
PowerShell言語自体で作業するだけなので、環境の前提条件はありません。 PowerShellを搭載したWindows PCが必要です。 より具体的には:
- Windows PowerShell3以降
- .Net Framework4.5以降
このようなもっとヒントが欲しいですか?, 私の個人的なPowerShellブログをチェックしてください:https://nkasco.com/FriendsOfATA
PowerShellで配列を作成する
PowerShellで配列を作成するには、さまざまな方法があります。 以下に示すように、何らかの形で処理する必要がある名前のリストがあるとしましょう。
JohnSusieJimJohnnyCarrie
コンマ区切り要素による配列の構築
配列を作成する最も基本的な方法は、以下に示すように、既知の入力をコンマ区切りで変数に割り当てることです。,
$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"
PowerShellのすべてのオブジェクトで使用できるGetType()
メソッドを実行すると、BaseType
以下に示すプロパティで示されるように配列が正常に作成されていることがわかります。
PS51> $BasicArray.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object System.Array
サブ式演算子を使用して
サブ式演算子を使用してPowerShellで配列を作成することもできます。 この概念は、配列に追加されるアイテムの数がわからない場合によく使用されます。 結果はゼロ、または作成時に多くの項目を含めることができます。,
$MyArray
と呼ばれる配列の下に注意してください内部にゼロ要素が作成されています。
#Create an empty array with the sub-expression operatorPS51> $MyArray = @()PS51> $MyArray.count0
範囲演算子を使用する
配列は、上記のように文字列の格納に追いやられるだけではありません。 整数などの他のオブジェクト型で配列を作成することもできます。
整数の配列が順番に必要な場合は、ショートカットを使用してrange..
演算子を使用できます。 以下では、単一行のコードで2から5までの整数で配列が作成されていることがわかります。,
PS51> $NumberedArray = 2..5PS51> $NumberedArray2345
PowerShell ArrayListコレクションの作成
PowerShell ArrayListを使用することも、PowerShellで項目のリストを格納できる方法です。 ArrayListクラスはシステムの一部です。このタイプの新しいオブジェクトを作成することにより、ArrayList内にオブジェクトを格納できます。
以下では、New-Object
コマンドレットを使用するか、標準配列をArrayListオブジェクトにキャストすることによって、ArrayListオブジェクトを明示的に作成する必要があることがわかります。,
この場合、BaseType
はオブジェクトですが、上記の例ではObjectクラスからの継承を示す配列のベースタイプがあります。 最終的に、PowerShellは.NET型システムへのアクセスを提供しています。
配列へのアイテムの追加
配列を作成するときは、作成時にすべての要素を定義するか、アドホックに追加できます。
既存のコレクションに要素を追加するには、+=
演算子またはAdd
メソッドを使用できます。 ものがあることを知って主な違いをどのようお願いいたします。,
@()
で標準配列を作成するときは、+=
演算子を使用しますが、ArrayListに要素を追加するには、Add
メソッド。 これらのメソッドは、+=
演算子が実際に既存の配列を破棄し、新しいアイテムで新しい配列を作成する点で異なります。
実証するために、IsFixedSize
配列またはArrayListのプロパティを参照して、どちらが不変であり、どちらが不変でないかを知ることができます。
,
PS51> $BasicArray.IsFixedSizeTruePS51> $MyArrayList.IsFixedSizeFalse
基本配列は固定サイズのコレクションであるため、変更することはできません。
Add()
メソッドを固定サイズの配列で使用しようとすると、固定サイズのためにエラーが発生します。 以下に、配列にアイテムを正常に追加できるいくつかの例を示します。
#Does NOT work$BasicArray.Add("Nate")#Works$BasicArray += "Nate"$MyArrayList.Add("Nate")$MyArrayList += "Nate"
配列からのアイテムの削除
配列にアイテムを追加する方法をよりよく理解できたので、配列からアイテムを削除するいくつかの方法を取り上げましょう。,
基本的な配列は固定されているため、それらから項目を削除することはできません。 代わりに、まったく新しい配列を作成する必要があります。 たとえば、含める要素にのみ一致する条件文を作成することにより、配列から単一の要素を削除できます。 例を以下に示します。
$NewBasicArray = $BasicArray -ne "Nate"
ArrayListは固定されていないため、Remove()
メソッドを使用して要素を削除できます。 これは、アイテムを頻繁に追加/削除する予定がある場合、ArrayListを使用すると利益が得られるシナリオの一つです。,
$MyArrayList.Remove("Nate")
配列またはArrayListから特定の項目を取得する
配列またはArrayListから特定の項目を取得するには、さまざまな方法を使用できます。 PowerShellの他のオブジェクトと同様に、オブジェクトを呼び出すだけで配列のすべての要素にアクセスできます。
PS51> $BasicArrayJohnSusieJimJohnnyCarrie
おそらく、最初の要素のみを取得する必要がありますが、配列は常に配列の最初の要素を表す0の原点を持ちます。 配列の最初の要素を取得するには、次に示すように、インデックス番号を角かっこで指定します。,
PS51> $BasicArrayJohn
逆に、ダッシュ(負のインジケーター)を使用して配列から最後のX個の要素を呼び出すことによって、インデックスを後方に参照することもできます。 配列内の最後の要素を見つける一般的な方法は、以下に示すように-1
を使用することです。
PS51> $BasicArrayCarrie
上記で学んだ範囲演算子は、要素を呼び出すのと同じ方法に従って配列のオブジェクトを取得するためにも使用できます。 たとえば、$BasicArray
配列の最初の四つの名前を取得したいとしましょう。,
あなたはあなたが最初の四つの要素を返すインデックス0-3の範囲を指定することができます以下を見ることができます。
PS51> $BasicArrayJohnSusieJimJohnny
PowerShellで配列を最適化する
配列を作成および操作する方法の良い基盤ができたので、どれを使用する必要がありますか? それに答えるために、Measure-Command
コマンドレットを使用していくつかの例を見てみましょう。 Measure-Command
コマンドレットを使用すると、パイプラインに渡される要素の処理にコマンドがかかる時間をよりよく理解できます。,
一般的に言えば、オブジェクトのコレクションが小さい場合、配列の操作方法と大きな違いは気付かないでしょう。 ただし、オブジェクトのコレクションが大きい場合は、最適な結果を得るために違いを理解することが重要です。
前のセクションで学んだことを、+=
とAdd()
50,000個のアイテムのループを持つメソッドの使用の違いについて適用してみましょう。
まず、以下に示すように空の配列と空のArrayListを作成します。,
PS51> $MyArray = @()PS51> $MyArrayList = @()
次に、以下に示すように、range演算子とforeachループを使用して、各コレクションに50,000個の要素を設定します。
@(0..50000).foreach({$MyArray += $_})@(0..50000).foreach({$MyArrayList.Add($_)})
最後に、コマンドを式でラップし、その式をMeasure-Command
コマンドレットに渡します。 式をMeasure-Command
で実行すると、各プロセスが実際に実行するのにかかる時間を確認できます。
前に学んだように、
+=
実際には、固定された配列に追加するのではなく、新しい配列を作成することに注意してください。,
結果は? ほぼ60秒対139ミリ秒!
ご覧のとおり、固定サイズの配列を使用するのではなく、大規模なコレクションにArrayListを活用する方がはるかに高速です。
これは基本的な例ですが、処理中にコードが何をしているのかを理解することの重要性を強調しています。 ない場合は正しく理解できの悪いユーザー体験です。,
配列ではなくArrayListを使用することで利益を得ることができる既存のスクリプトがある場合、これは一晩改善を行う素晴らしい
さらに読む
- PowerShellとの配列の比較
- PowerShell(MCPmag)でパフォーマンスのための配列を作成する方法
このようなヒントが欲しいですか? 私の個人的なPowerShellブログをチェックしてください:https://nkasco.com/FriendsOfATA。