当数组为空时,是否可以让度量对象为 Sum 返回 0 而不是 null/nothing?

Gra*_*old 2 arrays powershell measure

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

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

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

如果测量的数组为空,则计数仍将具有我可以使用的 0 值(我猜是因为即使是空数组也有计数(0),但 sum 属性不存在/没有值。因此,Add-Member添加属性的cmdlet 失败,并显示“试图除以零”。

失败的行计算出一个百分比以放入属性值(使用来自两个数组的总和),但除数从不为零,只是股息有时可能为零,所以我不明白为什么我得到除数零误差。

任何人都能够解释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
Run Code Online (Sandbox Code Playgroud)

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

Man*_*ing 5

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

(@() | Measure-Object -Property Foo -Sum).Sum -as [double]
Run Code Online (Sandbox Code Playgroud)