它以cmdlet作为Save hash table in PowerShell object notation (PSON)的答案。同时演变为ConvertTo-Expression。一个将PowerShell对象序列化为PowerShell表达式的cmdlet。
由于重复出现的属性引用,在与类似的本机cmdlet(ConvertTo-Xml和ConvertTo-Json)的-Depth
问题中有点涉及,我想知道是否可以在PowerShell表达式中很好地解决此问题。
$Object = @{
Name = "Parent"
Child = @{
Name = "Child"
}
}
$Object.Child.Parent = $Object
在此示例中,.Child.Parent
属性返回到$Object
,表示$Object.Child.Parent.Child.Parent.Name
返回Parent
。
当前,$Object | ConvertTo-Expression
返回一个ScriptBlock
,例如:
@{
'Child' = @{
'Parent' = $_
'Name' = 'Parent'
}
'Name' = 'Parent'
}
要重建(重复出现的)属性引用,我可以返回如下表达式:
[ScriptBlock]::Create(
@'
$_ = @{
'Child' = @{
'Parent' = $_
'Name' = 'Parent'
}
'Name' = 'Parent'
}
$_.Child.Parent = $_
$_
'@
)
(类似于示例中对象的初始构造。)
恢复(调用,反序列化)此表达式的过程类似:
$Expression = [ScriptBlock]::Create(... # The above result
$Object = &$Expression
$Object.Child.Parent.Name
但是这样的输出将大大混淆结果的可读性。
是否还有其他方法(例如使用$This
,ScriptProperty
或...)来还原 PowerShell 对象中的引用属性?
在施工时是否可以引用其他属性?
(我知道对象本身并不完整,但是父引用可能已经存在。此外,我可以通过执行类似lazy initialization的操作来想象该引用还不需要存在。)