ForEach-Object cmdlet을 사용하면 현재 파이프라인 개체의 스크립트 블록과 $_ 설명자를 통해 파이프라인에 있는 각 개체에 대해 명령을 실행할 수 있습니다. 이 cmdlet은 복잡한 작업을 수행하는 데 사용할 수 있습니다.
이 cmdlet은 데이터를 조작하여 보다 사용하기 쉽게 만드는 데 유용할 수 있습니다. 예를 들어 WMI의 Win32_LogicalDisk 클래스를 사용하여 각 로컬 디스크의 사용 가능한 공간 정보를 반환할 수 있습니다. 그러나 이 정보는 다음과 같이 쉽게 읽을 수 없는 바이트 단위로 반환됩니다.
PS> Get-WmiObject -Class Win32_LogicalDisk DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 50665070592 Size : 203912880128 VolumeName : Local Disk
이러한 값을 1024로 차례로 두 번 나누면 MB 단위로 변환할 수 있습니다. 즉, 첫 번째 나누기에서 KB 단위로 변환되고 두 번째 나누기에서 MB 단위로 변환됩니다. 다음과 같이 입력하면 ForEach-Object 스크립트 블록에서 이렇게 할 수 있습니다.
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0} 48318.01171875
그러나 이 출력에는 데이터를 나타내는 레이블이 포함되지 않습니다. 이러한 WMI 속성은 읽기 전용이므로 직접 변환할 수 없습니다. 예를 들어 다음과 같이 입력할 수 있습니다.
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0}
그러면 다음과 같은 오류 메시지가 나타납니다.
"FreeSpace" is a ReadOnly property. At line:1 char:70 + Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.F <<<< r eeSpace = ($_.FreeSpace)/1024.0/1024.0}
고급 기술을 사용하여 데이터를 다시 구성할 수도 있지만 Select-Object를 사용하여 새 개체를 만드는 것이 훨씬 더 간단합니다.