2015-06-05 14 views
1

我正在使用​​來產生單個屬性數組中項目數的計數,以及該屬性值的總和。當數組爲空時,是否可以讓Measure對象返回0而不是null/Nothing?

該數組來自導入的CSV,它通過where-object進行過濾,所以有時數組有可能是空的。

在我建立具有用於創建輸出CSV的屬性的對象的陣列的代碼,我訪問​​小命令輸出的.count.sum屬性幾個不同的輸入陣列。 (我猜,因爲即使是一個空數組也有一個數(0),但總和屬性不存在/已經存在了/已經有一個數組,但是這個數組並不存在/有因此,要添加屬性的Add-Member cmdlet會失敗,並且「嘗試除以零」。

失敗的行正在處理一個百分比以將其放入屬性值(使用兩個數組的總和),但除數永遠不爲零,它的分紅有時只是零,所以我不明白爲什麼我得到除零誤差。

任何人都可以解釋如何強制​​返回如果陣列中沒有測量項目,或者避免除零誤差,那麼總和爲零?

示例代碼如下:

$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

至於你除以零錯誤:你可以驗證,'($ DevAllStats | Measure-Object -Property CPUTIME -Sum).Sum'或任何其他除數既不是'$ null'也不是'0'? –

+0

看來,這也許是可能的,只是現在就嘗試你的建議。 –

+0

您的建議是一種享受 - 也添加了一些我自己的額外檢查:-) –

回答

4

您可以使用轉換爲使Measure-Object回報爲零,而不是空的和明確的類型,如果陣列正好是空的:

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

作品一種享受 - 謝謝! –

1

從我所看到的,Measure-Object返回null只要您使用Property參數的輸入集合沒有項目。 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 
    } 
} 
相關問題