ForEach-Object コマンドレットでは、スクリプト ブロックと、現在のパイプライン オブジェクトを表す $_ 記述子を使用して、パイプラインの各オブジェクトに対してコマンドを実行できます。これを使用して、複雑なタスクを実行できます。
データを使いやすいように加工する場合などにも便利です。たとえば、WMI の Win32_LogicalDisk クラスを使用すると、各ローカル ディスクの空きディスク容量情報を取得できます。しかし、返されるデータがバイト単位であるため、見づらいという欠点があります。
PS> Get-WmiObject -Class Win32_LogicalDisk DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 50665070592 Size : 203912880128 VolumeName : Local Disk
FreeSpace の値は、個々の値を 1024 で 2 回除算することによって MB 単位に変換できます。つまり、1 回目の除算の後、データは KB 単位になり、2 回目の除算で MB 単位になります。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 を使用して新しいオブジェクトを作成することです。