다음을 통해 공유


배열에 대한 설명

간단한 설명

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

긴 설명

배열은 항목 컬렉션을 저장하도록 설계된 데이터 구조입니다. 항목은 동일한 유형일 수도 있고 다른 유형일 수도 있습니다.

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

따라서 에는 $C 5, 6, 7 및 8의 네 가지 값이 포함됩니다.

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

$A.GetType()

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

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

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

.NET에서 지원되는 모든 형식으로 캐스팅되는 배열을 만들 수 있습니다. 예를 들어, 프로세스를 나타내기 위해 검색하는 개체는 Get-ProcessSystem.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 loops와 같은 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

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

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

Rank

배열의 차원 수를 반환합니다. PowerShell의 대부분의 배열에는 1차원만 있습니다. 다음 예제와 같은 다차원 배열을 만들고 있다고 생각하더라도 :

$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

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

복제 및 연결과 같은 다차원 배열에 대한 일부 작업에서는 해당 배열을 평면화해야 합니다. 평면화는 배열을 제약이 없는 형식의 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

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

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

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

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(문자열 propertyName)

ForEach(문자열 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(문자열 methodName)

ForEach(문자열 methodName, object[] 인수)

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

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

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

비고

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

어디에()

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

이 메서드에 대한 Where() 정의는 하나뿐입니다.

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

비고

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

Expression 필터링에 필요한 scriptblock이고, mode optional 인수는 추가 선택 기능을 허용하며, optional 인수는 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 모드는 스크립트 블록을 사용하여 항목을 필터링합니다 Expression .

a 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 . 항목이 스크립트 블록 식을 통과할 때까지 컬렉션의 모든 항목을 반환합니다. 항목이 scriptblock 식을 전달 하면 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

비고

Until 둘 다 SkipUntil 항목 배치를 테스트하지 않는다는 전제 하에 작동합니다.

첫 번째 PASS이전에 항목을 반환합니다. SkipUntil첫 번째 전달 항목을 포함하여 첫 번째 통과이후의 모든 항목을 반환합니다.

Split

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

지정한 경우, 첫 번째 컬렉션은 지정된 값을 초과하지 않으면서 항목을 통과하는 을 포함합니다.

식 필터를 PASS 하는 개체를 포함하여 나머지 개체는 두 번째 컬렉션에 반환됩니다.

$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
...

비고

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

배열의 멤버 가져 오기

속성 및 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 메서드를 사용하여 값을 변경할 수도 있습니다. 다음 예제에서는 배열의 두 번째 값(인덱스 위치 1)을 $a 500으로 변경합니다.

$a.SetValue(500,1)

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

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

비고

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

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

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

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

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

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

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

$a = $null

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

0 또는 1로 구성된 배열

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

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

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

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

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

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

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

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 문자열의 배열입니다. 배열의 CountLength1이며, 첫 번째 요소의 Length4입니다.

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은 키가 없을 때 반환되는 TryGetValue() 를 사용하여 $null키의 존재 여부를 테스트합니다.

반면, 를 사용하여 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 멤버가 없으므로 배열의 각 항목에 대해 LastWriteTime 값이 반환됩니다.

$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 개체의 숨겨진 멤버입니다. 다음 예제에서는 hiddenset 메서드가 있는 멤버를 찾는 방법을 보여 줍니다.

$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;}

주의

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

참고하십시오