当数组为空时,是否可以将 measure-object 设为 return 0 而不是 null/nothing for Sum?

Is it possible to get measure-object to return 0 rather than null/nothing for Sum when the array is empty?

我正在使用 measure-object 计算单个 属性 的数组中的项目数,以及 属性 的值的总和。

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

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

如果测量的数组是空的,计数仍然是我可以使用的 0 值(我猜是因为即使是空数组也有一个计数(0),但是总和 属性 没有't exist/has 没有值。因此,添加 属性 的 Add-Member cmdlet 失败并显示 "attempted to divide by zero"。

失败的行正在计算一个百分比以放入 属性 值(使用两个数组的总和)但除数永远不会为零,只有股息有时可以为零所以我不不明白为什么我得到被零除的错误。

任何人都可以解释如果数组中没有任何项目被测量,如何强制 measure-object 到 return 总和为零,或者如何避免被零除错误?

示例代码如下:

$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

除以零的错误发生在计算 DEVELOPMENT 环境百分比的代码行(对于 CompanyB 可以为空)。

如果数组恰好为空,您可以使用显式类型转换使 Measure-Object return 的总和为零而不是 null:

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

据我所知,每当您将 属性 参数用于没有项目的输入集合时,Measure-Object returns null。 Count 属性 是特殊的,因为它始终存在并且在调用 null 时会给你 0。如果对象有自己的计数 属性 将显示。

一种选择是不使用 属性 参数,如下所示:

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