Il cmdlet ForEach-Object utilizza blocchi di script e il descrittore $_ dell'oggetto pipeline corrente per consentire l'esecuzione di un comando su ogni oggetto della pipeline. Può pertanto essere utilizzato per eseguire alcune attività complesse.
Una situazione in cui può risultare utile è quella in cui i dati vengono modificati per renderli più utili. È ad esempio possibile utilizzare la classe Win32_LogicalDisk di WMI per restituire le informazioni sullo spazio disponibile per ciascun disco locale. I dati restituiti sono espressi in byte e pertanto difficili da leggere:
PS> Get-WmiObject -Class Win32_LogicalDisk DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 50665070592 Size : 203912880128 VolumeName : Local Disk
È quindi possibile convertire il valore di FreeSpace in megabyte dividendo due volte ciascun valore per 1024. Dopo la prima divisione i dati saranno infatti espressi in kilobyte, mentre dopo la seconda saranno espressi in megabyte. Per eseguire questa operazione in un blocco di script ForEach-Object, digitare:
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0} 48318.01171875
Sfortunatamente, l'output restituito è costituito da dati cui non è associata nessuna etichetta. Poiché le proprietà WMI di questo tipo sono di sola lettura, non è possibile convertire direttamente il valore di FreeSpace. Se si digita:
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0}
Verrà visualizzato un messaggio di errore:
"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}
È possibile riorganizzare i dati utilizzando alcune tecniche avanzate, tuttavia un approccio più semplice consiste nel creare un nuovo oggetto tramite Select-Object.