【问题标题】:Nested objects and collection in output of Powershell cmdlet not showing upPowershell cmdlet 输出中的嵌套对象和集合未显示
【发布时间】:2019-07-16 07:54:24
【问题描述】:

我正在使用 C# 开发 Powershell 二进制模块。我发现嵌套对象和集合没有显示在控制台上。所有其他属性都正确显示。我没有从 PSObjects 派生输出类。它们是纯 C#。它包含一堆属性、集合(列表和字典)和一个嵌套对象。嵌套对象仅显示类名。列表只显示了第一个属性。

我尝试使用数组([])而不是列表,并将字典转换为名称、值属性类的集合并将其显示为数组。

我希望扩展列表中的内部对象和对象。

【问题讨论】:

  • 有关您的代码的帮助:显示您的代码。

标签: c# powershell-module


【解决方案1】:

PowerShell 在嵌套对象上调用ToString() 以显示它们。 您可以使用派生属性(在Types.ps1xml 文件中定义)或自定义格式(在Format.ps1xml 文件中定义)来公开某些属性的嵌套对象默认显示在控制台中,但除此之外,PowerShell 只会显示对象的扁平版本,无论是类名(如果 ToString() 未被覆盖)还是您自己定义的任何内容.

例如,我在一个模块上工作,该模块同时使用Format.ps1xmlTypes.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    相关资源
    最近更新 更多