当数组为空时,是否可以将 measure-object 设为 return 0 而不是 null/nothing for Sum?
Is it possible to get measure-object to return 0 rather than null/nothing for Sum when the array is empty?
我正在使用 measure-object
计算单个 属性 的数组中的项目数,以及 属性 的值的总和。
该数组来自通过 where-object
过滤的导入 CSV,因此有时数组可能为空。
在我正在构建具有用于创建输出 CSV 的属性的对象数组的代码中,我访问了 measure-object
cmdlet 输出的 .count
和 .sum
属性对于几个不同的输入数组。
如果测量的数组是空的,计数仍然是我可以使用的 0 值(我猜是因为即使是空数组也有一个计数(0),但是总和 属性 没有't exist/has 没有值。因此,添加 属性 的 Add-Member
cmdlet 失败并显示 "attempted to divide by zero"。
失败的行正在计算一个百分比以放入 属性 值(使用两个数组的总和)但除数永远不会为零,只有股息有时可以为零所以我不不明白为什么我得到被零除的错误。
任何人都可以解释如果数组中没有任何项目被测量,如何强制 measure-object
到 return 总和为零,或者如何避免被零除错误?
示例代码如下:
$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
除以零的错误发生在计算 DEVELOPMENT 环境百分比的代码行(对于 CompanyB 可以为空)。
如果数组恰好为空,您可以使用显式类型转换使 Measure-Object
return 的总和为零而不是 null:
(@() | Measure-Object -Property Foo -Sum).Sum -as [double]
据我所知,每当您将 属性 参数用于没有项目的输入集合时,Measure-Object
returns 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
}
}
我正在使用 measure-object
计算单个 属性 的数组中的项目数,以及 属性 的值的总和。
该数组来自通过 where-object
过滤的导入 CSV,因此有时数组可能为空。
在我正在构建具有用于创建输出 CSV 的属性的对象数组的代码中,我访问了 measure-object
cmdlet 输出的 .count
和 .sum
属性对于几个不同的输入数组。
如果测量的数组是空的,计数仍然是我可以使用的 0 值(我猜是因为即使是空数组也有一个计数(0),但是总和 属性 没有't exist/has 没有值。因此,添加 属性 的 Add-Member
cmdlet 失败并显示 "attempted to divide by zero"。
失败的行正在计算一个百分比以放入 属性 值(使用两个数组的总和)但除数永远不会为零,只有股息有时可以为零所以我不不明白为什么我得到被零除的错误。
任何人都可以解释如果数组中没有任何项目被测量,如何强制 measure-object
到 return 总和为零,或者如何避免被零除错误?
示例代码如下:
$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
除以零的错误发生在计算 DEVELOPMENT 环境百分比的代码行(对于 CompanyB 可以为空)。
如果数组恰好为空,您可以使用显式类型转换使 Measure-Object
return 的总和为零而不是 null:
(@() | Measure-Object -Property Foo -Sum).Sum -as [double]
据我所知,每当您将 属性 参数用于没有项目的输入集合时,Measure-Object
returns 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
}
}