Powershell 使用两个等长数组执行数学运算

Powershell 使用两个等长数组执行数学运算,powershell,foreach,enumeration,Powershell,Foreach,Enumeration,我所做的是如此简单,以至于我在努力寻找答案。我试着从两个相等长度的数组中减去另一个 $free_array = get-wmiobject -class win32_logicaldisk | select -ExpandProperty freespace $size_array = get-wmiobject -class win32_logicaldisk | select -ExpandProperty size ForEach ($size in $size_array) {

我所做的是如此简单,以至于我在努力寻找答案。我试着从两个相等长度的数组中减去另一个

$free_array = get-wmiobject -class win32_logicaldisk | select -ExpandProperty freespace
$size_array = get-wmiobject -class win32_logicaldisk | select -ExpandProperty size

ForEach ($size in $size_array)
  {
    Write-Host Statistic: $size - $freespace
  }


我不认为PowerShell有一个内置函数可以同时跨多个阵列进行映射,因此您可以根据需要使用,然后索引到两个阵列中:

foreach ($Index in (0..($free_array.Count - 1))) {
    Write-Host Statistic: ($size_array[$Index] - $free_array[$Index])
}
但是,您的任务也可以这样做,我认为这样做更具可读性:

$LogicalDisks = Get-CimInstance -ClassName Win32_LogicalDisk

foreach ($LogicalDisk in $LogicalDisks) {
    Write-Host Statistic: ($LogicalDisk.Size - $LogicalDisk.FreeSpace)
}
补充:

旁白:下面我使用的是而不是
获取WmiObject
,因为CIM cmdlet(例如
获取CimInstance
)取代了PowerShell v3(2012年9月发布)中的WMI cmdlet(例如
获取WmiObject
)。因此,应该避免使用WMI cmdlet,尤其是因为PowerShell(Core)7+(未来的所有工作都将在这里进行)甚至不再具有它们。有关详细信息,请参阅

如果您可以对单个集合进行操作,那么您甚至不需要
foreach
循环,并且可以使用单个管道来调用:


对于并行枚举多个集合的(不使用索引):

可以对两个集合执行此操作:

# Two sample arrays to enumerate in parallel:
[string[]] $a1 = 'one', 'two', 'three'
[int[]] $a2 = 1, 2, 3

foreach ($tuple in [Linq.Enumerable]::Zip($a1, $a2)) {
  '{0}: {1}' -f $tuple[0], $tuple[1]
}
注意:在早期的PowerShell(核心)版本和Windows PowerShell中,您必须使用
.Item1
/
.Item2
而不是
[0]
/
[1]

但是,如上所示,这是一个有点模糊的解决方案,它不是PowerShell惯用的
,因为PowerShell不支持.NET扩展方法,需要对输入集合进行强类型化,以使PowerShell能够使PowerShell推断出应使用泛型方法调用的特定类型

另外,对于大小不同的输入集合,一旦较小的集合的项用完,枚举就会停止。


建议引入PowerShell惯用功能,该功能还支持两个以上的集合

  • 更新:该提案已被拒绝
如果实现了此功能,则上述输出:

1:1
2:2
3:3
投票支持“然而…”部分。
# Two sample arrays to enumerate in parallel:
[string[]] $a1 = 'one', 'two', 'three'
[int[]] $a2 = 1, 2, 3

foreach ($tuple in [Linq.Enumerable]::Zip($a1, $a2)) {
  '{0}: {1}' -f $tuple[0], $tuple[1]
}
# Two sample arrays to enumerate in parallel:
$a1 = 'one', 'two', 'three'
$a2 = 1, 2, 3

# WISHFUL THINKING, as of PowerShell 7.2
foreach ($a1Element, $a2Element in $a1, $a2) {
  '{0}: {1}' -f $a1Element, $a2Element
}