gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:45:42 27 4
gpt4 key购买 nike

我正在使用 Add-Type 向 PowerShell session 添加一个 .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 层嵌套对象?

如有任何帮助,我们将不胜感激。

最佳答案

我不知道这有什么内置功能,但是创建一个可以让您到达您想去的地方的功能非常容易。这是一个例子:

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

关于powershell - 我们可以在 Powershell 中显示嵌套对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com