我使用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级嵌套对象的内容?
任何帮助都将受到高度赞赏。
答案 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