배열 정보
간단한 설명
항목 컬렉션을 저장하도록 설계된 데이터 구조인 배열에 대해 설명합니다.
자세한 설명
배열은 항목 컬렉션을 저장하도록 설계된 데이터 구조입니다. 항목은 형식이 같거나 형식이 다를 수 있습니다.
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 참조하세요.
배열 요소 액세스 및 사용
배열 읽기
변수 이름을 사용하여 배열을 참조할 수 있습니다. 배열의 모든 요소를 표시하려면 배열 이름을 입력합니다. 예를 들어 가 9까지 정수 0, 1, 2를 포함하는 배열이라고 가정 $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
배열에 있는 항목 수를 확인하려면 속성 또는 해당 별칭을 Count
사용합니다Length
. Longlength
는 배열에 2,147,483,647개 이상의 요소가 포함된 경우에 유용합니다.
$a = 0..9
$a.Count
$a.Length
10
10
순위
배열의 차원 수를 반환합니다. PowerShell의 대부분의 배열에는 하나의 차원만 있습니다. 다차원 배열을 빌드하고 있다고 생각되더라도 다음 예제와 같습니다.
$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
ForEach
배열의 모든 요소를 반복하고 배열의 각 요소에 대해 지정된 작업을 수행할 수 있습니다.
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(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
참고
구문에는 스크립트 블록을 사용해야 합니다. 괄호는 선택 사항입니다.
다음 예제에서는 foreach 메서드를 사용하는 방법을 보여줍니다. 이 경우 의도는 배열에 있는 요소의 정사각형 값을 생성하는 것입니다.
이 메서드는 PowerShell v4에 추가되었으며 아래 버전에서는 사용할 수 없습니다. 이전 버전의 경우 pipelining 메서드를 ForEach-Object Cmdlet에 사용하세요.
$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9
의 ForEach-Object
arguments
매개 변수와 마찬가지로 -ArgumentList
매개 변수를 사용하면 인수 배열을 수락하도록 구성된 스크립트 블록에 전달할 수 있습니다.
ForEach(type 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[] 인수)
마지막으로 메서드 ForEach
를 사용하여 컬렉션의 모든 항목에서 메서드를 실행할 수 있습니다.
("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE
의 ForEach-Object
매개 변수와 마찬가지로 -ArgumentList
매개 변수를 arguments
사용하면 인수 배열을 수락하도록 구성된 스크립트 블록에 전달할 수 있습니다.
참고
Windows PowerShell 3.0부터 속성 검색 및 컬렉션의 각 항목에 대한 메서드 실행은 "스칼라 개체 및 컬렉션의 메서드"를 사용하여 수행할 수도 있습니다. 여기에서 자세한 내용을 확인할 수 about_methods
Where
배열의 요소를 필터링하거나 선택할 수 있습니다. 스크립트는 0( 0), 빈 문자열 $false
또는 $null
요소 다음에 표시할 경우와 다른 것으로 평가되어야 합니다. Where
메서드에 대한 정의가 하나 있습니다 Where
.
Where(scriptblock expression[, WhereOperatorSelectionMode mode
[, int numberToReturn]])
는 Expression
필터링에 필요한 scriptblock이고, mode
선택적 인수는 추가 선택 기능을 허용하며 numberToReturn
, 선택적 인수를 사용하면 필터에서 반환되는 항목 수를 제한할 수 있습니다.
참고
구문에는 스크립트 블록을 사용해야 합니다. 괄호는 선택 사항입니다.
다음 예제에서는 배열에서 모든 홀수 숫자를 선택하는 방법을 보여 줍니다.
(0..9).Where{ $_ % 2 }
1
3
5
7
9
다음 선택 모드를 사용할 수 있습니다.
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
) 항목을 반환하며 서로 바꿔 사용할 수 있습니다.
마지막
$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
항목 처리를 중지합니다.
즉, 메서드에서 전달되지 않는 항목의 첫 번째 집합을 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
는 첫 번째 패스 전에 항목을 반환 합니다.
SkipUntil
는 첫 번째 전달 항목을 포함하여 첫 번째 패스이후의 모든 항목을 반환합니다.
분할
모드는 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
...
배열의 멤버 가져오기
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의 값을 제외한 배열의 $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개의 개체 컬렉션에는 Count 및 Length 속성이 있습니다. 또한 한 개체의 배열로 인덱싱할 수 있습니다. 이 기능을 사용하면 컬렉션이 필요한 명령이 두 개 미만의 항목을 얻을 때 발생하는 스크립팅 오류를 방지할 수 있습니다.
다음 예제에서는 이 기능을 보여 줍니다.
0개 개체
$a = $null
$a.Count
$a.Length
0
0
하나의 개체
$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4