我正在使用C#开发Powershell二进制模块。我发现嵌套的对象和集合未显示在控制台上。所有其他属性显示正确。我还没有从PSObjects派生输出类。它们是纯C#。它包含一堆属性,集合(列表和字典)和一个嵌套对象。嵌套对象仅显示类名称。列表仅显示第一个属性。
我尝试使用数组([])而不是列表,并将字典转换为名称,值属性类的集合,并将其显示为数组。
我希望扩展内部对象和列表中的对象。
答案 0 :(得分:0)
PowerShell调用嵌套对象上的ToString()
来显示它们。您可以使用派生属性(在Types.ps1xml
文件中定义)或自定义格式(在Format.ps1xml
中定义)文件)以暴露嵌套对象的某些属性以默认显示在控制台中,否则,PowerShell只会显示对象的展平版本,而不管该类名是(如果ToString()
不被覆盖) )或您自己定义的任何内容。
例如,我正在使用同时使用Format.ps1xml
和Types.ps1xml
文件来控制如何显示类型的模块。在Types.ps1xml
中,我们选择默认的显示属性,还添加了一个自定义属性来重命名嵌套对象(针对匿名性进行了修改):
<?xml version="1.0" encoding="utf-8" ?>
<Types>
<Type>
<Name>ObjectA</Name>
<Members>
<MemberSet>
<Name>PSStandardMembers</Name>
<Members>
<PropertySet>
<Name>DefaultDisplayPropertySet</Name>
<ReferencedProperties>
<Name>ID</Name>
<Name>Name</Name>
<Name>Description</Name>
<Name>Metadata</Name>
</ReferencedProperties>
</PropertySet>
</Members>
</MemberSet>
<ScriptProperty>
<Name>ObjectSecrets</Name>
<GetScriptBlock>$this.Secrets.ToString()</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
<Type>
<Name>ObjectB</Name>
<Members>
<MemberSet>
<Name>PSStandardMembers</Name>
<Members>
<PropertySet>
<Name>DefaultDisplayPropertySet</Name>
<ReferencedProperties>
<Name>Name</Name>
<Name>ObjectA</Name>
<Name>Directory</Name>
</ReferencedProperties>
</PropertySet>
</Members>
</MemberSet>
</Members>
</Type>
</Types>
请注意,ObjectB
引用了嵌套对象ObjectA
。 ObjectA
覆盖ToString()
以返回其自己的Name
属性:
> Get-Objects
Name Directory ObjectA
---- --------- -------
some-cool-name X:\some\random\directory objecta-name
有关Format.ps1xml的更多信息:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_format.ps1xml
有关Types.ps1xml的更多信息:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_types.ps1xml