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
}
}