Командлет 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.