L'applet de commande ForEach-Object utilise des blocs de script et le descripteur $_ de l'objet de pipeline actif pour vous permettre d'exécuter une commande sur chaque objet du pipeline. Elle peut être utilisée pour effectuer des tâches compliquées.
Cela peut être particulièrement pratique pour manipuler des données afin de les rendre plus exploitables. Par exemple, la classe Win32_LogicalDisk de WMI peut être utilisée pour retourner des informations sur l'espace libre de chaque disque local. Les données retournées sont exprimées en octets, ce qui n'en facilite pas la lecture :
PS> Get-WmiObject -Class Win32_LogicalDisk DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 50665070592 Size : 203912880128 VolumeName : Local Disk
Nous pouvons convertir la valeur de FreeSpace (espace libre) en mégaoctets en divisant chaque valeur par 1024 deux fois ; après la première division, les données sont exprimées en kilo-octets, et après la deuxième, en mégaoctets. Vous pouvez effectuer cette opération au moyen d'un bloc de script ForEach-Object en tapant :
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0} 48318.01171875
Malheureusement, la sortie propose maintenant des données sans libellé associé. Parce que les propriétés WMI telles que celle-ci sont en lecture seule, vous ne pouvez pas convertir FreeSpace directement. Si vous tapez ceci :
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0}
Un message d'erreur s'affiche :
"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}
Vous pourriez réorganiser les données à l'aide de quelque technique évoluée, mais il existe une approche plus simple qui consiste à créer un objet en utilisant Select-Object.