다음을 통해 공유


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 예외를 반환합니다.

Warning

메서드에 대한 멤버 액세스 열거 중에 컬렉션의 각 항목에서 메서드가 호출됩니다. 호출하는 메서드가 변경되면 컬렉션의 모든 항목에 대해 변경됩니다. 열거 중에 오류가 발생하면 메서드는 오류 전에 열거된 항목에서만 호출됩니다. 안전을 위해 항목을 수동으로 열거하고 오류를 명시적으로 처리하는 것이 좋습니다.

다음 예제에서는 가능한 모든 시나리오에서 멤버 액세스 연산자의 동작을 자세히 설명합니다.

비 목록 개체의 멤버 액세스

목록 컬렉션이 아니고 멤버가 있는 개체에서 멤버 액세스 연산자를 사용하는 경우 명령은 해당 개체에 대한 메서드의 속성 또는 출력 값을 반환합니다.

$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

참고 항목

HashTable 및 OrderedDictionary와 같은 System.Collections.IDictionary 인터페이스를 구현하는 컬렉션의 동작은 다릅니다. 속성과 이름이 같은 키가 있는 사전에서 멤버 액세스 연산자를 사용하면 속성 대신 키의 값이 반환됩니다.

psbase내장 멤버를 사용하여 사전 개체의 속성 값에 액세스할 수 있습니다. 예를 들어 키 이름이 keys 고 HashTable 키의 컬렉션을 반환하려는 경우 다음 구문을 사용합니다.

$hashtable.PSBase.Keys

컬렉션의 모든 항목에 있지만 그 자체가 아닌 멤버에 액세스

멤버가 없지만 항목이 있는 컬렉션 개체에서 멤버 액세스 연산자를 사용하는 경우 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.StringSystem.Collections.Generic.List 대신 메서드를 포함하지 않도록 지정합니다.

컬렉션의 일부 항목에만 존재하는 메서드에 액세스

멤버 액세스 연산자를 사용하여 메서드가 없는 컬렉션 개체의 메서드에 액세스하고 컬렉션의 일부 항목만 있는 경우 이 명령은 메서드가 없는 컬렉션의 첫 번째 항목에 대한 오류를 반환 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

참고 항목