• 10/08/2020
  • 24分読む
    • j
    • h
    • s
    • v

配列は、ほとんどのプログラミング言語の基本的な言語機能です。 それらは、避けるのが難しい値またはオブジェクトのコレクションです。 それでは、配列と提供するすべてのものをよく見てみましょう。,

Note

この記事のオリジナルバージョンは、@KevinMarquetteによって書かれたブログに掲載されました。 ThePowerShellのチームは私達とこの内容を共有するためのケビンに感謝します。 彼のブログをご覧くださいatPowerShellExplained.com.

配列とは何ですか?

私は、PowerShellがそれらを利用する他の方法に移行する前に、配列とは何か、それらがどのように使用されているかについての基本的な技術的説明から始めるつもりですほとんどのプログラミング言語。

配列は、複数のアイテムのコレクションとして機能するデータ構造です。, 配列を反復したり、インデックスを使用して個々の項目にアクセスしたりできます。 配列は、各値が他の値のすぐ隣に格納されているメモリの連続したチャンクとして作成されます。

私たちが行くように私はそれらの詳細のそれぞれに触れます。

基本的な使い方

配列はPowerShellの基本的な機能であるため、PowerShellでそれらを操作するための簡単な構文があります。,

配列を作成する

空の配列は、@()

PS> $data = @()PS> $data.count0

配列を作成し、@()かっこに配置するだけで値をシードできます。

PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree

この配列には4つの項目があります。 $data変数を呼び出すと、アイテムのリストが表示されます。 それが文字列の配列であれば、文字列ごとに一行を取得します。

複数の行で配列を宣言できます。 この場合はコンマは省略可能で、通常は左出力です。,

$data = @( 'Zero' 'One' 'Two' 'Three')

私はそのような複数行で自分の配列を宣言することを好みます。 複数の項目を持っているときに読みやすくなるだけでなく、sourcecontrolを使用するときに以前のバージョンと比較しやすくなります。

その他の構文

一般的に理解されている@()配列を作成するための構文ですが、ほとんどの場合、コンマ区切りのリスト,

$data = 'Zero','One','Two','Three'

配列を作成するための書き込み出力

言及する価値のあるクールな小さなトリックは、Write-Outputコンソールで文字列をすばやく

$data = Write-Output Zero One Two Three

これは、パラメータが文字列を受け入れるときに文字列を引用符で囲む必要がないため便利です。 こいこのスクリプトで公正なゲームのソフトである。

アイテムへのアクセス

アイテムが含まれる配列ができたので、それらのアイテムにアクセスして更新することができます。,

Offset

個々のアイテムにアクセスするには、0から始まるオフセット値を持つ角かっこを使用します。 これは配列の最初の項目を取得します。

PS> $data = 'Zero','One','Two','Three'PS> $dataZero

ここでゼロを使用する理由は、最初の項目がリストの先頭にあるため、0項目のオフセットを使用してそれに到達するためです。 第二の項目に到達するには、最初の項目に1のオフセットを使用する必要があります。

PS> $dataOne

これは、最後の項目がオフセット3にあることを意味します。,

PS> $dataThree

Index

これで、この例で行った値を選択した理由がわかります。 私はこれをオフセットとして導入しましたそれはそれが本当に何であるかですが、このオフセットはより一般的にインデックスと呼ばれます。 0で始まるAnindex。 この記事の残りの部分では、オフセットをインデックスと呼びます。

Special index tricks

ほとんどの言語では、インデックスとして単一の番号しか指定できず、単一のアイテムを取得できません。PowerShellははるかに柔軟性があります。 複数のインデックスを一度に使用できます。, のリストを提供することにより、索引、いくつかの項目を選択できます。

PS> $dataZeroTwoThree

アイテムは、指定されたインデックスの順序に基づいて返されます。 インデックスを複製すると、そのアイテムが両方の時間取得されます。

PS> $dataThreeZeroThree

組み込みの..演算子で数値のシーケンスを指定できます。

PS> $dataOneTwoThree

これは逆にも機能します。

PS> $dataThreeTwoOne

最後からオフセットするには、負のインデックス値を使用できます。 したがって、リストの最後の項目が必要な場合は、-1を使用できます。,

PS> $dataThree

Out of bounds

ほとんどの言語では、配列の終わりを過ぎた項目のインデックスにアクセスしようとすると、何らかのタイプのエラーまたは PowerShellは静かに何も返しません。

PS> $null -eq $dataTrue

null配列にインデックスを付けることはできません

変数が$null配列のようにインデックスを付けようとすると、System.Management.Automation.RuntimeExceptionメッセージCannot index into a null arrayという例外が発生します。,

PS> $empty = $nullSP> $emptyError: Cannot index into a null array.

したがって、配列が$null内部の要素にアクセスしようとする前に、配列が$nullでないことを確認してください。

Count

配列やその他のコレクションには、配列内のアイテムの数を示すcountプロパティがあります。

PS> $data.count4

PowerShell3.0では、ほとんどのオブジェクトにcountプロパティが追加されました。 単一のオブジェクトを持つことができ、1のカウントを与える必要があります。

PS> $date = Get-DatePS> $date.count1

Even$nullには、0を返す以外はcountプロパティがあります。,

PS> $null.count0

ここには、$nullまたは空のarrayslaterのチェックをカバーするときに再訪するトラップがいくつかあります。

オフバイワンエラー

配列はインデックス0から始まるため、一般的なプログラミングエラーが作成されます。 オフバイワンエラーは、二つの方法で導入されます。

最初は精神的にあなたが第二の項目をしたいと思うと2のインデックスを使用して、本当に第三の項目を取得することです。 ようつの項目したいと考えていました最後の項目を使用しますのでcounttoアクセスの最後の項目です。,

$data

PowerShellは、それを実行して、インデックス4に存在するアイテムを正確に提供できることを完全に満足しています。$null。 あなたが使用する必要があります$data.count - 1または-1上記について学んだこと。

PS> $dataThree

これは、-1インデックスを使用して最後の要素を取得できる場所です。

PS> $dataThree

Lee Daileyはまた、$data.GetUpperBound(0)最大インデックス番号を取得することができることを私に指摘しました。,

PS> $data.GetUpperBound(0)3PS> $dataThree

第二の最も一般的な方法は、リストを反復処理し、適切なタイミングで停止しないときです。 私たちはforループの使用について話すとき、私はこれを訪問します。

アイテムの更新

同じインデックスを使用して、配列内の既存のアイテムを更新できます。 これにより、個々のアイテムに直接アクセスできます。

$data = 'dos'$data = 'tres'

最後の要素を過ぎたアイテムを更新しようとすると、Index was outside the bounds of the array.エラーが発生します。

後で配列を大きくする方法について話すときに、これを再訪します。,

反復

ある時点で、リスト全体をウォークまたは反復処理し、配列内の各アクションを実行する必要があるかもしれません。

パイプライン

配列とPowerShellパイプラインはお互いのためのものです。 これは、これらの値を処理する最も簡単な方法の一つです。 配列をパイプラインに渡すと、配列内の各項目が個別に処理されます。

PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item: 

$PSItem前に見たことがない場合は、$_と同じことを知ってください。, どちらもパイプライン内の現在のオブジェクトを表すため、eitheroneを使用できます。

ForEachループ

ForEachループはコレクションでうまく機能します。 構文を使用して:foreach ( <variable> in <collection> )

foreach ( $node in $data ){ "Item: "}

ForEachメソッド

私はこれを忘れる傾向がありますが、単純な操作ではうまくいきます。 PowerShellでは、コレクションに.ForEach()を呼び出すことができます。

PS> $data.foreach({"Item "})Item Item Item Item 

.foreach()スクリプトブロックであるパラメータを取ります。, 括弧を削除してスクリプトブロックを提供することができます。

$data.foreach{"Item "}

これはあまり知られていない構文ですが、同じように動作します。 このforeachメソッドは、powershell4.0で追加されました。

for loop

forループは他のほとんどの言語で頻繁に使用されていますが、PowerShellではあまり見られません。 あなたがそれを見るとき、それは配列を歩くという文脈にあることがよくあります。

for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}

最初に行うことは、$index0に初期化することです。, 次に、$index$data.countより小さくなければならないという条件を追加します。 最後に、ループするたびにインデックスを1増やす必要があることを指定します。 この場合、$index++$index = $index + 1の略です。

forループを使用しているときはいつでも、条件に特に注意してください。 ここで$index -lt $data.countを使用しました。 あなたのロジックでoff-by-oneerrorを取得するには、条件を少し間違って取得するのは簡単です。, 使用$index -le $data.countまたは$index -lt ($data.count - 1)これまでsoslightly間違っています。 それはあなたの結果が多すぎるか少なすぎる項目を処理する原因になります。 これはオフ-バイ-ワン-エラーである。

スイッチループ

これは見落としやすいものです。 Switchステートメントに配列を指定すると、配列内の各項目がチェックされます。

$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}

TickTockTickTock

switchステートメントでできるクールなことがたくさんあります。 私はこれに別のarticlededicatedを持っています。,

  • switchステートメントについて知りたかったことすべて

値の更新

配列が文字列または整数(値型)のコレクションである場合、配列内の値をループ 上記のループのほとんどは、値のコピーを保持するループで変数を使用します。 その変数を更新すると、配列内の元の値は更新されません。

その文の例外はforループです。, 配列を歩いて値を更新したい場合その中で、forループはあなたが探しているものです。

for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}

この例では、インデックスごとに値を取得し、いくつかの変更を行い、その同じインデックスを使用して割り当てを戻します。

オブジェクトの配列

これまでのところ、配列に配置したのは値型だけですが、配列にはcontainobjectsもあります。

$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})

多くのコマンドレットは、変数に割り当てるときにオブジェクトのコレクションを配列として返します。,

$processList = Get-Process

すでに説明した基本的な機能はすべて、指摘する価値のある数個のデテールを持つオブジェクトの配列に適用されます。

プロパティへのアクセス

値型と同じように、インデックスを使用してコレクション内の個々の項目にアクセスできます。

PS> $dataFirstName LastName----- ----Kevin Marquette

プロパティに直接アクセスして更新することができます。,

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette

配列プロパティ

通常、すべてのプロパティにアクセスするには、次のようにリスト全体を列挙する必要があります。

PS> $data | ForEach-Object {$_.LastName}MarquetteDoe

またはSelect-Object -ExpandPropertyコマンドレットを使用します。

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

しかし、PowerShellはLastName直接リクエストする機能を提供します。 PowerShellは、私たちのためにそれらを列挙し、きれいなリストを返します。

PS> $data.LastNameMarquetteDoe

列挙はまだ起こりますが、その背後にある複雑さはわかりません。,

Where-Object filtering

これは、Where-Objectが入る場所ですので、オブジェクトのプロパティに基づいて配列から必要なものをフィルタリングして選

PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette

同じクエリを記述して、FirstName探しています。

$data | Where FirstName -eq Kevin

Where()

配列にはWhere()メソッドがあり、フィルターにscriptblockを指定できます。

$data.Where({$_.FirstName -eq 'Kevin'})

この機能はPowerShell4.0で追加されました。,

ループ内のオブジェクトの更新

値型では、配列を更新する唯一の方法は、値を置き換えるためにindexを知る必要があるため、forループを使用するこ てのオプションオブジェクトが参照す。 簡単な例は次のとおりです。

foreach($person in $data){ $person.FirstName = 'Kevin'}

このループは、$data配列のすべてのオブジェクトを歩いています。 オブジェクトは参照型であるため、$person変数は、配列内にあるオブジェクトとまったく同じオブジェクトを参照します。 したがって、その更新プロパティは元のものを更新します。,

この方法ではオブジェクト全体を置き換えることはできません。 新しいオブジェクトを$person変数に割り当てようとすると、変数参照を配列内の元のオブジェクトを指さなくなった別のものに更新 これはあなたが期待するように動作しません:

foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}

演算子

PowerShellの演算子は配列でも動作します。 その作品は若干異なる。

-join

-join演算子は最も明白なものですので、最初に見てみましょう。, 私は-join演算子が好きで、頻繁に使用します。 配列内のすべての要素を、あなたが指定した文字または文字列で結合します。

PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4

私が好きな機能の一つ-join演算子は、単一のアイテムを処理することです。

PS> 1 -join '-'1

これをロギングと冗長メッセージの中で使用します。

PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.

-join$array

これはLee Daileyが私に指摘した巧妙なトリックです。, 区切り文字なしですべてを結合したい場合は、これを行う代わりに:

PS> $data = @(1,2,3,4)PS> $data -join $null1234

-join配列をプレフィックスなしのパラメータとして使用できます。 この例を見てみましょう私が話していることを参照してください。

PS> $data = @(1,2,3,4)PS> -join $data1234

-replaceおよび-split

-replaceおよび-split配列内の各項目で実行されます。 私は今までこのようにそれらを使用したことがあるとは言えませんが、ここに例があります。,

PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03

-contains

-contains演算子を使用すると、値の配列をチェックして、指定された値が含まれているかどうかを確認できます。

PS> $data = @('red','green','blue')PS> $data -contains 'green'True

-in

複数の値のいずれかと一致することを確認したい単一の値がある場合は、-in演算子を使用できます。 値は左側にあり、配列は右側にありますオペレータ。

PS> $data = @('red','green','blue')PS> 'green' -in $dataTrue

リストが大きい場合、これは高価になる可能性があります。 いくつかの値より多くをチェックしている場合、正規表現パターンをよく使用します。,

PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue

-eqと-ne

等価性と配列は複雑になる可能性があります。 配列が左側にある場合、すべての項目が比較されます。 Trueを返す代わりに、一致するオブジェクトを返します。

PS> $data = @('red','green','blue')PS> $data -eq 'green'green

-ne演算子を使用すると、値と等しくないすべての値が取得されます。

PS> $data = @('red','green','blue')PS> $data -ne 'green'redblue

これをif()ステートメントで使用すると、返される値はTrue値になります。, 値が返されない場合、それはFalse値です。 これらのnextステートメントはどちらもTrue評価されます。

$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}

$nullのテストについて話すときに、これを再訪します。

-match

-match演算子は、コレクション内の各アイテムの一致を試みます。

PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01

-matchを単一の値で使用すると、特別な変数$Matchesにmatchinfoが設定されます。, 配列がこのように処理される場合、これは当てはまりません。

Select-Stringでも同じアプローチを取ることができます。

$servers | Select-String SQL

私は詳しく見てみますSelect-String-matchそして$matches正規表現を使用する多くの方法。

$nullまたは空

$nullまたは空の配列のテストは難しい場合があります。 配列を持つ一般的なトラップは次のとおりです。

一見すると、このステートメントは動作するはずです。,

if ( $array -eq $null){ 'Array is $null'}

しかし、私はちょうど-eq配列内の各項目をチェックする方法を調べました。 したがって、単一の$null値を持ついくつかのアイテムの配列を持つことができ、それは評価されます$true

$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}

これが、$null演算子の左側に配置することがベストプラクティスである理由です。 これにより、このシナリオは非問題になります。

if ( $null -eq $array ){ 'Array actually is $null'}

a$null配列は空の配列と同じものではありません。 配列があることがわかっている場合は、その中のオブジェクトの数。, 配列が$nullの場合、カウントは0です。

if ( $array.count -gt 0 ){ "Array isn't empty"}

ここにはもう一つ気をつけるべき罠があります。 あなたが使用することができますcountそのオブジェクトがPSCustomObjectでない限り、singleobjectを持っていても。 これはPowerShell6.1で修正されたバグです。それは良いニュースですが、多くの人がまだ5.1にいて、それに気をつける必要があります。

PS> $object = @{Name='TestObject'}PS> $object.count$null

PowerShell5.1をまだ使用している場合は、オブジェクトを配列にラップしてから、カウントをチェックして正確なカウントを取得できます。,

if ( @($array).count -gt 0 ){ "Array isn't empty"}

完全に安全に再生するには、$nullを確認してから、カウントを確認してください。

if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}

All-eq

私は最近、誰かが配列内のすべての値が特定の値と一致することを確認する方法を尋ねるのを見ました。Redditのユーザー/u/bisは、誤った値をチェックして結果を反転させるこの巧妙な解決策を持っていました。

$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}

配列への追加

この時点で、配列にアイテムを追加する方法を疑問に思い始めています。 簡単な答えは、あなたができないということです。配列はメモリ内の固定サイズです。, それを成長させるか、単一のアイテムを追加する必要がある場合は、新しい配列を作成し、古い配列からすべての値をコピーする必要があります。 これは多くの作業のように聞こえますが、PowerShellは新しい配列を作成する複雑さを隠します。 PowerShellimplements配列の加算演算子(+)。

メモ

PowerShellでは減算操作は実装されていません。 Anarrayの柔軟な代替が必要な場合は、汎用のListオブジェクトを使用する必要があります。,

配列追加

新しい配列を作成するために、配列で加算演算子を使用することができます。 したがって、これら二つの配列を考えると:

$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')

新しい配列を取得するためにそれらを一緒に追加することができます。

PS> $first + $secondZeroOneTwoThree

Plus equals+=

新しい配列を作成し、次のようにアイテムを追加することができます。

$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'

+=を使用するたびに、新しい配列を複製して作成していることを覚えておいてください。 Thisisな問題のための小型データセットでスケール極が低調に推移しました。,

パイプラインの割り当て

任意のパイプラインの結果を変数に割り当てることができます。 Multipleitemsが含まれている場合は配列です。

$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}

通常、パイプラインの使用を考えるときは、典型的なPowerShellワンライナーを考えます。 foreach()ステートメントやその他のループでパイプラインを平均することができます。 したがって、ループ内のanarrayに項目を追加する代わりに、項目をパイプラインにドロップできます。

$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}

配列型

デフォルトでは、PowerShellの配列は]タイプとして作成されます。, これにより、任意のタイプのオブジェクトまたは値。 これは、すべてがPSObjectタイプから継承されるために機能します。

厳密に型指定された配列

同様の構文を使用して任意の型の配列を作成できます。 を作成する場合は、強く型付けされた配列、などを含めないでください値やオブジェクトは、指定されたタイプです。

ArrayList

配列に項目を追加することは最大の制限の一つですが、他にもいくつかのコレクションがありますこの問題を解決することができます。,

ArrayListは、一般的に、isfaasterで動作する配列が必要なときに最初に考えるものの一つです。 それは必要な場所ごとにオブジェクト配列のように機能しますが、addingitemsをすばやく処理します。

ここでは、ArrayListを作成し、それにアイテムを追加する方法です。

$myarray = ::new()$myArray.Add('Value')

このタイプを取得するために.NETを呼び出しています。 この場合、デフォルトのコンストラクタを使用して作成します。 次に、Addメソッドを呼び出してアイテムを追加します。,

私が使用している理由行の先頭に戻りコードを抑制するためです。 Some.NET 通話がいを作り出すことができる予想外の出力に出力します。

配列内にある唯一のデータが文字列である場合は、usingStringBuilderも見てください。 それはほぼ同じことですが、文字列を扱うための方法がいくつかあります。 Div id=”5c25a674ac”>は、パフォーマンスのために特別に設計されています。

人々が配列からArrayListに移動するのを見るのが一般的です。 しかし、それはC#が一般的なサポートを持っていなかった時代から来ています。, ArrayListは、ジェネリックList

ジェネリックリスト

ジェネリック型は、一般化されたクラスを定義するC#の特別な型であり、ユーザーが作成時に使用するデータ型を指定します。 したがって、数値または文字列のリストが必要な場合は、intまたはstringタイプのリストが必要です。

文字列のリストを作成する方法は次のとおりです。

$mylist = ]::new()

または番号のリスト。,

$mylist = ]::new()

オブジェクトを最初に作成することなく、既存の配列を次のようにリストにキャストできます。

$mylist = ]@(1,2,3)

PowerShell5以降のusing namespaceステートメントで構文を短くすることができます。 usingステートメントは、スクリプトの最初の行である必要があります。 名前空間を宣言することにより、PowerShellletsを参照するときにデータ型から除外します。

using namespace System.Collections.Generic$myList = ]@(1,2,3)

これにより、Listはるかに使いやすくなります。,

同様のAddメソッドを使用できます。 ArrayListとは異なり、Addメソッドには戻り値がないため、voidする必要はありません。

$myList.Add(10)

そして、我々はまだ他の配列のような要素にアクセスすることができます。

PS> $myList10

List

任意のタイプのリストを持つことができますが、オブジェクトのタイプがわからない場合は、]それらを含める,

$list = ]::new()

Remove()

ArrayListおよび汎用Listどちらもコレクションからのアイテムの削除をサポートしています。

using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree

値型を操作するとき、リストから最初のものが削除されます。 その値を削除し続けるために、何度も何度も呼び出すことができます。 参照型がある場合は、削除するオブジェクトを提供する必要があります。,

]$drives = Get-PSDrive$drives.remove($drives)
$delete = $drives$drives.remove($delete)

removeメソッドは、コレクションからアイテムを検索して削除できた場合、trueを返します。

その他のコレクション

使用できるコレクションは他にもたくさんありますが、これらは良い汎用配列置換です。これらのオプションの詳細について学ぶことに興味がある場合は、thisGist thatMark Krausがまとめたものを見てください。

その他のニュアンス

すべての主要な機能について説明したので、これをまとめる前に言及したいことがいくつかあります。,

事前サイズの配列

一度作成した配列のサイズを変更することはできないと述べました。 あらかじめ決められたサイズの配列を作成するには、new($size)コンストラクタで呼び出します。

$data = ]::new(4)$data.count4

配列を掛ける

興味深い小さなトリックは、配列に整数を掛けることができるということです。

PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue

0で初期化

一般的なシナリオは、すべてゼロの配列を作成することです。 Integersのみを使用する場合、厳密に型指定された整数の配列はデフォルトですべてゼロになります。,

PS> ]::new(4)0000

乗算トリックを使用してこれを行うこともできます。

PS> $data = @(0) * 4PS> $data0000

乗算のトリックの良いところは、任意の値を使用できることです。 したがって、255をデフォルト値として使用するのであれば、これはそれを行う良い方法です。

PS> $data = @(255) * 4PS> $data255255255255

ネストされた配列

配列内の配列はネストされた配列と呼ばれます。 私はPowerShellでこれらをあまり使用していませんが、他の言語でもっと使用しています。 利用をお考えの配列の配列がデータをfitsにgridlikeパターンです。,

ここでは、二次元配列を作成することができます二つの方法があります。

$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))

これらの例では、コンマは非常に重要です。 私は、コンマがオプションであった通常の配列onmultiple行の以前の例を挙げました。 多次元配列の場合はそうではありません。

インデックス表記法の使い方は、ネストされた配列になったので少し変わります。 上記の$dataを使用すると、これが値3にアクセスする方法です。

PS> $outside = 0PS> $inside = 2PS> $data3

配列の入れ子の各レベルに括弧のセットを追加します。, 括弧の最初のセットは、最も外側の配列のためのものであり、そこからあなたのやり方で作業します。

Write-Output-NoEnumerate

PowerShellは配列をアンラップまたは列挙するのが好きです。 これはPowerShellがthepipelineを使用する方法の中核的な側面ですが、それを起こさせたくない場合があります。

私は一般的にそれらについての詳細を学ぶためにGet-Memberにオブジェクトをパイプします。 配列をパイプすると、ラップ解除され、Get-Memberは実際の配列ではなく配列のメンバーを見ます。,

PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...

配列のアンラップを防ぐには、Write-Object -NoEnumerateを使用できます。

PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...

私はハックのより多くの第二の方法を持っています(そして私はこのようなハッキングを避けようとします)。 あなたはそれをパイプする前に、配列の前にacommaを配置することができます。

PS> ,$data | Get-MemberTypeName: System.Object...

配列を返します

この配列のラップ解除は、関数から値を出力または返すときにも発生します。 出力を変数に割り当てると配列を取得できるので、これは一般的に問題ではありません。

キャッチは、新しい配列があるということです。, それが問題になる場合は、Write-Output -NoEnumerate $arrayまたはreturn ,$arrayを使用して回避できます。

他に何かありますか?