【问题标题】:PowerShell Select-Object propertyName over an array of objectsPowerShell Select-Object propertyName 在对象数组上
【发布时间】:2012-08-19 01:22:46
【问题描述】:

我有一个用 C# 编写的自定义 CmdLet,它返回一个对象数组。出于测试目的,它们是匿名的。

    protected override void ProcessRecord()
    {
        var anonType1 = new { name = "Mikey", description = "Brown" };
        var anonType2 = new { name = "Davo", description = "Green" };

        List<object> stuff = new List<object>();
        stuff.Add(anonType1);
        stuff.Add(anonType2);

        this.WriteObject(stuff.ToArray());
    }

这在 PS2 中给出以下输出:

name       description
----       -----------
Mikey      Brown
Davo       Green

如果我使用 Select-Object name,我希望只排除“description”属性并将 Mikey 和 Davo 堆叠在一起,但不!我明白了:

name
----

我的数据呢!?

谢谢

卢克

顺便说一句:有没有人知道一个很好的学习资源来编写 CmdLets 和使用 PS 的内部结构(而不​​是大多数书籍所涉及的 PS 用法)?塔

更新

即使我制作了强类型,新建一些并将它们放在 PSDataCollection 中,它也无法按我的预期工作。我的期望显然是错误的。如何正确地将数据集合输出到管道?

已解决

我们必须设置 enumerateCollection = true。听起来很愚蠢,但我们没有使用 WriteObject 保护方法,而是我们自己的 WriteToAvailableOutput,它从 Visual Studio 中转移到调试器!所以我们看不到 WriteObject 上的额外重载 - dhuurr!!

【问题讨论】:

  • 不要在问题中写下解决方案,而应将其写为下面的单独答案并将其标记为已接受的答案。
  • 是的。我想,因为这首先是一个愚蠢的问题,所以我觉得为它做一个完整的答案有点愚蠢!

标签: c# powershell-2.0


【解决方案1】:

使用WriteObject重载并将enumerateCollection参数设置为true的答案。

this.WriteObject(stuff.ToArray(), true);

愚蠢的我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多