Arrays Powershell对类似命名的数组属性求和

Arrays Powershell对类似命名的数组属性求和,arrays,powershell,Arrays,Powershell,有没有一种方法可以将数组中类似的属性名求和,而不是这样做 foreach ($row in $ExpenseData) { if ($row.refuel1_cost + $row.refuel2_cost + $row.refuel3_cost -gt 0) { } } 试试这个 $a=@{"refuel1_cost"=1;"refuel2_cost"=2;"refuel3_cost"=3;"something"=10} $a.GetEnumerator(

有没有一种方法可以将数组中类似的属性名求和,而不是这样做

    foreach ($row in $ExpenseData)
{
    if ($row.refuel1_cost + $row.refuel2_cost + $row.refuel3_cost -gt 0)
    {


    }
}
试试这个

$a=@{"refuel1_cost"=1;"refuel2_cost"=2;"refuel3_cost"=3;"something"=10}
$a.GetEnumerator() | ?{$_.name -match "refuel" } | select -expand value |measure -Sum |select -expand sum

如果您想要每行的总和,那么计算属性是最合适的

$ExpenseData | Select Name,@{'name'='Total refuel cost';'expression'={$_.refuel1_cost + $_.refuel2_cost + $_.refuel3_cost}}
我使用下面的示例生成我的费用数据

function CreateSamplePump($Name,$cost1,$cost2,$cost3){
    $Props = @{'Name'='';'refuel1_cost'='';'refuel2_cost'='';'refuel3_cost'=''}
    $Obj = New-Object psobject -Property $props
    $obj.Name = $Name
    $obj.refuel1_cost = $cost1
    $obj.refuel2_cost = $cost2
    $obj.refuel3_cost = $cost3
    return $Obj
}

# Generating a sample for test purposes
$ExpenseData = New-Object System.Collections.ArrayList
$ExpenseData.Add((CreateSamplePump -Name 'Pump1' -cost1 10 -cost2 13 -cost3 4))
$ExpenseData.Add((CreateSamplePump -Name 'Pump2' -cost1 4 -cost2 2 -cost3 3))
$ExpenseData.Add((CreateSamplePump -Name 'Pump3' -cost1 3 -cost2 2 -cost3 1))
$ExpenseData.Add((CreateSamplePump -Name 'Pump4' -cost1 4 -cost2 8 -cost3 2))
$ExpenseData.Add((CreateSamplePump -Name 'Pump6' -cost1 6 -cost2 5 -cost3 1))
编辑:

在不太可能的情况下,您希望在获取数据集中的“加油成本”列之前对类似的属性名称求和,而不知道该列的数量,您可以使用类似的方法来获取所有类似的名称

(如果您有名称,请改用名称。这样会更有效率)


理解我的问题的关键是处理一个System.Data对象—突出显示了一些问题

Sage的代码行
$CostsProperties=$ExpenseData | get member | where-like-Property Name-Value'refuel*|u cost'| select-ExpandProperty Name
简化了脚本无止境-谢谢

下面是我脚本的外壳

$ExpenseData = Get-MIS-Data -query $ExpensesQuery

# Get all the wildcard columns 
$RefuelCols = $ExpenseData | get-member | where -like -Property Name -Value 'refuel*_cost' | select -ExpandProperty Name

#Check if any rows were returned
if ($ExpenseData.count -gt 0)
{
    #Loop each returned row
    foreach ($row in $ExpenseData)
    {
        foreach ($c in $RefuelCols)
        {
            $Total += $row.$c
        }

        if ($Total -gt 0)
        {

            #Knowing we have values do some useful stuff here

        }
        #Reset $Total before next loop
        $Total = 0
    }
}

这里的最终目标是什么?你想达到什么目的?这是为了能够使用通配符对类似的“列”名称进行求和-例如加油*_成本-而不必指定每一个。下面的Loic有一个正确的想法,我只是没有指定它最初是一个系统数据对象。如果
$a
不是哈希表怎么办?我怀疑这是一个来自
import csv
的自定义对象,它“按原样”运行良好,但由于$ExpenseData是从ODBC SQL调用加载的,因此它是一个System.Data.DataRow,因此它没有“GetEnumerator”方法。
$ExpenseData = Get-MIS-Data -query $ExpensesQuery

# Get all the wildcard columns 
$RefuelCols = $ExpenseData | get-member | where -like -Property Name -Value 'refuel*_cost' | select -ExpandProperty Name

#Check if any rows were returned
if ($ExpenseData.count -gt 0)
{
    #Loop each returned row
    foreach ($row in $ExpenseData)
    {
        foreach ($c in $RefuelCols)
        {
            $Total += $row.$c
        }

        if ($Total -gt 0)
        {

            #Knowing we have values do some useful stuff here

        }
        #Reset $Total before next loop
        $Total = 0
    }
}