ForEach-Object Cmdlet 使用指令碼區塊及代表目前管線物件的 $_ 描述員,讓您可對管線中的每個物件執行命令。這可用來執行一些複雜的工作。
其適用狀況之一即是操控資料以取得更有用的資訊。例如,WMI 的 Win32_LogicalDisk 類別可用於傳回每個本機磁碟機的可用空間資訊。然而,傳回的資料卻是位元組單位,造成判讀上的困難:
PS> Get-WmiObject -Class Win32_LogicalDisk DeviceID : C: DriveType : 3 ProviderName : FreeSpace : 50665070592 Size : 203912880128 VolumeName : Local Disk
您可以將每個 FreeSpace 值除以 1024 兩次,進而轉換成百萬位元組 (MB) 值;第一次相除後得到千位元組 (KB) 單位的資料,第二次相除後得到 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 建立新物件。