ForEach-Object
입력 개체 컬렉션의 각 항목에 대해 작업을 수행합니다.
구문
ForEach-Object
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-Process] <ScriptBlock[]>
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ForEach-Object
[-InputObject <PSObject>]
[-MemberName] <String>
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Description
ForEach-Object
cmdlet은 입력 개체 컬렉션의 각 항목에 대해 작업을 수행합니다. 입력 개체를 cmdlet에 파이프하거나 InputObject 매개 변수를 사용하여 지정할 수 있습니다.
Windows PowerShell 3.0부터는 ForEach-Object
명령을 생성하는 두 가지 방법이 있습니다.
스크립트 블록 구문입니다. 스크립트 블록을 사용하여 작업을 지정할 수 있습니다. 스크립트 블록 내에서
$_
변수를 사용하여 현재 개체를 나타냅니다. 스크립트 블록은 Process 매개 변수의 값입니다. 스크립트 블록에는 PowerShell 스크립트가 포함될 수 있습니다.예를 들어 다음 명령은 컴퓨터에서 각 프로세스의 ProcessName 속성 값을 가져옵니다.
Get-Process | ForEach-Object {$_.ProcessName}
ForEach-Object
는begin
process
설명된 대로 ,end
및 블록을 지원합니다.메모
스크립트 블록은 호출자의 범위에서 실행됩니다. 따라서 블록은 해당 범위의 변수에 액세스할 수 있으며 cmdlet이 완료된 후 해당 범위에 유지되는 새 변수를 만들 수 있습니다.
간소화된 구문입니다. 간소화된 구문을 사용하여 파이프라인에서 개체의 속성 또는 메서드 이름을 지정합니다.
ForEach-Object
는 파이프라인의 각 개체에 대한 속성 또는 메서드의 값을 반환합니다.예를 들어 다음 명령은 컴퓨터의 각 프로세스에 대한 ProcessName 속성 값도 가져옵니다.
Get-Process | ForEach-Object ProcessName
간소화된 구문은 Windows PowerShell 3.0에서 도입되었습니다. 자세한 내용은 about_Simplified_Syntax 참조하세요.
예제
예제 1: 배열의 정수 나누기
이 예제에서는 3개의 정수 배열을 가져와서 각각 1024로 나눕니다.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
예제 2: 디렉터리에 있는 모든 파일의 길이 가져오기
이 예제에서는 PowerShell 설치 디렉터리 $PSHOME
파일 및 디렉터리를 처리합니다.
Get-ChildItem $PSHOME | ForEach-Object -Process {
if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }
}
개체가 디렉터리가 아닌 경우 스크립트 블록은 파일의 이름을 가져오고 Length 속성 값을 1024로 나눈 다음 공백(" ")을 추가하여 다음 항목과 구분합니다. cmdlet은 PSIsContainer 속성을 사용하여 개체가 디렉터리인지 여부를 확인합니다.
예제 3: 최신 시스템 이벤트에서 작동
이 예제에서는 시스템 이벤트 로그에서 텍스트 파일에 1000개의 가장 최근 이벤트를 씁니다. 현재 시간은 이벤트 처리 전후에 표시됩니다.
Get-EventLog -LogName System -Newest 1000 |
ForEach-Object -Begin {Get-Date} -Process {
Out-File -FilePath Events.txt -Append -InputObject $_.Message
} -End {Get-Date}
Get-EventLog
시스템 이벤트 로그에서 1000개의 가장 최근 이벤트를 가져오고 ForEach-Object
cmdlet으로 파이프합니다.
Begin 매개 변수는 현재 날짜 및 시간을 표시합니다. 다음으로 Process 매개 변수는 cmdlet을 사용하여 Out-File
events.txt 이름이 지정된 텍스트 파일을 만들고 해당 파일에 각 이벤트의 메시지 속성을 저장합니다. 마지막으로 End 매개 변수는 모든 처리가 완료된 후 날짜와 시간을 표시하는 데 사용됩니다.
예제 4: 레지스트리 키의 값 변경
다음은 키 아래의 모든 하위 키에서 HKCU:\Network
레지스트리 항목의 값을 대문자로 변경하는 예제입니다.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
이 형식을 사용하여 레지스트리 항목 값의 폼이나 콘텐츠를 변경할 수 있습니다.
네트워크 키의 각 하위 키는 로그온 시 다시 연결되는 매핑된 네트워크 드라이브를 나타냅니다.
RemotePath 항목에는 연결된 드라이브의 UNC 경로가 포함됩니다. 예를 들어 드라이브를 E:
매핑 \\Server\Share
하는 경우 RemotePath 레지스트리 값이 로 설정된 HKCU:\Network
상태에서 E 하위 키가 만들어집니다\\Server\Share
.
이 명령은 cmdlet을 Get-ItemProperty
사용하여 네트워크 키의 모든 하위 키와 Set-ItemProperty
cmdlet을 가져와 각 키의 RemotePath 레지스트리 항목 값을 변경합니다. 명령에서 Set-ItemProperty
경로는 레지스트리 키의 PSPath 속성 값입니다. 레지스트리 항목이 아니라 레지스트리 키를 나타내는 Microsoft .NET Framework 개체의 속성입니다. 이 명령은 REG_SZ 문자열인 RemotePath 값의 ToUpper() 메서드를 사용합니다.
Set-ItemProperty
각 키의 속성을 변경하므로 속성에 액세스하려면 ForEach-Object
cmdlet이 필요합니다.
예제 5: $null 자동 변수 사용
이 예제에서는 $null
자동 변수를 ForEach-Object
cmdlet에 파이핑하는 효과를 보여 주세요.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
PowerShell은 $null
명시적 자리 표시자로 처리하므로 ForEach-Object
cmdlet은 파이프된 다른 개체와 마찬가지로 $null
값을 생성합니다.
예제 6: 속성 값 가져오기
이 예제에서는 cmdlet의 MemberName 매개 변수를 사용하여 설치된 모든 PowerShell 모듈의 ForEach-Object
속성 값을 가져옵니다.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | foreach Path
두 번째 명령은 첫 번째 명령과 동일합니다. cmdlet의 Foreach
별칭을 ForEach-Object
사용하고 선택 사항인 MemberName 매개 변수의 이름을 생략합니다.
이 ForEach-Object
cmdlet은 형식을 변경하지 않고 값을 가져오므로 속성 값 형식을 변경하는 Format cmdlet 또는 Select-Object
cmdlet과 달리 속성 값을 가져오는 데 유용합니다.
예제 7: 모듈 이름을 구성 요소 이름으로 분할
이 예제에서는 두 개의 점으로 구분된 모듈 이름을 해당 구성 요소 이름으로 분할하는 세 가지 방법을 보여줍니다. 이 명령은 문자열의 Split 메서드를 호출합니다. 세 명령은 서로 다른 구문을 사용하지만 동일하고 서로 교환할 수 있습니다. 출력은 세 가지 경우 모두 동일합니다.
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host
첫 번째 명령은 스크립트 블록과 현재 개체 연산자 $_
포함하는 기존 구문을 사용합니다. 점 구문을 사용하여 메서드와 괄호를 지정하여 구분 기호 인수를 묶습니다.
두 번째 명령은 MemberName 매개 변수를 사용하여 Split 메서드와 ArgumentList 매개 변수를 지정하여 점(.
)을 분할 구분 기호로 식별합니다.
세 번째 명령은 cmdlet의 foreach
별칭을 사용하고 ForEach-Object
선택 사항인 MemberName 및 ArgumentList 매개 변수의 이름을 생략합니다.
예제 8: 두 개의 스크립트 블록에 ForEach-Object 사용
이 예제에서는 두 개의 스크립트 블록을 위치적으로 전달합니다. 모든 스크립트 블록은 Process 매개 변수에 바인딩됩니다. 그러나 Begin 및 Process 매개 변수에 전달된 것처럼 처리됩니다.
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
예제 9: 두 개 이상의 스크립트 블록에 ForEach-Object 사용
이 예제에서는 네 개의 스크립트 블록을 위치적으로 전달합니다. 모든 스크립트 블록은 Process 매개 변수에 바인딩됩니다. 그러나 Begin, Process 및 End 매개 변수에 전달된 것처럼 처리됩니다.
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
메모
첫 번째 스크립트 블록은 항상 begin
블록에 매핑되고, 마지막 블록은 end
블록에 매핑되고, 두 개의 중간 블록은 process
블록에 매핑됩니다.
예제 10: 각 파이프라인 항목에 대해 여러 스크립트 블록 실행
이전 예제와 같이 Process 매개 변수를 사용하여 전달된 여러 스크립트 블록이 Begin 및 End 매개 변수에 매핑됩니다. 이 매핑을 방지하려면 Begin 및 End 매개 변수에 대한 명시적 값을 제공해야 합니다.
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
매개 변수
-ArgumentList
메서드 호출에 대한 인수 배열을 지정합니다. ArgumentList의 동작에 대한 자세한 내용은 about_Splatting 참조하세요.
이 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.
형식: | Object[] |
별칭: | Args |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-Begin
이 cmdlet이 입력 개체를 처리하기 전에 실행되는 스크립트 블록을 지정합니다. 이 스크립트 블록은 전체 파이프라인에 대해 한 번만 실행됩니다. 블록에 대한 begin
자세한 내용은 about_Functions 참조하세요.
형식: | ScriptBlock |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-Confirm
cmdlet을 실행하기 전에 확인 메시지를 표시합니다.
형식: | SwitchParameter |
별칭: | cf |
Position: | Named |
Default value: | False |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-End
이 cmdlet이 모든 입력 개체를 처리한 후 실행되는 스크립트 블록을 지정합니다. 이 스크립트 블록은 전체 파이프라인에 대해 한 번만 실행됩니다. 블록에 대한 end
자세한 내용은 about_Functions 참조하세요.
형식: | ScriptBlock |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-InputObject
입력 개체를 지정합니다.
ForEach-Object
각 입력 개체에서 스크립트 블록 또는 작업 문을 실행합니다. 개체가 포함된 변수를 입력하거나 개체를 가져오는 명령이나 식을 입력합니다.
명령 결과를 파이핑하는 대신 ForEach-Object
매개 변수를 ForEach-Object
사용하여 InputObject 값을 단일 개체로 처리합니다. 값이 명령의 결과인 컬렉션(예: -InputObject (Get-Process)
)인 경우에도 마찬가지입니다.
InputObject는 개체의 배열 또는 컬렉션에서 개별 속성을 반환할 수 없으므로 정의된 속성에 특정 값이 있는 개체의 개체 컬렉션에 대한 작업을 수행하는 데 사용하는 ForEach-Object
경우 이 항목의 예제와 같이 파이프라인에서 사용하는 ForEach-Object
것이 좋습니다.
형식: | PSObject |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | True |
와일드카드 문자 허용: | False |
-MemberName
가져올 멤버 속성의 이름 또는 호출할 멤버 메서드를 지정합니다. 멤버는 정적 멤버가 아닌 인스턴스 멤버여야 합니다.
와일드카드 문자는 허용되지만 결과 문자열이 고유 값으로 확인되는 경우에만 작동합니다.
예를 들어 Get-Process | foreach -MemberName *Name
실행하는 경우 와일드카드 패턴이 둘 이상의 멤버와 일치하여 명령이 실패합니다.
이 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.
형식: | String |
Position: | 0 |
Default value: | None |
필수: | True |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | True |
-Process
각 입력 개체에 대해 수행되는 작업을 지정합니다. 이 스크립트 블록은 파이프라인의 모든 개체에 대해 실행됩니다. 블록에 대한 process
자세한 내용은 about_Functions 참조하세요.
프로세스 매개 변수에 여러 스크립트 블록을 제공하는 경우 첫 번째 스크립트 블록은 항상 블록에 begin
매핑됩니다. 두 개의 스크립트 블록만 있는 경우 두 번째 블록은 process
블록에 매핑됩니다. 세 개 이상의 스크립트 블록이 있는 경우 첫 번째 스크립트 블록은 항상 begin
블록에 매핑되고, 마지막 블록은 end
블록에 매핑되고, 중간 블록은 process
블록에 매핑됩니다.
형식: | ScriptBlock[] |
Position: | 0 |
Default value: | None |
필수: | True |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-RemainingScripts
Process 매개 변수에 의해 수행되지 않는 모든 스크립트 블록을 지정합니다.
이 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.
형식: | ScriptBlock[] |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-WhatIf
cmdlet이 실행되면 어떻게 되는지 보여 주세요. cmdlet이 실행되지 않습니다.
형식: | SwitchParameter |
별칭: | wi |
Position: | Named |
Default value: | False |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
입력
모든 개체를 이 cmdlet으로 파이프할 수 있습니다.
출력
이 cmdlet은 입력에 의해 결정되는 개체를 반환합니다.
참고
Windows PowerShell에는 ForEach-Object
다음과 같은 별칭이 포함되어 있습니다.
%
foreach
ForEach-Object
cmdlet은 입력을 foreach
문으로 파이프할 수 없다는 점을 제외하고 foreach
문과 매우 유사합니다. 문에 대한 foreach
자세한 내용은 about_Foreach 참조하세요.
PowerShell 4.0부터 컬렉션에 사용하기 위해 Where
및 ForEach
메서드가 추가되었습니다. 이러한 새로운 메서드에 대한 자세한 내용은 about_Arrays