PowerShell cmdlet正在更改返回对象的类型

时间:2015-06-25 12:23:22

标签: powershell powershell-v4.0 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

但不是!它' S:

JObject
JProperty
JObject

这怎么可能?对象中的类型如何在函数JObject中,但是在它从函数中传出后,它是JProperty

1 个答案:

答案 0 :(得分:0)

对于PowerShell缺乏灵活性!

显然,PowerShell将“展开”所有发往该管道的集合。在这种情况下,JObject会实现ICollection<KeyValuePair<string, JToken>>JObject的集合包含一个JProperty,它正在“展开”到管道中。我找到了this回答,其中显示将集合滚动到外部集合中会导致将预期值放入管道中。

如果PowerShell有一个向管道添加内容的机制,那不是很好吗? :)