Фон
Все началось с командлета в качестве ответа для Сохранить хэш-таблицу в нотации объектов PowerShell (PSON) . Между тем эволюционировал до ConvertTo-Expression . Командлет, который сериализует объекты PowerShell в выражение PowerShell.
Будучи немного вовлеченным в -Depth
проблемы с похожими нативными командлетами ( ConvertTo-Xml и ConvertTo-Json ) из-за повторяющихся ссылок на свойства, мне интересно, если эта проблема может быть приятно разрешается в выражении 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 объекте?
Можно ли ссылаться на другое свойство во время строительства?
(Я понимаю, что сам объект не завершен, но родительская ссылка, вероятно, уже существует. Кроме того, я мог бы представить, что ссылка еще не существует, выполнив что-то вроде ленивая инициализация .)