about_arrays

간단한 설명

항목 컬렉션을 저장하도록 설계된 데이터 구조인 배열에 대해 설명합니다.

자세한 설명

배열은 항목 컬렉션을 저장하도록 설계된 데이터 구조입니다. 항목은 형식이 같거나 형식이 다를 수 있습니다.

Windows PowerShell 3.0부터 0개 또는 1개의 개체 컬렉션에는 배열의 일부 속성이 있습니다.

배열 만들기 및 초기화

배열을 만들고 초기화하려면 변수에 여러 값을 할당합니다. 배열에 저장된 값은 쉼표로 구분되고 할당 연산자(=)로 변수 이름과 구분됩니다.

예를 들어 22, 5, 10, 8, 12, 9 및 80의 7개의 숫자(정수) 값을 포함하는 배열 $A 을 만들려면 다음을 입력합니다.

$A = 22,5,10,8,12,9,80

쉼표는 단일 항목 앞에 쉼표로 배치하여 단일 항목 배열을 초기화하는 데 사용할 수도 있습니다.

예를 들어 단일 값 7을 포함하는 단일 $B 항목 배열을 만들려면 다음을 입력합니다.

$B = ,7

범위 연산자(..)를 사용하여 배열을 만들고 초기화할 수도 있습니다. 다음 예제에서는 값 5~8을 포함하는 배열을 만듭니다.

$C = 5..8

결과적으로 5, $C 6, 7 및 8의 네 가지 값이 포함됩니다.

데이터 형식을 지정하지 않으면 PowerShell은 각 배열을 개체 배열(System.Object[])로 만듭니다. 배열의 데이터 형식을 확인하려면 메서드를 GetType() 사용합니다. 예시:

$A.GetType()

강력한 형식의 배열을 만들려면, 즉 특정 형식의 값만 포함할 수 있는 배열을 문자열[], long[], int32[]와 같은 배열 형식으로 캐스팅합니다. 배열을 캐스팅하려면 대괄호로 묶인 배열 형식으로 변수 이름 앞에 옵니다. 예시:

[int32[]]$ia = 1500, 2230, 3350, 4000

따라서 배열에는 $ia 정수만 포함될 수 있습니다.

.NET에서 지원되는 모든 형식으로 캐스팅되는 배열을 만들 수 있습니다. 예를 들어 프로세스를 나타내기 위해 검색하는 Get-Process 개체는 System.Diagnostics.Process 형식입니다. 강력한 형식의 프로세스 개체 배열을 만들려면 다음 명령을 입력합니다.

[Diagnostics.Process[]]$zz = Get-Process

배열 하위 식 연산자

배열 하위 식 연산자는 내부 문에서 배열을 만듭니다. 연산자 내에서 문이 생성되는 것이 무엇이든 간에 연산자는 이를 배열에 배치합니다. 개체가 0개 또는 1개인 경우에도

배열 연산자의 구문은 다음과 같습니다.

@( ... )

배열 연산자를 사용하여 0개 또는 1개의 개체 배열을 만들 수 있습니다. 예시:

$a = @("Hello World")
$a.Count
1
$b = @()
$b.Count
0

배열 연산자는 개체를 가져올 때 스크립트에 유용하지만 예상할 수 있는 수는 모릅니다. 예시:

$p = @(Get-Process Notepad)

배열 하위 식 연산 자에 대한 자세한 내용은 about_Operators 참조하세요.

배열 요소 액세스 및 사용

배열 읽기

변수 이름을 사용하여 배열을 참조할 수 있습니다. 배열의 모든 요소를 표시하려면 배열 이름을 호출합니다. 예를 들어 숫자 $a 0부터 9까지의 배열입니다.

$a
0
1
2
3
4
5
6
7
8
9

인덱스로 배열의 요소를 참조할 수 있습니다. 인덱스 번호를 대괄호로 묶습니다. 인덱스 값은 .에서 시작합니다 0. 예를 들어 배열의 첫 번째 요소를 표시하려면 다음을 $a 입력합니다.

$a[0]
0

배열에 세 번째 요소를 표시하려면 다음을 $a 입력합니다.

$a[2]
2

인덱스의 범위 연산자를 사용하여 배열의 일부를 검색할 수 있습니다. 예를 들어 배열의 두 번째에서 다섯 번째 요소를 검색하려면 다음을 입력합니다.

$a[1..4]
1
2
3
4

음수는 배열의 끝에서 계산됩니다. 예를 들어 배열 -1 의 마지막 요소를 참조합니다. 배열의 마지막 세 요소를 인덱스 오름차순으로 표시하려면 다음을 입력합니다.

$a = 0 .. 9
$a[-3..-1]
7
8
9

내림차순으로 음수 인덱스를 입력하면 출력이 변경됩니다.

$a = 0 .. 9
$a[-1..-3]
9
8
7

그러나 이 표기법을 사용할 때는 주의해야 합니다. 표기법은 끝 경계에서 배열의 시작 부분으로 순환됩니다.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

또한 한 가지 일반적인 실수는 마지막 요소를 제외하고 배열의 모든 요소를 참조하는 것으로 가정 $a[0..-2] 하는 것입니다. 배열의 첫 번째, 마지막 및 두 번째에서 마지막 요소를 참조합니다.

더하기 연산자(+)를 사용하여 배열의 요소 목록과 범위를 결합할 수 있습니다. 예를 들어 인덱스 위치 0, 2 및 4에서 6까지 요소를 표시하려면 다음을 입력합니다.

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

또한 여러 범위 및 개별 요소를 나열하려면 더하기 연산자를 사용할 수 있습니다. 예를 들어 요소를 0에서 2, 4~6, 요소를 8번째 위치 형식으로 나열하려면 다음을 수행합니다.

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

배열 요소에 대한 반복

루프 구문(예: foreach, forwhile 루프)을 사용하여 배열의 요소를 참조할 수도 있습니다. 예를 들어 루프를 foreach 사용하여 배열의 요소를 표시하려면 다음을 $a 입력합니다.

$a = 0..9
foreach ($element in $a) {
  $element
}
0
1
2
3
4
5
6
7
8
9

루프는 foreach 배열을 반복하고 배열의 끝에 도달할 때까지 배열의 각 값을 반환합니다.

for 루프는 배열의 요소를 검사하는 동안 카운터를 증분할 때 유용합니다. 예를 들어 루프를 사용하여 배열의 for 다른 모든 값을 반환하려면 다음을 입력합니다.

$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
  $a[$i]
}
0
2
4
6
8

정의된 조건이 더 이상 true가 while 될 때까지 루프를 사용하여 배열의 요소를 표시할 수 있습니다. 예를 들어 배열 인덱스가 4보다 작은 동안 배열의 요소를 $a 표시하려면 다음을 입력합니다.

$a = 0..9
$i=0
while($i -lt 4) {
  $a[$i]
  $i++
}
0
1
2
3

배열의 속성

Count 또는 Length 또는 LongLength

배열에 있는 항목 수를 확인하려면 속성 또는 해당 별칭을 Count 사용합니다Length. Longlength 는 배열에 2,147,483,647개 이상의 요소가 포함된 경우에 유용합니다.

$a = 0..9
$a.Count
$a.Length
10
10

Rank

배열의 차원 수를 반환합니다. PowerShell의 대부분의 배열에는 하나의 차원만 있습니다. 다음 예제와 같이 다차원 배열을 빌드하는 경우에도 다음과 같습니다.

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"

이 예제에서는 다른 배열을 포함하는 1차원 배열을 만듭니다. 이를 들쭉날쭉한 배열이라고도 합니다. 이 속성은 Rank 1차원임을 입증했습니다. 가변 배열의 항목에 액세스하려면 인덱스가 별도의 대괄호([])에 있어야 합니다.

$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32

다차원 배열은 행 주 순서저장됩니다. 다음 예제에서는 진정한 다차원 배열을 만드는 방법을 보여 줍니다.

[string[,]]$rank2 = [string[,]]::New(3,2)
$rank2.rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d

다차원 배열의 항목에 액세스하려면 단일 대괄호 집합([])에서 쉼표(,)를 사용하여 인덱스를 구분합니다.

복제본(replica)tion 및 연결과 같은 다차원 배열에 대한 일부 작업을 수행하려면 배열을 평면화해야 합니다. 평면화는 배열을 제약이 없는 형식의 1차원 배열로 바꿉니다. 결과 배열은 행 중심 순서의 모든 요소를 사용합니다. 다음 예제를 참조하세요.

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c

출력은 행 주 순서와 행의 항목을 $a$b 포함하는 1차원 배열을 보여줍니다$c.

Object[]
Int32[,]
Object[]
red
True
10
20
30
40

배열의 메서드

Clear

모든 요소 값을 배열 요소 형식의 기본값 으로 설정합니다. 이 메서드는 Clear() 배열의 크기를 다시 설정하지 않습니다.

다음 예제 $a 에서는 개체의 배열입니다.

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

이 예제에서는 $intA 정수가 포함되도록 명시적으로 형식화됩니다.

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

ForEach()

배열의 모든 요소를 반복하고 배열의 각 요소에 대해 지정된 작업을 수행할 수 있습니다.

ForEach() 메서드에는 여러 작업을 수행하는 여러 오버로드가 있습니다.

ForEach(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

ForEach(scriptblock 식)

ForEach(scriptblock 식, object[] 인수)

이 메서드는 PowerShell v4에 추가되었습니다.

참고 항목

구문에는 스크립트 블록을 사용해야 합니다. scriptblock이 유일한 매개 변수인 경우 괄호는 선택 사항입니다. 또한 메서드와 여는 괄호 또는 중괄호 사이에 공백이 없어야 합니다.

다음 예제에서는 메서드를 ForEach() 사용하는 방법을 보여줍니다. 이 경우 의도는 배열에 있는 요소의 제곱 값을 생성하는 것입니다.

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

ArgumentList 매개 변수와 마찬가지로 매개 변수 ForEach-Objectarguments 를 사용하면 인수 배열을 수락하도록 구성된 스크립트 블록에 전달할 수 있습니다.

ArgumentList동작에 대한 자세한 내용은 about_Splatting 참조하세요.

ForEach(convertToType 형식)

이 메서드를 ForEach() 사용하여 요소를 다른 형식으로 캐스팅할 수 있습니다. 다음 예제에서는 문자열 날짜 목록을 형식으로 변환하는 [DateTime] 방법을 보여줍니다.

("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])

Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM

ForEach(string propertyName)

ForEach(string propertyName, object[] newValue)

이 메서드를 ForEach() 사용하여 컬렉션의 모든 항목에 대한 속성 값을 검색하거나 설정할 수도 있습니다.

# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM

ForEach(string methodName)

ForEach(string methodName, object[] 인수)

Lastly, ForEach() 메서드를 사용하여 컬렉션의 모든 항목에서 메서드를 실행할 수 있습니다.

("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE

ArgumentList 매개 변수와 마찬가지로 매개 변수 ForEach-Objectarguments 를 사용하면 값 배열을 수락하도록 구성된 스크립트 블록에 전달할 수 있습니다.

참고 항목

Windows PowerShell 3.0부터는 "스칼라 개체 및 컬렉션의 메서드"를 사용하여 컬렉션의 각 항목에 대한 속성 및 실행 메서드를 검색할 수도 있습니다. 자세한 내용은 about_Methods 여기에서 확인할 수 있습니다.

Where()

배열의 요소를 필터링하거나 선택할 수 있습니다. 스크립트는 0, 빈 문자열 $false 또는 $null 요소 뒤 Where()를 표시하기 위해 0과 다른 것으로 평가되어야 합니다. 부울 평가에 대한 자세한 내용은 about_Booleans 참조하세요.

메서드에 대한 정의가 하나 있습니다 Where() .

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

참고 항목

구문에는 스크립트 블록을 사용해야 합니다. scriptblock이 유일한 매개 변수인 경우 괄호는 선택 사항입니다. 또한 메서드와 여는 괄호 또는 중괄호 사이에 공백이 없어야 합니다.

필터링 Expression 에 필요한 scriptblock이고, mode 선택적 인수는 추가 선택 기능을 허용하며 numberToReturn , 선택적 인수를 사용하면 필터에서 반환되는 항목 수를 제한할 수 있습니다.

mode 은 WhereOperatorSelectionMode 열거형 값이어야 합니다.

  • Default (0) - 모든 항목 반환
  • First (1) - 첫 번째 항목 반환
  • Last (2) - 마지막 항목 반환
  • SkipUntil(3) - 조건이 true가 될 때까지 항목을 건너뛰고, 다시 기본 항목을 모두 반환합니다(조건이 true인 첫 번째 항목 포함).
  • Until (4) - 조건이 true가 될 때까지 모든 항목 반환
  • Split (5) - 두 요소의 배열 반환
    • 첫 번째 요소에는 일치하는 항목이 포함됩니다.
    • 두 번째 요소에는 다시 기본 항목이 포함됩니다.

다음 예제에서는 배열에서 모든 홀수 값을 선택하는 방법을 보여 줍니다.

(0..9).Where{ $_ % 2 }
1
3
5
7
9

이 예제에서는 비어 있지 않은 문자열을 선택하는 방법을 보여 줍니다.

('hi', '', 'there').Where({$_.Length})
hi
there

Default

이 모드는 Default scriptblock을 Expression 사용하여 항목을 필터링합니다.

제공 numberToReturn 된 경우 반환할 최대 항목 수를 지정합니다.

# Get the zip files in the current users profile, sorted by LastAccessTime
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)

참고 항목

Default 모드와 First 모드는 모두 첫 번째 (numberToReturn) 항목을 반환하며 서로 바꿔 사용할 수 있습니다.

Last

$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)

SkipUntil

이 모드는 SkipUntil 개체가 스크립트 블록 식 필터를 통과할 때까지 컬렉션의 모든 개체를 건너뜁니다. 그런 다음 모든 컬렉션 항목을 테스트하지 않고 다시 기본 반환합니다. 전달 항목은 하나만 테스트됩니다.

즉, 반환된 컬렉션에는 테스트되지 않은 전달 항목과 전달되지 않은 항목이 모두 포함됩니다.

반환되는 항목 수는 인수에 값을 전달하여 제한할 numberToReturn 수 있습니다.

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Until

모드는 Until 모드를 SkipUntil 반전시킵니다. 항목이 스크립트 블록 식을 통과할 때까지 컬렉션의 ALL 항목을 반환합니다. 항목 이 scriptblock 식을 통과 하면 메서드는 Where() 항목 처리를 중지합니다.

즉, 메서드에서 전달하지 않는 항목의 첫 번째 집합을 받습니다Where(). 한 항목이 통과하면 나머지는 테스트되거나 반환되지 않습니다.

반환되는 항목 수는 인수에 값을 전달하여 제한할 numberToReturn 수 있습니다.

# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10

참고 항목

SkipUntil 둘 다 Until 항목 일괄 처리를 테스트하지 않는다는 전제 하에 작동합니다.

Until는 첫 번째 PASS 앞에 있는 항목을 반환합니다. SkipUntil는 첫 번째 전달 항목을 포함하여 첫 번째 패스 이후의 모든 항목을 반환합니다.

Split

모드는 Split 컬렉션 항목을 두 개의 개별 컬렉션으로 분할하거나 그룹화합니다. scriptblock 식을 전달하는 식과 그렇지 않은 식입니다.

지정된 numberToReturn 경우 첫 번째 컬렉션에는 지정된 값을 초과하지 않고 전달 항목이 포함됩니다.

식 필터를 전달하는 개체도 다시 기본 개체가 두 번째 컬렉션에 반환됩니다.

$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
...
$stopped
Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
...

참고 항목

Where() 메서드는 모두 ForEach() 내장 멤버입니다. 내장 멤버에 대한 자세한 내용은 about_Instrinsic_Members 참조하세요.

배열의 멤버 가져오기

속성 및 SetValue 메서드와 같은 Length 배열의 속성과 메서드를 얻으려면 cmdlet의 InputObject 매개 변수를 Get-Member 사용합니다.

배열을 파이프할 Get-Member때 PowerShell은 항목을 한 번에 Get-Member 하나씩 보내고 배열에 있는 각 항목의 형식을 반환합니다(중복 무시).

InputObject 매개 변수 Get-Member사용하는 경우 배열의 멤버를 반환합니다.

예를 들어 다음 명령은 배열 변수의 멤버를 $a 가져옵니다.

Get-Member -InputObject $a

cmdlet에 파이프된 값 앞에 쉼표(,)를 입력하여 배열의 멤버를 Get-Member 가져올 수도 있습니다. 쉼표는 배열을 배열 배열의 두 번째 항목으로 만듭니다. PowerShell은 배열을 한 번에 하나씩 파이프하고 Get-Member 배열의 멤버를 반환합니다. 다음 두 예제와 같습니다.

,$a | Get-Member

,(1,2,3) | Get-Member

배열 조작

배열의 요소를 변경하고, 배열에 요소를 추가하고, 두 배열의 값을 세 번째 배열로 결합할 수 있습니다.

배열에서 특정 요소의 값을 변경하려면 변경할 요소의 배열 이름과 인덱스, 할당 연산자(=)를 사용하여 요소의 새 값을 지정합니다. 예를 들어 배열의 두 번째 항목 $a 값(인덱스 위치 1)을 10으로 변경하려면 다음을 입력합니다.

$a[1] = 10

배열의 SetValue 메서드를 사용하여 값을 변경할 수도 있습니다. 다음 예제에서는 배열의 $a 두 번째 값(인덱스 위치 1)을 500으로 변경합니다.

$a.SetValue(500,1)

연산자를 += 사용하여 배열에 요소를 추가할 수 있습니다. 다음 예제에서는 배열에 요소를 $a 추가하는 방법을 보여줍니다.

$a = @(0..4)
$a += 5

참고 항목

연산자를 += 사용하는 경우 PowerShell은 실제로 원래 배열의 값과 추가 값을 사용하여 새 배열을 만듭니다. 이로 인해 작업이 여러 번 반복되거나 배열 크기가 너무 큰 경우 성능 문제가 발생할 수 있습니다.

배열에서 요소를 삭제하는 것은 쉽지 않지만 기존 배열의 선택한 요소만 포함하는 새 배열을 만들 수 있습니다. 예를 들어 인덱스 위치 2의 값을 제외한 배열의 $a 모든 요소를 사용하여 배열을 만들 $t 려면 다음을 입력합니다.

$t = $a[0,1 + 3..($a.length - 1)]

두 배열을 단일 배열로 결합하려면 더하기 연산자(+)를 사용합니다. 다음 예제에서는 두 개의 배열을 만들고 결합한 다음 결과 결합된 배열을 표시합니다.

$x = 1,3
$y = 5,9
$z = $x + $y

결과적으로 배열에는 $z 1, 3, 5 및 9가 포함됩니다.

배열을 삭제하려면 배열에 $null 값을 할당합니다. 다음 명령은 변수의 배열을 $a 삭제합니다.

$a = $null

cmdlet을 Remove-Item 사용할 수도 있지만, 특히 큰 배열의 $null 경우 값을 할당하는 것이 더 빠릅니다.

0 또는 1의 배열

Windows PowerShell 3.0부터 0개 또는 1개 개체의 컬렉션에는 및 Length 속성이 Count 있습니다. 또한 한 개체의 배열로 인덱싱할 수 있습니다. 이 기능을 사용하면 컬렉션을 예상하는 명령이 두 개 미만의 항목을 얻을 때 발생하는 스크립팅 오류를 방지할 수 있습니다.

다음 예제에서는 개체가 없는 변수에 0과 0이 CountLength 있음을 보여 줍니다.

PS> $a = $null
PS> $a.Count
0
PS> $a.Length
0

다음 예제에서는 하나의 개체 Count 를 포함하는 변수에 1과 Length 1이 있음을 보여 줍니다. 배열 인덱싱을 사용하여 개체의 값에 액세스할 수도 있습니다.

PS> $a = 4
PS> $a.Count
1
PS> $a.Length
1
PS> $a[0]
4
PS> $a[-1]
4

컬렉션 또는 단일 개체를 반환할 수 있는 명령을 실행할 때 배열 인덱싱을 사용하여 개체의 값에 액세스하거나 속성을 테스트 CountLength 할 필요 없이 액세스할 수 있습니다. 그러나 결과가 단일 개체(싱글톤)이고 해당 개체에 a Count 또는 Length 속성이 있는 경우 해당 속성의 값은 싱글톤 개체에 속하며 컬렉션의 항목 수를 나타내지 않습니다.

다음 예제에서 명령은 단일 문자열 개체를 반환합니다. 해당 문자열의 값 Length 은 .입니다 4.

PS> $result = 'one','two','three','four' | Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String
PS> $result
four
PS> $result.Count
1
PS❯ $result.Length
4

문자열의 배열이 되려면 $result 변수를 배열로 선언해야 합니다.

이 예제에서는 $result 문자열 배열입니다. CountLength 배열 및 배열 Length1의 첫 번째 요소는 .입니다4.

PS> [string[]]$result = 'one','two','three','four' |
    Where-Object {$_ -like 'f*'}
PS> $result.GetType().FullName
System.String[]
PS> $result
four
PS> $result.Count
1
PS> $result.Length
1
PS> $result[0].Length
4

시스템에 대한 인덱싱 지원.Tuple 개체

PowerShell 6.1은 배열과 유사한 개체의 Tuple 인덱싱된 액세스에 대한 지원을 추가했습니다. 예시:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

배열 및 기타 컬렉션 개체 Tuple 와 달리 개체는 파이프라인을 통해 전달되거나 개체 배열을 지원하는 매개 변수에 의해 단일 개체로 처리됩니다.

자세한 내용은 System을Tuple 참조하세요.

구현하는 .NET 형식 인덱싱 IDictionary<TKey, TValue>

PowerShell은 제네릭 IDictionary<TKey, TValue> 인터페이스를 구현하는 형식에 대해 형식의 실제 인덱서를 호출하지 않습니다. 대신, 키가 제공되면 PowerShell은 키가 없을 때 반환 $null 되는 using 키를 사용하여 TryGetValue()키의 존재 여부에 대해 테스트합니다.

반면, 형식의 true 인덱서(true indexer)를 사용하여 Item(<key>)호출하는 경우 키가 없을 때 메서드가 예외를 throw합니다.

다음 예제에서 차이점을 보여 줍니다.

PS> [Collections.Generic.Dictionary[string, int]]::new()['nosuchkey']
# No output ($null)

PS> [Collections.Generic.Dictionary[string, int]]::new().Item('nosuchkey')
GetValueInvocationException: Exception getting "Item": "The given key 'nosuchkey'
 was not present in the dictionary."

멤버 액세스 열거형

PowerShell 3.0부터 구성원 액세스 연산자를 사용하여 목록 컬렉션에 없는 멤버에 액세스하는 경우 PowerShell은 컬렉션의 항목을 자동으로 열거하고 각 항목에서 지정된 멤버에 액세스하려고 시도합니다. 자세한 내용은 about_Member-Access_Enumeration 참조하세요.

예제

다음 예제에서는 두 개의 새 파일을 만들고 결과 개체를 배열 변수 $files에 저장합니다. 배열 개체에 LastWriteTime 멤버가 없으므로 배열의 Last각 항목에 대해 WriteTime 값이 반환됩니다.

$files = (New-Item -Type File -Force '/temp/t1.txt'),
         (New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM

멤버 액세스 열거형을 사용하면 컬렉션의 항목에서 값을 가져올 수 있지만 컬렉션의 항목에 값을 설정할 수는 없습니다. 예시:

$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.

값을 설정하려면 메서드를 사용해야 합니다.

$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM

set_LastWriteTime() 메서드는 FileInfo 개체의 숨겨진 멤버입니다. 다음 예제에서는 숨겨진set된 메서드가 있는 멤버를 찾는 방법을 보여 집니다.

$files | Get-Member | Where-Object Definition -like '*set;*'
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}

주의

메서드는 컬렉션의 각 항목에 대해 실행되므로 멤버 열거형을 사용하여 메서드를 호출할 때 주의해야 합니다.

참고 항목