ForEach-Object cmdlet 可对当前管道对象使用脚本块和 $_ 描述符,让您能够对该管道中的每个对象运行命令。这可用于执行某些复杂的任务。

对于以下情况这将非常有用:对数据进行操作以提高数据的实用性。例如,WMI 中的 Win32_LogicalDisk 类可用于返回每个本地磁盘的可用空间信息。数据是以字节形式返回的,因而可读性非常差:

PS> Get-WmiObject -Class Win32_LogicalDisk


DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 50665070592
Size         : 203912880128
VolumeName   : Local Disk

将每个值两次与 1024 相除,从而将 FreeSpace 值转换为兆字节。首次相除之后,数据是以千字节形式表示的,第二次相除之后,数据就以兆字节形式表示了。通过键入以下命令可在 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 创建新对象。




目录