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 を使用して新しいオブジェクトを作成することです。




目次