为多个对象重复执行任务 (ForEach-Object)Repeating a Task for Multiple Objects (ForEach-Object)

本文内容

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

一种有帮助的情况就是操纵数据使其更为有用。例如,WMI 的 Win32_LogicalDisk 类可用于返回每个本地磁盘的可用空间信息。返回以字节表示的数据,但是,这也将增加阅读的难度:

  1. PS> Get-WmiObject -Class Win32_LogicalDisk
  2. DeviceID : C:
  3. DriveType : 3
  4. ProviderName :
  5. FreeSpace : 50665070592
  6. Size : 203912880128
  7. VolumeName : Local Disk

我们可以通过将每个值除以 1024 两次来将 FreeSpace 值转换为兆字节;第一次除法后,该数据将以千字节为单位,而完成第二次除法后,该值则以兆字节为单位。你可通过键入以下内容在 ForEach-Object 脚本块中实现此操作:

  1. PS> Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0}
  2. 48318.01171875

遗憾的是,该输出现在是没有关联标签的数据。因为这样的 WMI 属性为只读,所以不能直接转换 FreeSpace。如果键入以下内容:

  1. Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0}

则将收到错误消息:

  1. "FreeSpace" is a ReadOnly property.
  2. At line:1 char:70
  3. + Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.F <<<< r
  4. eeSpace = ($_.FreeSpace)/1024.0/1024.0}

可以通过使用一些高级技术重新组织数据,但更简单的方法是通过使用 Select-Object 创建新对象。