- 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}
最初に行うことは、$index
を0
に初期化することです。, 次に、$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
を使用して回避できます。
コメントを残す