간단한 설명
항목 컬렉션을 저장하도록 설계된 데이터 구조인 배열에 대해 설명합니다.
긴 설명
배열은 항목 컬렉션을 저장하도록 설계된 데이터 구조입니다. 항목은 동일한 유형일 수도 있고 다른 유형일 수도 있습니다.
Windows PowerShell 3.0부터 0개 또는 1개의 개체 컬렉션에는 배열의 일부 속성이 있습니다.
배열 만들기 및 초기화
배열을 만들고 초기화하려면 변수에 여러 값을 할당합니다. 배열에 저장된 값은 쉼표로 구분되고 대입 연산자(=)에 의해 변수 이름과 구분됩니다.
예를 들어, 22, 5, 10, 8, 12, 9 및 80의 7개의 숫자(int) 값을 포함하는 $A라는 배열을 만들려면 다음과 같이 입력합니다.
$A = 22,5,10,8,12,9,80
범위 연산자(..)를 사용하여 배열을 만들고 초기화할 수도 있습니다. 예를 들어, 5에서 8까지의 값을 포함하는 "$B"이라는 배열을 만들고 초기화하려면 다음과 같이 입력합니다.
$B = 5..8
따라서 $B에는 5, 6, 7, 8의 네 가지 값이 포함됩니다.
데이터 형식을 지정하지 않으면 PowerShell은 각 배열을 개체 배열(형식: System.Object[])로 만듭니다. 배열의 데이터 유형을 확인하려면 GetType() 메서드를 사용합니다. 예를 들어, $a 배열의 데이터형을 확인하려면 다음과 같이 입력합니다.
$a.GetType()
강력한 형식의 배열, 즉 특정 형식의 값만 포함할 수 있는 배열을 만들려면 변수를 string[], long[] 또는 int32[]와 같은 배열 형식으로 캐스팅합니다. 배열을 캐스팅하려면 변수 이름 앞에 대괄호로 묶인 배열 유형을 붙입니다. 예를 들어, 4개의 정수(1500, 2230, 3350, 4000)를 포함하는 $ia이라는 32비트 정수 배열을 만들려면 다음과 같이 입력합니다.
[int32[]]$ia = 1500,2230,3350,4000
따라서 $ia 배열에는 정수만 포함될 수 있습니다.
Microsoft .NET Framework에서 지원되는 모든 형식으로 캐스팅되는 배열을 만들 수 있습니다. 예를 들어, Get-Process 프로세스를 나타내기 위해 검색하는 개체는 System.Diagnostics.Process 형식입니다. 강력한 형식의 프로세스 개체 배열을 만들려면 다음 명령을 입력합니다.
[Diagnostics.Process[]]$zz = Get-Process
배열 하위 표현식 연산자
배열 하위 표현식 연산자는 0개 또는 1개의 개체를 포함하는 경우에도 배열을 만듭니다.
배열 연산자의 구문은 다음과 같습니다.
@( ... )
배열 연산자를 사용하여 0개 또는 1개의 개체로 구성된 배열을 만들 수 있습니다. 다음은 그 예입니다.
PS> $a = @("Hello World")
PS> $a.Count
1
PS> $b = @()
PS> $b.Count
0
배열 연산자는 개체를 가져올 때 스크립트에서 특히 유용하지만 얼마나 많은 개체를 얻을지 알 수 없습니다. 다음은 그 예입니다.
$p = @(Get-Process Notepad)
배열 하위 식 연산자에 대한 자세한 내용은 about_Operators 참조하세요.
배열 요소 액세스 및 사용
배열 읽기
변수 이름을 사용하여 배열을 참조할 수 있습니다. 배열의 모든 요소를 표시하려면 배열 이름을 입력합니다. 예를 들어, 0, 1, 2에서 9까지의 정수를 포함하는 배열이라고 가정합니다 $a .
$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, For 및 While 루프와 같은 루프 구문을 사용하여 배열의 요소를 참조할 수도 있습니다. 예를 들어, 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
While 루프를 사용하여 정의된 조건이 더 이상 true가 아닐 때까지 배열의 요소를 표시할 수 있습니다. 예를 들어, 배열 인덱스가 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
등급
배열의 차원 수를 반환합니다. PowerShell의 대부분의 배열에는 1차원만 있습니다. 다차원 배열을 만들고 있다고 생각할 때조차도; 다음 예제와 같습니다.
$a = @(
@(0,1),
@("b", "c"),
@(Get-Process)
)
[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1
PowerShell에서 진정한 다차원 배열을 빌드하려면 .Net Framework의 도움이 필요합니다. 다음 예제와 같습니다.
[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2
배열의 메소드
맑다
모든 요소 값을 배열 요소 형식의 기본값 설정합니다. 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
포Each
배열의 모든 요소를 반복하고 배열의 각 요소에 대해 지정된 작업을 수행할 수 있습니다.
ForEach 메서드에는 서로 다른 작업을 수행하는 여러 오버로드가 있습니다.
ForEach(scriptblock expression)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)
ForEach(scriptblock expression, object[] arguments)
ForEach(스크립트 블록 식)
ForEach(스크립트 블록 식, object[] 인수)
비고
구문에는 스크립트 블록을 사용해야 합니다. 괄호는 선택 사항입니다.
다음 예제에서는 foreach 메서드를 사용하는 방법을 보여 줍니다. 이 경우 의도는 배열에 있는 요소의 제곱 값을 생성하는 것입니다.
이 메서드는 PowerShell v4에 추가되었으며 이 아래 버전에서는 사용할 수 없습니다. 이전 버전의 경우 ForEach-Object Cmdlet에 대한 Pipelining 메서드를 사용하세요.
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
의 -ArgumentList매개 변수와 ForEach-Object 마찬가지로 이 arguments 매개 변수를 사용하면 인수를 수락하도록 구성된 스크립트 블록에 인수 배열을 전달할 수 있습니다.
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(문자열 속성 이름)
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
의 -ArgumentList매개 변수와 ForEach-Object 마찬가지로 이 arguments 매개 변수를 사용하면 인수를 수락하도록 구성된 스크립트 블록에 인수 배열을 전달할 수 있습니다.
비고
Windows PowerShell 3.0부터는 "스칼라 개체 및 컬렉션의 메서드"를 사용하여 컬렉션의 각 항목에 대한 속성을 검색하고 메서드를 실행할 수도 있습니다 about_methods
어디
배열의 요소를 필터링하거나 선택할 수 있습니다. 스크립트는 0, 빈 문자열 $false 또는 $null 다음에 표시할 요소가 아닌 다른 값으로 평가되어야 합니다. Where
이 메서드에 대한 Where 정의는 하나뿐입니다.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
Expression 필터링에 필요한 스크립트 블록이고, mode 선택적 인수는 추가 선택 기능을 허용하며numberToReturn, 선택적 인수는 필터에서 반환되는 항목 수를 제한하는 기능을 허용합니다.
비고
구문에는 스크립트 블록을 사용해야 합니다. 괄호는 선택 사항입니다.
다음 예제에서는 배열에서 모든 홀수를 선택하는 방법을 보여 줍니다.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
다음과 같은 선택 모드를 사용할 수 있습니다.
기본값
이 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) 항목을 반환하며 서로 바꿔 사용할 수 있습니다.
지난
$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 모드는 개체가 스크립트 블록 식 필터를 통과할 때까지 컬렉션의 모든 개체를 건너뜁니다. 그런 다음 테스트하지 않고 나머지 모든 컬렉션 항목을 반환합니다.
하나의 통과 항목만 테스트됩니다.
즉, 반환된 컬렉션에는 테스트되지 않은 통과 항목과 전달되지 않은 항목이 모두 포함됩니다.
반환되는 항목의 수는 인수에 값을 전달하여 제한할 수 있습니다 numberToReturn .
$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost
까지
모드는 Until 모드를 반전시킵니다 SkipUntil . 항목이 스크립트 블록 식을 통과할 때까지 컬렉션의 모든 항목을 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
비고
Until 둘 다 SkipUntil 항목 배치를 테스트하지 않는다는 전제 하에 작동합니다.
Until첫 번째 패스이전의 항목을 반환합니다.
SkipUntil첫 번째 전달 항목을 포함하여 첫 번째 패스이후의 모든 항목을 반환합니다.
분할
이 Split 모드는 컬렉션 항목을 두 개의 개별 컬렉션으로 분할하거나 그룹화합니다. scriptblock 표현식을 전달하는 것과 전달하지 않는 것입니다.
a numberToReturn 가 지정되면 첫 번째 컬렉션에는 지정된 값을 초과하지 않는 전달 항목이 포함됩니다.
식 필터를 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
...
배열의 멤버 가져 오기
Length 속성 및 SetValue 메서드와 같은 배열의 속성 및 메서드를 가져오려면 Get-Member cmdlet의 InputObject 매개 변수를 사용합니다.
배열을 Get-Member로 파이프하면 PowerShell은 항목을 한 번에 Get-Member 하나씩 보내고 배열에 있는 각 항목의 형식을 반환합니다(중복 무시).
-InputObject 매개 변수를 사용하는 경우 Get-Member 배열의 멤버를 반환합니다.
예를 들어, 다음 명령은 배열 변수의 멤버를 $a 가져옵니다.
Get-Member -InputObject $a
Get-Member cmdlet에 파이프되는 값 앞에 쉼표(,)를 입력하여 배열의 멤버를 가져올 수도 있습니다. 쉼표는 배열을 배열 배열의 두 번째 항목으로 만듭니다. Windows 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가 포함됩니다.
배열을 삭제하려면 배열에 $null 값을 할당합니다. 다음 명령은 변수에서 $a 배열을 삭제합니다.
$a = $null
cmdlet을 Remove-Item 사용할 수도 있지만 특히 큰 배열의 경우 값을 $null 할당하는 것이 더 빠릅니다.
0 또는 1로 구성된 배열
Windows PowerShell 3.0부터 0개 또는 1개의 개체 컬렉션에는 Count 및 Length 속성이 있습니다. 또한 하나의 개체 배열로 인덱싱할 수 있습니다. 이 기능을 사용하면 컬렉션을 필요로 하는 명령이 두 개 미만의 항목을 가져올 때 발생하는 스크립팅 오류를 방지할 수 있습니다.
다음 예제에서는 이 기능을 보여 줍니다.
제로 오브젝트
$a = $null
$a.Count
$a.Length
0
0
하나의 개체
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4