我使用measure-object为单个属性生成数组中项目数的计数,以及该属性的值之和。
数组来自导入的CSV,通过where-object进行筛选,因此有时数组可能为空。
在构建具有属性的对象数组以创建输出CSV的代码中,我访问几个不同输入数组的.count和.sum属性。
如果测量到的数组为空,计数仍有一个值为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可以是空的)。
发布于 2015-06-05 22:43:55
如果数组碰巧为空,则可以使用显式类型强制转换使Measure-Object返回零和而不是null:
(@() | Measure-Object -Property Foo -Sum).Sum -as [double]发布于 2015-06-05 23:01:28
据我所见,每当您在没有项的输入集合中使用属性参数时,Measure-Object都会返回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
}
}https://stackoverflow.com/questions/30675530
复制相似问题