我们可以在Powershell中显示嵌套对象吗?

时间:2014-04-27 06:05:23

标签: powershell powershell-v2.0 cmdlets

我使用Add-Type向PowerShell会话添加.NET类型,然后使用New-Object创建该类型的对象。这样做如下:

Add-Type -AssemblyName OuterObj
$a = New-Object OuterObj

已成功创建类型OuterObj的对象。现在.NET类型$a有一个名为innerObj的字段,它是另一个.NET类型innerObject的对象。所以我添加innerObject .NET类型并使用New-Object创建实例:

Add-Type -AssemblyName innerObject
$b = New-Object innerObject

类型innerObject的对象也已成功创建。现在我做如下:

$a.innerObj = $b

现在当我打印$a时,它会显示如下内容:

innerObj : innerObject

因此默认情况下不会显示innerObject的内容。当我去探索时,innerObj有了这些字段。我知道PowerShell默认情况下不会显示嵌套对象,而只是显示它们的类型,但有没有一种方法可以指定PowerShell应该默认显示的对象嵌套级别?是否有指定显示1或2级嵌套对象的内容?

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

我不知道有任何内置功能,但是创建一个可以让你到达目的地的功能非常容易。这是一个例子:

function ConvertTo-NestedPropertyHash
{
    PARAM (
        [Parameter(ValueFromPipeline=$true)]
        [object[]]$InputObject
    ,
        [string[]]$ExpandProperty
    )
    PROCESS 
    {
        foreach($item in $InputObject)
        {
            $hash = @{}
            $processStack = New-Object System.Collections.Stack
            $processStack.Push(@{ Item = $item})
            while($processStack.Count -gt 0)
            {
                $current = $processStack.Pop()
                $prefix = $current.Prefix
                $object = $current.Item
                foreach($property in $object | gm | where membertype -eq "Property")
                {
                    if ($Prefix)
                    {
                        $propertyPath = "$Prefix.$($property.Name)"
                    }
                    else
                    {
                        $propertyPath = $Property.Name
                    }
                    $propertyValue = $object."$($property.Name)"
                    if ($ExpandProperty -contains $propertyPath)
                    {
                        $processStack.Push(@{ 
                            Prefix = $propertyPath
                            Item = $propertyValue
                        })
                    }
                    else
                    {
                        $hash.Add($propertyPath, $propertyValue)
                    }
                }
            }
            Write-Output $hash
        }
    }
}

上述功能允许您指定要扩展的属性(带有子属性的点符号)。所以给出以下类型:

Add-Type -TypeDefinition @"
public class InnerInnerType
{
    public string Name{get;set;}
}
public class InnerType
{
    public string Name{get;set;}
    public string Description{get;set;}
    public InnerInnerType MyChild{get;set;}
}
public class OuterType
{
    public string Name{get;set;}
    public InnerType InnerThingy {get;set;}
}
"@

创建了以下对象:

$outer = New-Object OuterType
$inner = New-Object InnerType
$childToInner = New-OBject InnerInnerType
$outer.Name = "outer name"
$inner.Name = "inner name"
$inner.Description = "inner description"
$childToInner.Name = "inner inner thingy"
$outer.innerthingy = $inner
$inner.MyChild = $childToInner

您可以使用该功能而不要求它扩展任何属性,如下所示:

$outer | ConvertTo-NestedPropertyHash

哪会产生以下输出:

Name                           Value
----                           -----
Name                           outer name
InnerThingy                    InnerType

或者您可以要求它展开InnerThingy属性:

$outer | ConvertTo-NestedPropertyHash -ExpandProperty InnerThingy

哪个收益率:

Name                           Value
----                           -----
InnerThingy.MyChild            InnerInnerType
Name                           outer name
InnerThingy.Description        inner description
InnerThingy.Name               inner name

或者您也可以使用点表示法指定嵌套属性(函数的当前实现要求您展开属性以便能够从该属性扩展子属性,因此您需要执行-ExpandProperty InnerThingy, "InnerThingy.MyChild"如果要扩展MyChild嵌套属性),如下所示:

$outer | ConvertTo-NestedPropertyHash -ExpandProperty InnerThingy, "InnerThingy.MyChild"

哪个收益率:

Name                           Value
----                           -----
Name                           outer name
InnerThingy.Description        inner description
InnerThingy.MyChild.Name       inner inner thingy
InnerThingy.Name               inner name