Командлет ForEach-Object использует блоки скриптов и дескриптор $_ для текущего объекта конвейера, чтобы та или иная команда была выполнена для всех объектов конвейера. Эта возможность позволяет выполнить некоторые сложные действия.

Одним из них является обработка данных с целью повышения их применимости. Например, класс Win32_LogicalDisk из инструментария управления Windows может использоваться для просмотра сведений о свободном месте на каждом локальном диске. Для запрашиваемых данных используется единица измерения байт, что затрудняет чтение.

PS> Get-WmiObject -Class Win32_LogicalDisk


DeviceID	 : C:
DriveType	: 3
ProviderName :
FreeSpace	: 50665070592
Size		 : 203912880128
VolumeName   : Local Disk

Значение свойства FreeSpace можно преобразовать в мегабайты, дважды разделив исходное значение на 1024: после первого деления результат будет представлен в килобайтах, после второго — в мегабайтах. Для этого в блоке скрипта ForEach-Object введите:

Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0}
48318.01171875

К сожалению, теперь с выводимыми данными не связаны никакие метки. Свойства WMI предназначены только для чтения, поэтому нельзя преобразовать непосредственно значение свойства FreeSpace. Если ввести:

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.