我使用measure-object
来生成单个属性的数组中项目数的计数,以及该属性的值的总和。
数组来自导入的CSV,通过where-object
进行过滤,因此有时数组可能为空。
在我构建具有用于创建输出CSV的属性的对象数组的代码中,我访问.count
cmdlet输出的.sum
和measure-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来说可能为空)。
答案 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
}
}