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 建立新物件。




目錄