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

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

在要构建具有用于创建输出CSV的属性的对象数组的代码中,我访问了几个不同输入数组的.count cmdlet输出的.summeasure-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

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

最佳答案

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

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

关于arrays - 当数组为空时,是否有可能使measure-object返回0而不是Sum的null/noth?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30675530/

10-12 18:14
查看更多