about_Member-Access_Enumeration
簡単な説明
メンバーアクセス演算子を使用する場合のリストコレクション項目の自動列挙について説明します。
長い説明
PowerShell 3.0 以降では、 メンバーアクセス列挙 機能により、リストコレクションオブジェクトに対してメンバーアクセス演算子 ( . ) を使用する場合の利便性が向上しています。 コレクションに存在しないメンバーにアクセスするためにメンバーアクセス演算子を使用すると、PowerShell は自動的にコレクション内の項目を列挙し、各項目の指定されたメンバーへのアクセスを試みます。
メンバーアクセス列挙体は、より単純で短いコードを記述するのに役立ちます。 コレクションオブジェクトをにパイプする ForEach-Object のではなく、組み込みメソッドを使用して ForEach()
コレクションの各項目のメンバーにアクセスする代わりに、コレクションオブジェクトに対してメンバーアクセス演算子を使用できます。
これらのコマンドは、メンバーアクセス演算子の使用方法を示す最後のコマンドと機能的には同じです。
Get-Service -Name event* | ForEach-Object -Process { $_.DisplayName }
(Get-Service -Name event*).ForEach({ $_.DisplayName })
(Get-Service -Name event*).DisplayName
Windows Event Log
COM+ Event System
Windows Event Log
COM+ Event System
Windows Event Log
COM+ Event System
注意
メンバーアクセス演算子を使用すると、コレクション内の項目のプロパティの値を取得できますが、それを使用して直接設定することはできません。 詳細については、「 about_Arrays」を参照してください。
任意のオブジェクトに対してメンバーアクセス演算子を使用し、指定されたメンバーがそのオブジェクトに存在する場合、メンバーが呼び出されます。 プロパティメンバーの場合、演算子はそのプロパティの値を返します。 メソッドメンバーの場合、演算子はオブジェクトに対してこのメソッドを呼び出します。
指定されたメンバーを持たないリストコレクションオブジェクトに対してメンバーアクセス演算子を使用すると、PowerShell は自動的にそのコレクション内の項目を列挙し、列挙された各項目に対してメンバーアクセス演算子を使用します。
オブジェクトの型が IList インターフェイスを実装しているかどうかを確認することによって、オブジェクトがリストコレクションであるかどうかを確認できます。
$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True
False
プロパティのメンバーアクセス列挙中に、演算子は、そのプロパティを持つ各項目のプロパティの値を返します。 指定したプロパティを持つ項目がない場合、演算子はを返し $null ます。
メソッドのメンバーアクセス列挙中に、演算子はコレクション内の各項目に対してメソッドの呼び出しを試みます。 コレクション内のいずれかの項目に指定されたメソッドがない場合、演算子は MethodNotFound 例外を返します。
警告
メソッドのメンバーアクセス列挙中に、メソッドはコレクション内の各項目に対して呼び出されます。 呼び出し元のメソッドによって変更が行われた場合、コレクション内のすべての項目に対して変更が行われます。 列挙中にエラーが発生した場合、メソッドは、エラーの前に列挙された項目に対してのみ呼び出されます。 安全性をさらに向上させるには、手動で項目を列挙し、エラーを明示的に処理することを検討してください。
次の例では、すべての可能なシナリオでのメンバーアクセス演算子の動作について詳しく説明します。
リスト以外のオブジェクトのメンバーへのアクセス
リストコレクションではなくメンバーを持つオブジェクトに対してメンバーアクセス演算子を使用すると、そのオブジェクトのメソッドのプロパティまたは出力の値が返されます。
$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3
ABC
メンバーを持たないリスト以外のオブジェクトに対してメンバーアクセス演算子を使用すると、プロパティを指定した場合はが返され、メソッドを指定した場合は MethodNotFound エラーが返さ $null れます。
$MyString = 'abc'
$null -eq $MyString.DoesNotExist
$MyString.DoesNotExist()
True
InvalidOperation:
Line |
3 | $MyString.DoesNotExist()
| ~~~~~~~~~~~~~~~~~~~~~~~~
| Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.
リストコレクションオブジェクトのメンバーへのアクセス
メンバーを持つコレクションオブジェクトに対してメンバーアクセス演算子を使用すると、コレクションオブジェクトのプロパティ値またはメソッドの結果が常に返されます。
コレクションに存在するが、そのアイテムには存在しないメンバーへのアクセス
この例では、指定されたメンバーはコレクションに存在しますが、その中のアイテムは存在しません。
[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False
a
b
c
コレクションとその項目に存在するメンバーへのアクセス
この例では、指定されたメンバーがコレクションとその中のアイテムの両方に存在します。 コレクションのメンバーアクセス演算子を使用したコマンドの結果を、の ForEach-Object コレクションアイテムに対するメンバーアクセス演算子を使用した結果と比較します。 コレクションでは、演算子はコレクションオブジェクトのプロパティ値またはメソッドの結果を返します。
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Count
$Collection | ForEach-Object -Process { $_.Count }
$Collection.ToString()
$Collection | ForEach-Object -Process { $_.ToString() }
3
1
1
1
System.Collections.Generic.List`1[System.String]
a
b
c
コレクション内のすべての項目に存在するが、それ自体は存在しないメンバーへのアクセス
メンバーを持たないコレクションオブジェクトに対してメンバーアクセス演算子を使用すると、その中のアイテムが実行され、PowerShell によってコレクション内のアイテムが列挙され、各アイテムのプロパティ値またはメソッドの結果が返されます。
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1
A
B
C
コレクションとその項目のどちらにも存在しないメンバーへのアクセス
メンバーを持たないコレクションオブジェクトに対してメンバーアクセス演算子を使用し、そのメンバーの項目を実行しない場合、メソッドを指定すると、プロパティを指定した場合、またはエラーが MethodNotFound 返された場合、コマンドはを返し $null ます。
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$null -eq $Collection.DoesNotExist
$Collection.DoesNotExist()
True
InvalidOperation:
Line |
3 | $Collection.DoesNotExist()
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
| Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.
コレクションオブジェクトにはメンバーがないため、PowerShell はコレクション内の項目を列挙します。 MethodNotFound エラーは、 system.string ではなく、system.string にメソッドが含まれていないことを示して います。
コレクション内の一部の項目にのみ存在するメソッドにアクセスする
メンバーアクセス演算子を使用して、メソッドを持たないコレクションオブジェクトのメソッドにアクセスするときに、コレクション内の一部の項目のみが含まれている場合、このコマンドは、メソッドを持たないコレクションの最初の項目に対してエラーを返し MethodNotFound ます。 メソッドが一部の項目に対して呼び出されている場合でも、コマンドはエラーを返します。
@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.
コレクション内の一部の項目にのみ存在するプロパティへのアクセス
メンバーアクセス演算子を使用して、プロパティが設定されていないコレクションオブジェクトのプロパティにアクセスする場合、このコマンドは、プロパティを持つコレクション内の各項目について、プロパティ値を返します。
$CapitalizedProperty = @{
MemberType = 'ScriptProperty'
Name = 'Capitalized'
Value = { $this.ToUpper() }
PassThru = $true
}
[System.Collections.Generic.List[object]]$MixedCollection = @(
'a'
('b' | Add-Member @CapitalizedProperty)
('c' | Add-Member @CapitalizedProperty)
'd'
)
$MixedCollection.Capitalized
B
C
参照
フィードバック
フィードバックの送信と表示