2015-07-20 43 views
3

如果數組只有一個CustomObjects並且Count屬性爲null。 爲什麼?使用pscustomobjects統計PowerShell中的數組的屬性

如果僅使用字符串,則Count屬性爲1。

function MyFunction 
{ 
    $Objects = @() 
    $Objects += [pscustomobject]@{Label = "Hallo"} 
    # $Objects += [pscustomobject]@{Label = "World"} 

    $Objects 
} 

$objs = MyFunction 
Write-Host "Count: $($objs.Count)" 

輸出:"Count: "因爲$objs.Countnull

function MyFunction 
{ 
    $Objects = @() 
    $Objects += [pscustomobject]@{Label = "Hallo"} 
    $Objects += [pscustomobject]@{Label = "World"} 

    $Objects 
} 

$objs = MyFunction 
Write-Host "Count: $($objs.Count)" 

輸出:"Count: 2"

行爲是不同的,如果我添加字符串

function MyFunction 
{ 
    $Objects = @() 
    $Objects += "Hallo" 
    # $Objects += [pscustomobject]@{Label = "World"} 

    $Objects 
} 

$objs = MyFunction 
Write-Host "Count: $($objs.Count)" 

輸出:"Count: 1"

回答

3

即使嵌套數組由一個對象構成,也可以強制函數返回一個數組。

function MyFunction 
{ 
    $Objects = @() 
    $Objects += [pscustomobject]@{Label = "Hallo"} 
    # $Objects += [pscustomobject]@{Label = "World"} 
    return ,$Objects 
} 

即逗號使得顯式轉換到即使供給$Objects已經是多於一個的對象的陣列的陣列。這迫使一個元素構造一個數組。在外面,Powershell對單項數組做了unboxing,所以如果有數組的話你會得到一個數組,所以這個方法圍繞着默認的Powershell行爲來處理單項數組。您遇到Count是1,因爲PowerShell中的3.0 Microsoft fixed one-item arrays by adding Count property to every object這樣一個對象,它的索引返回Count爲1,併爲$null返回零,但作爲一個自然理性宣稱他們可以包含自己的Count性能PSCustomObject s是這個排除在外,因此沒有默認Count屬性包含在自定義對象中。這就是爲什麼如果只有一個對象,你不會得到Count

,行爲上可以看到下面的例子:

function hehe { 
    [email protected]() 
    $a+=2 
    $a+=4 
    $b=,$a 
    write-verbose $b.count # if a variable is assigned ",$a", the value is always 1 
    return ,$a 
} 

輸出:

PS K:>(合).Count之間

VERBOSE:1