首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当数组为空时,可以让测量对象返回0而不是null/nothing作为Sum吗?

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

Stack Overflow用户
提问于 2015-06-05 20:44:20
回答 2查看 2K关注 0票数 2

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

数组来自导入的CSV,通过where-object进行筛选,因此有时数组可能为空。

在构建具有属性的对象数组以创建输出CSV的代码中,我访问几个不同输入数组的.count.sum属性。

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

失败的行正在计算出一个百分比,将其放入属性值(使用两个数组的和),但除数永远不是零,有时只有红利可以是零,所以我不明白为什么要将除法除以零误差。

如果数组中没有测量到的项,谁能解释如何强制measure-object返回零和,或者避免被零错误除法?

示例代码如下:

代码语言:javascript
复制
$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可以是空的)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-05 22:43:55

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

代码语言:javascript
复制
(@() | Measure-Object -Property Foo -Sum).Sum -as [double]
票数 5
EN

Stack Overflow用户

发布于 2015-06-05 23:01:28

据我所见,每当您在没有项的输入集合中使用属性参数时,Measure-Object都会返回null。Count属性是特殊的,因为它始终存在,并且在调用null时会给出0。如果对象有自己的计数属性,则将显示该属性。

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

代码语言:javascript
复制
($ProdAllStats.CpuTime | Measure-Object -Sum).Sum

我仍然觉得它有点冗长,所以我可能会创建一个函数:

代码语言:javascript
复制
function Get-Sum {

   param(
       [string]$Property
   )

   if ($property -ne $null) {
       ($input.$property | Measure-Object -Sum).Sum
   } else {
       ($input | Measure-Object -Sum).Sum
   }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30675530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档