다음을 통해 공유


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

cmdlet은 ForEach-Object 입력 개체 컬렉션의 각 항목에 대해 작업을 수행합니다. 입력 개체를 cmdlet에 파이프하거나 InputObject 매개 변수를 사용하여 지정할 수 있습니다.

Windows PowerShell 3.0부터 명령을 생성하는 ForEach-Object 방법에는 두 가지가 있습니다.

  • 스크립트 블록입니다. 스크립트 블록을 사용하여 작업을 지정할 수 있습니다. 스크립트 블록 내에서 변수를 $_ 사용하여 현재 개체를 나타냅니다. 스크립트 블록은 Process 매개 변수의 값입니다. 스크립트 블록에는 PowerShell 스크립트가 포함될 수 있습니다.

    예를 들어 다음 명령은 컴퓨터에서 각 프로세스의 ProcessName 속성 값을 가져옵니다.

    Get-Process | ForEach-Object {$_.ProcessName}

    ForEach-Objectbeginabout_functions 설명된 대로 < processa0/a0> 및 end 블록을 지원합니다.

    참고 항목

    스크립트 블록은 호출자의 범위에서 실행됩니다. 따라서 블록은 해당 범위의 변수에 액세스할 수 있으며 cmdlet이 완료된 후 해당 범위에 유지되는 새 변수를 만들 수 있습니다.

  • Operation 문입니다. 자연어와 훨씬 유사한 연산 문을 작성할 수도 있습니다. 작업 문을 사용하여 속성 값을 지정하거나 메서드를 호출할 수 있습니다. 작업 문은 Windows PowerShell 3.0에서 도입되었습니다.

    예를 들어 다음 명령은 컴퓨터의 각 프로세스에 대한 ProcessName 속성 값도 가져옵니다.

    Get-Process | ForEach-Object ProcessName

예제

예제 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개의 가장 최근 이벤트를 가져오고 cmdlet으로 ForEach-Object 파이프합니다. Begin 매개 변수는 현재 날짜 및 시간을 표시합니다. 다음으로 Process 매개 변수는 cmdlet을 사용하여 Out-File events.txt 이름이 지정된 텍스트 파일을 만들고 해당 파일에 각 이벤트의 메시지 속성을 저장합니다. 마지막으로 End 매개 변수는 모든 처리가 완료된 후 날짜와 시간을 표시하는 데 사용됩니다.

예제 4: 레지스트리 키의 값 변경

다음은 키 아래 HKCU:\Network모든 하위 키에 있는 RemotePath 레지스트리 항목의 값을 대문자 텍스트로 변경하는 예제입니다.

Get-ItemProperty -Path HKCU:\Network\* |
  ForEach-Object {
    Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
  }

이 형식을 사용하여 레지스트리 항목 값의 형식이나 내용을 변경할 수 있습니다.

네트워크 키의 각 하위 키는 로그온 시 다시 연결되는 매핑된 네트워크 드라이브를 나타냅니다. RemotePath 항목에는 연결된 드라이브의 UNC 경로가 포함됩니다. 예를 들어 드라이브를 매핑 E: 하는 경우 RemotePath 레지스트리 값이 />로 설정된 \\Server\Share상태에서 E 하위 키가 만들어집니다HKCU:\Network.\\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 자동 변수 사용

이 예제에서는 cmdlet에 자동 변수를 $null 파이핑하는 ForEach-Object 효과를 보여 주세요.

1, 2, $null, 4 | ForEach-Object {"Hello"}

Hello
Hello
Hello
Hello

PowerShell은 $null 명시적 자리 표시자로 ForEach-Object 처리되므로 cmdlet은 파이프된 다른 개체에 대해 $null 와 마찬가지로 값을 생성합니다.

예제 6: 속성 값 가져오기

이 예제에서는 cmdlet의 MemberName 매개 변수를 사용하여 설치된 모든 PowerShell 모듈의 ForEach-Object Path 속성 값을 가져옵니다.

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 별칭을 사용하고 선택 사항인 MemberNameArgumentList 매개 변수의 이름을 생략합니다.ForEach-Object

예제 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파이핑하는 대신 InputObject 매개 변수를 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

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

PowerShell 4.0 Where 부터 컬렉션에 ForEach 사용할 메서드가 추가되었습니다. 이러한 새로운 메서드 에 대한 자세한 내용은 about_arrays