当数组为空时,是否有可能让measure-object返回0而不是null / nothing?

时间:2015-06-05 20:44:20

标签: arrays powershell measure

我使用measure-object来生成单个属性的数组中项目数的计数,以及该属性的值的总和。

数组来自导入的CSV,通过where-object进行过滤,因此有时数组可能为空。

在我构建具有用于创建输出CSV的属性的对象数组的代码中,我访问.count cmdlet输出的.summeasure-object属性对于几个不同的输入数组。

如果测量的数组为空,则计数仍然可以使用0(我猜是因为即使空数组也有一个计数(0),但sum属性不存在/没有值。因此,添加属性的Add-Member cmdlet失败,"尝试除以零"。

失败的行正在设定一个百分比来放入属性值(使用两个数组的总和)但是除数从不为零,它只是有时可以为零的红利所以我不会#39 ;了解为什么我得到零除错误。

任何人都能够解释如果测量的数组中没有项目,如何强制measure-object返回零的总和,或者避免除以零错误?

以下示例代码:

$report = @()
$obj = New-Object System.Object
$obj | Add-Member -MemberType NoteProperty -Name Date -Value $Table[0].ENDDATE
$obj | Add-Member -MemberType NoteProperty -Name Environment -Value "PRODUCTION"
$obj | Add-Member -MemberType NoteProperty -Name Total_CPU_Seconds -Value ($ProdAllStats | Measure-Object -Property CPUTIME -Sum).Sum
$obj | Add-Member -MemberType NoteProperty -Name CompanyA_CPU_Seconds -Value ($CompAProdStats | Measure-Object -Property CPUTIME -Sum).Sum
$obj | Add-Member -MemberType NoteProperty -Name CompanyB_CPU_Seconds -Value ($CompBProdStats | Measure-Object -Property CPUTIME -Sum).Sum
$obj | Add-Member -MemberType NoteProperty -Name "%CompanyA_CPU" -Value ("{0:N2}" -f (($CompAProdStats | Measure-Object -Property CPUTIME -Sum).Sum/($ProdAllStats | Measure-Object -Property CPUTIME -Sum).Sum*100))
$obj | Add-Member -MemberType NoteProperty -Name "%CompanyB_CPU" -Value ("{0:N2}" -f (($CompBProdStats | Measure-Object -Property CPUTIME -Sum).Sum/($ProdAllStats | Measure-Object -Property CPUTIME -Sum).Sum*100))
$report += $obj
$obj = New-Object System.Object
$obj | Add-Member -MemberType NoteProperty -Name Date -Value $Table[0].ENDDATE
$obj | Add-Member -MemberType NoteProperty -Name Environment -Value "DEVELOPMENT"
$obj | Add-Member -MemberType NoteProperty -Name Total_CPU_Seconds -Value ($DevAllStats | Measure-Object -Property CPUTIME -Sum).Sum
$obj | Add-Member -MemberType NoteProperty -Name CompanyA_CPU_Seconds -Value ($CompADevStats | Measure-Object -Property CPUTIME -Sum).Sum
$obj | Add-Member -MemberType NoteProperty -Name CompanyB_CPU_Seconds -Value ($CompBDevStats | Measure-Object -Property CPUTIME -Sum).Sum
$obj | Add-Member -MemberType NoteProperty -Name "%CompanyA_CPU" -Value ("{0:N2}" -f (($CompADevStats | Measure-Object -Property CPUTIME -Sum).Sum/($DevAllStats | Measure-Object -Property CPUTIME -Sum).Sum*100))
$obj | Add-Member -MemberType NoteProperty -Name "%CompanyB_CPU" -Value ("{0:N2}" -f (($CompBDevStats | Measure-Object -Property CPUTIME -Sum).Sum/($DevAllStats | Measure-Object -Property CPUTIME -Sum).Sum*100))
$report += $obj

除以零错误发生在编写开发环境百分比的代码行上(对于CompanyB来说可能为空)。

2 个答案:

答案 0 :(得分:4)

如果数组恰好是空的,你可以使用显式类型转换来使Measure-Object返回零和而不是null:

(@() | Measure-Object -Property Foo -Sum).Sum -as [double]

答案 1 :(得分:1)

从我所看到的情况来看,只要您将Property参数与没有项目的输入集合一起使用,Measure-Object就会返回null。 Count属性是特殊的,因为它始终存在,并且在调用null时将给出0。如果对象具有将显示的自己的Count属性。

一个选项是不使用Property参数:

($ProdAllStats.CpuTime | Measure-Object -Sum).Sum

我仍然觉得它有点冗长所以我可能会创建一个函数:

function Get-Sum {

   param(
       [string]$Property
   )

   if ($property -ne $null) {
       ($input.$property | Measure-Object -Sum).Sum
   } else {
       ($input | Measure-Object -Sum).Sum
   }
}