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