2015-06-25 45 views
0

這種行爲很神祕!PowerShell cmdlet正在更改返回對象的類型

考慮下面的PowerShell腳本:

[Reflection.Assembly]::LoadFrom("Newtonsoft.Json.dll") | Out-Null 

function ConvertFrom-JsonNet { 
    [CmdletBinding()] 
    param(
     [Parameter(Mandatory=$true)] 
     [string] $Json 
    ) 

    $O = [Newtonsoft.Json.Linq.JObject]::Parse($Json) 
    Write-Host $O.GetType().Name 

    return $O 
} 

Clear-Host 

$Json = '{"test":"prop"}' 
$O1 = ConvertFrom-JsonNet '{"test":"prop"}' 
$O2 = [Newtonsoft.Json.Linq.JObject]::Parse($Json) 

Write-Host $O1.GetType().Name 
Write-Host $O2.GetType().Name 

你所期望的輸出是:

JObject 
JObject 
JObject 

但它不是!它是:

JObject 
JProperty 
JObject 

這怎麼可能?對象的類型如何在的函數JObject中,但在函數傳出後,它的JProperty

+0

'JObject'實現了幾個接口;其中一個是「IEnumerable」。 PowerShell是否檢測到它實現了'IEnumerable'並將它放在流水線上時展開對象? – NathanAldenSr

回答

0

嘆息

耶對PowerShell的靈活性!

顯然,PowerShell將「展開」所有發往流水線的集合。在這種情況下,JObject實施ICollection<KeyValuePair<string, JToken>>JObject的集合包含一個JProperty,這是「展開」到管道中的內容。我發現this答案,這表明將集合滾動到外部集合中會導致將預期值放入管道中。

如果PowerShell有一種機制可以將某些東西添加到流水線中,這不是很好嗎? :)