다음을 통해 공유


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-Objectbeginprocess 설명된 대로 , 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 선택 사항인 MemberNameArgumentList 매개 변수의 이름을 생략합니다.

예제 8: 두 개의 스크립트 블록에 ForEach-Object 사용

이 예제에서는 두 개의 스크립트 블록을 위치적으로 전달합니다. 모든 스크립트 블록은 Process 매개 변수에 바인딩됩니다. 그러나 BeginProcess 매개 변수에 전달된 것처럼 처리됩니다.

1..2 | ForEach-Object { 'begin' } { 'process' }

begin
process
process

예제 9: 두 개 이상의 스크립트 블록에 ForEach-Object 사용

이 예제에서는 네 개의 스크립트 블록을 위치적으로 전달합니다. 모든 스크립트 블록은 Process 매개 변수에 바인딩됩니다. 그러나 Begin, ProcessEnd 매개 변수에 전달된 것처럼 처리됩니다.

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 매개 변수를 사용하여 전달된 여러 스크립트 블록이 BeginEnd 매개 변수에 매핑됩니다. 이 매핑을 방지하려면 BeginEnd 매개 변수에 대한 명시적 값을 제공해야 합니다.

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

입력

PSObject

모든 개체를 이 cmdlet으로 파이프할 수 있습니다.

출력

PSObject

이 cmdlet은 입력에 의해 결정되는 개체를 반환합니다.

참고

Windows PowerShell에는 ForEach-Object다음과 같은 별칭이 포함되어 있습니다.

  • %
  • foreach

ForEach-Object cmdlet은 입력을 foreach 문으로 파이프할 수 없다는 점을 제외하고 foreach 문과 매우 유사합니다. 문에 대한 foreach 자세한 내용은 about_Foreach 참조하세요.

PowerShell 4.0부터 컬렉션에 사용하기 위해 WhereForEach 메서드가 추가되었습니다. 이러한 새로운 메서드에 대한 자세한 내용은 about_Arrays