ForEach-Object

입력 개체 컬렉션의 각 항목에 대해 작업을 수행합니다.

Syntax

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>]
ForEach-Object
            -Parallel <scriptblock>
            [-InputObject <psobject>]
            [-ThrottleLimit <int>]
            [-TimeoutSeconds <int>]
            [-AsJob]
            [-UseNewRunspace]
            [-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

  • 병렬 실행 스크립트 블록입니다. PowerShell 7.0부터 각 스크립트 블록을 병렬로 실행하는 세 번째 매개 변수 집합을 사용할 수 있습니다. ThrottleLimit 매개 변수는 한 번에 실행되는 병렬 스크립트의 수를 제한합니다. 이전과 마찬가지로 이 변수를 $_ 사용하여 스크립트 블록의 현재 입력 개체를 나타냅니다. $using: 키워드(keyword) 사용하여 실행 중인 스크립트에 변수 참조를 전달합니다.

    PowerShell 7에서는 최대 격리를 보장하기 위해 각 루프 반복에 대해 새 Runspace가 만들어집니다. 새 Runspace를 만드는 것에 비해 수행 중인 작업이 작거나 상당한 작업을 수행하는 반복이 많은 경우 큰 성능 및 리소스 적중이 될 수 있습니다. PowerShell 7.1부터 Runspace 풀의 Runspace는 기본적으로 다시 사용됩니다. ThrottleLimit 매개 변수는 Runspace 풀 크기를 설정합니다. 기본 Runspace 풀 크기는 5입니다. UseNewRunspace 스위치를 사용하여 각 반복에 대해 새 Runspace만들 수 있습니다.

    기본적으로 병렬 스크립트 블록은 병렬 작업을 시작한 호출자의 현재 작업 디렉터리를 사용합니다.

    자세한 내용은 이 문서의 NOTES 섹션을 참조하세요.

예제

예제 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개의 가장 최근 이벤트를 씁니다. 현재 시간은 이벤트 처리 전후에 표시됩니다.

$Events = Get-EventLog -LogName System -Newest 1000
$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}

Get-EventLog 시스템 이벤트 로그에서 가장 최근 이벤트 1000을 가져오고 변수에 $Events 저장합니다. $Events 는 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: 드라이브를 \\Server\Share매핑하는 경우 RemotePath 레지스트리 값이 <>/>로 설정된 \\Server\Share상태에서 E 하위 키가 만들어집니다HKCU:\Network.

이 명령은 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

예제 11: 병렬 일괄 처리로 느린 스크립트 실행

이 예제에서는 문자열을 평가하고 1초 동안 절전 모드인 스크립트 블록을 실행합니다.

$Message = "Output:"

1..8 | ForEach-Object -Parallel {
    "$using:Message $_"
    Start-Sleep 1
} -ThrottleLimit 4

Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8

입력이 4개의 일괄 처리로 처리되도록 ThrottleLimit 매개 변수 값은 4로 설정됩니다. $using: 키워드(keyword) 각 병렬 스크립트 블록에 변수를 $Message 전달하는 데 사용됩니다.

예제 12: 로그 항목을 병렬로 검색

이 예제에서는 로컬 Windows 컴퓨터의 5개 시스템 로그에서 50,000개의 로그 항목을 검색합니다.

$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'

$logEntries = $logNames | ForEach-Object -Parallel {
    Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5

$logEntries.Count

50000

병렬 매개 변수는 각 입력 로그 이름에 대해 병렬로 실행되는 스크립트 블록을 지정합니다. ThrottleLimit 매개 변수는 다섯 개의 스크립트 블록이 모두 동시에 실행되도록 합니다.

예제 13: 작업으로 병렬로 실행

이 예제에서는 한 번에 두 개의 스크립트 블록을 병렬로 실행하는 작업을 만듭니다.

PS> $job = 1..10 | ForEach-Object -Parallel {
    "Output: $_"
    Start-Sleep 1
} -ThrottleLimit 2 -AsJob

PS> $job

Id     Name            PSJobTypeName   State         HasMoreData     Location      Command
--     ----            -------------   -----         -----------     --------      -------
23     Job23           PSTaskJob       Running       True            PowerShell    …

PS> $job.ChildJobs

Id     Name            PSJobTypeName   State         HasMoreData     Location      Command
--     ----            -------------   -----         -----------     --------      -------
24     Job24           PSTaskChildJob  Completed     True            PowerShell    …
25     Job25           PSTaskChildJob  Completed     True            PowerShell    …
26     Job26           PSTaskChildJob  Running       True            PowerShell    …
27     Job27           PSTaskChildJob  Running       True            PowerShell    …
28     Job28           PSTaskChildJob  NotStarted    False           PowerShell    …
29     Job29           PSTaskChildJob  NotStarted    False           PowerShell    …
30     Job30           PSTaskChildJob  NotStarted    False           PowerShell    …
31     Job31           PSTaskChildJob  NotStarted    False           PowerShell    …
32     Job32           PSTaskChildJob  NotStarted    False           PowerShell    …
33     Job33           PSTaskChildJob  NotStarted    False           PowerShell    …

ThrottleLimit 매개 변수는 한 번에 실행되는 병렬 스크립트 블록의 수를 제한합니다. AsJob 매개 변수를 사용하면 cmdlet이 ForEach-Object 출력을 콘솔로 스트리밍하는 대신 작업 개체를 반환합니다. 변수는 $job 출력 데이터를 수집하고 실행 상태를 모니터링하는 작업 개체를 받습니다. 이 속성에는 $job.ChildJobs 병렬 스크립트 블록을 실행하는 자식 작업이 포함됩니다.

예제 14: 스레드 안전 변수 참조 사용

이 예제에서는 스크립트 블록을 병렬로 호출하여 고유하게 명명된 Process 개체를 수집합니다.

$threadSafeDictionary = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
Get-Process | ForEach-Object -Parallel {
    $dict = $using:threadSafeDictionary
    $dict.TryAdd($_.ProcessName, $_)
}

$threadSafeDictionary["pwsh"]

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     82    82.87     130.85      15.55    2808   2 pwsh

ConcurrentDictionary 개체의 단일 인스턴스가 각 스크립트 블록에 전달되어 개체를 수집합니다. ConcurrentDictionary는 스레드로부터 안전하므로 각 병렬 스크립트에서 수정해도 안전합니다. System.Collections.Generic.Dictionary와 같은 스레드로부터 안전하지 않은 개체는 여기서 사용하기에 안전하지 않습니다.

참고 항목

이 예제에서는 병렬 매개 변수를 매우 비효율적으로 사용합니다. 스크립트는 단순히 동시 사전 개체에 입력 개체를 추가합니다. 개별 스레드에서 각 스크립트를 호출하는 오버헤드는 사소하고 가치가 없습니다. 병렬 스위치 없이 정상적으로 실행하는 ForEach-Object 것이 훨씬 더 효율적이고 빠릅니다. 이 예제는 스레드 안전 변수를 사용하는 방법만 보여 줍니다.

예제 15: 병렬 실행을 사용하여 오류 작성

이 예제에서는 오류 스트림에 병렬로 씁니다. 여기서 작성된 오류 순서는 임의입니다.

1..3 | ForEach-Object -Parallel {
    Write-Error "Error: $_"
}

Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2

예제 16: 병렬 실행에서 오류 종료

이 예제에서는 하나의 병렬 실행 scriptblock에서 종료 오류를 보여 줍니다.

1..5 | ForEach-Object -Parallel {
    if ($_ -eq 3)
    {
        throw "Terminating Error: $_"
    }

    Write-Output "Output: $_"
}

Exception: Terminating Error: 3
Output: 1
Output: 4
Output: 2
Output: 5

Output: 3 는 해당 반복에 대한 병렬 scriptblock이 종료되었기 때문에 기록되지 않습니다.

참고 항목

PipelineVariable 일반 매개 변수 변수는 키워드(keyword) 경우에도 $using: 시나리오에서 Foreach-Object -Parallel 지원되지 않습니다.

예제 17: 중첩된 병렬 스크립트 ScriptBlockSet에서 변수 전달

범위가 지정된 scriptblock 외부에서 변수를 Foreach-Object -Parallel 만들고 키워드(keyword) 스크립트 블록 $using 내에서 사용할 수 있습니다.

$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
    $using:test1
}

TestA
TestA

# You CANNOT create a variable inside a scoped scriptblock
# to be used in a nested foreach parallel scriptblock.
$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
    $using:test1
    $test2 = 'TestB'
    1..2 | Foreach-Object -Parallel {
        $using:test2
    }
}

Line |
   2 |  1..2 | Foreach-Object -Parallel {
     |         ~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The value of the using variable '$using:test2' can't be retrieved because it has not been
     | set in the local session.

중첩된 scriptblock은 변수에 $test2 액세스할 수 없으며 오류가 throw됩니다.

예제 18: 스크립트를 병렬로 실행하는 여러 작업 만들기

ThrottleLimit 매개 변수는 각 인스턴스에서 실행되는 병렬 스크립트 수를 ForEach-Object -Parallel제한합니다. AsJob 매개 변수를 사용할 때 만들 수 있는 작업의 수는 제한되지 않습니다. 작업 자체는 동시에 실행되므로 각각 동시 scriptblock의 제한 수까지 실행되는 여러 병렬 작업을 만들 수 있습니다.

$jobs = for ($i=0; $i -lt 10; $i++) {
    1..10 | ForEach-Object -Parallel {
        ./RunMyScript.ps1
    } -AsJob -ThrottleLimit 5
}

$jobs | Receive-Job -Wait

이 예제에서는 10개의 실행 중인 작업을 만듭니다. 각 작업은 더 이상 5개의 스크립트를 동시에 실행하지 않습니다. 동시에 실행되는 총 인스턴스 수는 50개로 제한됩니다(ThrottleLimit의 5배인 10개 작업).

매개 변수

-ArgumentList

메서드 호출에 대한 인수 배열을 지정합니다. ArgumentList동작에 대한 자세한 내용은 about_Splatting 참조하세요.

이 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-AsJob

병렬 호출이 PowerShell 작업으로 실행되도록 합니다. 실행 중인 스크립트 블록의 출력 대신 단일 작업 개체가 반환됩니다. 작업 개체에는 실행되는 각 병렬 스크립트 블록에 대한 자식 작업이 포함됩니다. 작업 개체는 모든 PowerShell 작업 cmdlet에서 실행 상태를 모니터링하고 데이터를 검색하는 데 사용할 수 있습니다.

이 매개 변수는 PowerShell 7.0에서 도입되었습니다.

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Begin

이 cmdlet이 입력 개체를 처리하기 전에 실행되는 스크립트 블록을 지정합니다. 이 스크립트 블록은 전체 파이프라인에 대해 한 번만 실행됩니다. 블록에 대한 begin 자세한 내용은 about_Functions 참조하세요.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Confirm

cmdlet을 실행하기 전에 확인 메시지가 표시됩니다.

Type:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-End

이 cmdlet이 모든 입력 개체를 처리한 후 실행되는 스크립트 블록을 지정합니다. 이 스크립트 블록은 전체 파이프라인에 대해 한 번만 실행됩니다. 블록에 대한 end 자세한 내용은 about_Functions 참조하세요.

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

입력 개체를 지정합니다. ForEach-Object 는 각 입력 개체에서 스크립트 블록 또는 작업 문을 실행합니다. 개체를 포함하는 변수를 입력하거나 개체를 가져오는 명령 또는 식을 입력하세요.

명령 결과를 ForEach-Object파이핑하는 대신 InputObject 매개 변수를 ForEach-Object사용하여 InputObject 값을 단일 개체로 처리합니다. 값이 명령의 결과인 컬렉션인 경우에도 마찬가지입니다(예: -InputObject (Get-Process).). InputObject는 개체의 배열 또는 컬렉션에서 개별 속성을 반환할 수 없으므로 정의된 속성에 특정 값이 있는 개체의 개체 컬렉션에 대한 작업을 수행하는 데 사용하는 ForEach-Object 경우 이 항목의 예제와 같이 파이프라인에서 사용하는 ForEach-Object 것이 좋습니다.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-MemberName

가져올 속성 또는 호출할 메서드를 지정합니다.

와일드카드 문자는 허용되지만 결과 문자열이 고유 값으로 확인되는 경우에만 작동합니다. 예를 들어 실행Get-Process | ForEach -MemberName *Name하면 wild카드 패턴이 둘 이상의 멤버와 일치하여 명령이 실패합니다.

이 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:True

-Parallel

입력 개체의 병렬 처리에 사용할 스크립트 블록을 지정합니다. 작업을 설명하는 스크립트 블록을 입력합니다.

이 매개 변수는 PowerShell 7.0에서 도입되었습니다.

Type:ScriptBlock
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Process

각 입력 개체에 대해 수행되는 작업을 지정합니다. 이 스크립트 블록은 파이프라인의 모든 개체에 대해 실행됩니다. 블록에 대한 process 자세한 내용은 about_Functions 참조하세요.

프로세스 매개 변수에 여러 스크립트 블록을 제공하는 경우 첫 번째 스크립트 블록은 항상 블록에 begin 매핑됩니다. 스크립트 블록이 두 개뿐이면 두 번째 블록이 블록에 process 매핑됩니다. 세 개 이상의 스크립트 블록이 있는 경우 첫 번째 스크립트 블록은 항상 블록에 begin 매핑되고, 마지막 블록은 블록에 end 매핑되고, 그 사이의 블록은 모두 블록에 process 매핑됩니다.

Type:ScriptBlock[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-RemainingScripts

Process 매개 변수에 의해 수행되지 않는 모든 스크립트 블록을 지정합니다.

이 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.

Type:ScriptBlock[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ThrottleLimit

병렬로 실행되는 스크립트 블록 수를 지정합니다. 실행 중인 스크립트 블록 수가 ThrottleLimit 아래로 떨어질 때까지 입력 개체가 차단됩니다. 기본값은 5입니다.

ThrottleLimit 매개 변수는 각 인스턴스에서 실행되는 병렬 스크립트 수를 ForEach-Object -Parallel제한합니다. AsJob 매개 변수를 사용할 때 만들 수 있는 작업의 수는 제한되지 않습니다. 작업 자체는 동시에 실행되므로 각각 동시 scriptblock의 제한 수까지 실행되는 여러 병렬 작업을 만들 수 있습니다.

이 매개 변수는 PowerShell 7.0에서 도입되었습니다.

Type:Int32
Position:Named
Default value:5
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TimeoutSeconds

모든 입력이 병렬로 처리될 때까지 대기할 시간(초)을 지정합니다. 지정된 시간 제한 시간이 지나면 실행 중인 모든 스크립트가 중지됩니다. 또한 처리할 입력 개체를 다시 기본 무시됩니다. 기본값은 0 시간 제한을 ForEach-Object -Parallel 사용하지 않도록 설정하고 무기한으로 실행할 수 있습니다. 명령줄에서 Ctrl+C를 입력하면 실행 중인 ForEach-Object -Parallel 명령이 중지됩니다. 이 매개 변수는 AsJob 매개 변수와 함께 사용할 수 없습니다.

이 매개 변수는 PowerShell 7.0에서 도입되었습니다.

Type:Int32
Position:Named
Default value:0
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-UseNewRunspace

병렬 호출이 Runspace 풀에서 Runspace를 다시 사용하는 대신 모든 루프 반복에 대한 새 Runspace를 만듭니다.

이 매개 변수는 PowerShell 7.1에서 도입되었습니다.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WhatIf

cmdlet이 실행될 경우 결과 동작을 표시합니다. cmdlet이 실행되지 않습니다.

Type:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

입력

PSObject

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

출력

PSObject

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

참고

PowerShell에는 다음 별칭이 포함됩니다.ForEach-Object

  • 모든 플랫폼:
    • %
    • foreach

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

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

ForEach-Object -Parallel사용:

  • 매개 변수 집합은 ForEach-Object -Parallel PowerShell의 내부 API를 사용하여 새 Runspace에서 각 스크립트 블록을 실행합니다. 이는 순차적 처리로 정상적으로 실행되는 ForEach-Object 것보다 훨씬 더 많은 오버헤드입니다. 스크립트 블록이 수행하는 작업에 비해 병렬로 실행하는 오버헤드가 작은 경우 병렬을 사용하는 것이 중요합니다. 예시:

    • 다중 코어 컴퓨터에서 계산 집약적 스크립트
    • 결과를 기다리거나 파일 작업을 수행하는 데 시간을 소비하는 스크립트

    병렬 매개 변수를 사용하면 스크립트가 평소보다 훨씬 느리게 실행될 수 있습니다. 특히 병렬 스크립트가 사소한 경우입니다. 병렬실험하여 도움이 될 수 있는 위치를 검색합니다.

  • 병렬로 실행하는 경우 ScriptProperties 또는 ScriptMethods데코레이트된 개체는 스크립트가 원래 연결된 것과 다른 Runspace에서 실행되는 경우 제대로 작동하도록 보장할 수 없습니다.

    Scriptblock 호출은 실제로 호출되는 위치에 관계없이 항상 홈 런스페이스에서 실행하려고 시도합니다. 그러나 ForEach-Object -Parallel 사용 후 삭제되는 임시 Runspace를 만들므로 스크립트를 더 이상 실행할 수 있는 Runspace가 없습니다.

    이 동작은 홈 런스페이스가 여전히 존재하는 한 작동할 수 있습니다. 그러나 스크립트가 홈 런스페이스가 아닌 호출자의 Runspace에만 있는 외부 변수에 종속된 경우 원하는 결과를 얻지 못할 수 있습니다.

  • 종료되지 않는 오류는 scriptblock을 병렬로 실행하면서 cmdlet 오류 스트림에 기록됩니다. 병렬 scriptblock 실행 순서는 비결정적이므로 오류 스트림에 오류가 나타나는 순서는 임의입니다. 마찬가지로 경고, 자세한 정보 또는 정보와 같은 다른 데이터 스트림에 기록된 메시지는 해당 데이터 스트림에 확정되지 않은 순서로 기록됩니다.

    예외와 같은 오류를 종료하면 발생하는 scriptblock의 개별 병렬 인스턴스가 종료됩니다. 하나의 scriptblock에서 종료 오류가 발생하면 cmdlet이 종료 Foreach-Object 되지 않을 수 있습니다. 병렬로 실행되는 다른 스크립트 블록은 종료 오류가 발생하지 않는 한 계속 실행됩니다. 종료 오류는 오류 데이터 스트림에 FullyQualifiedErrorId PSTaskException 가 있는 ErrorRecord기록됩니다. 종료 오류는 PowerShell trycatch/또는 trap 블록을 사용하여 종료되지 않는 오류로 변환할 수 있습니다.

  • PipelineVariable 일반 매개 변수 변수는 키워드(keyword) 경우에도 병렬 시나리오에서 $using: 지원되지 않습니다.

    Important

    매개 변수 집합은 ForEach-Object -Parallel 별도의 프로세스 스레드에서 스크립트 블록을 병렬로 실행합니다. $using: 이 키워드(keyword) cmdlet 호출 스레드에서 실행 중인 각 스크립트 블록 스레드로 변수 참조를 전달할 수 있습니다. 스크립트 블록은 서로 다른 스레드에서 실행되므로 참조로 전달된 개체 변수를 안전하게 사용해야 합니다. 일반적으로 변경되지 않는 참조된 개체에서 읽어도 안전합니다. 그러나 개체 상태가 수정되는 경우 .NET System.Collection.Concurrent 형식과 같은 스레드로부터 안전한 개체를 사용해야 합니다(예제 14 참조).