0

我编写了一个简单的 C# cmdlet,我们称之为它Get-Data,它返回一个对象数组。

protected override void ProcessRecord() {
    base.ProcessRecord();

    DummyClass[] refs = new DummyClass[2];
    refs[0] = new DummyClass("A", "big");
    refs[1] = new DummyClass("B", "small");

    base.WriteObject(refs);
    return;
}

这是 的定义DummyClass

public class DummyClass {
    public string Name { get; set; }
    public string Type { get; set; }
    public DummyClass(string name, string  type) {
        this.Name = name;
        this.Type = type;
    }
}

当我自己运行 cmdlet 时,我得到了预期的输出 - 一行包含列标题,另外一行包含数组的每个元素。

PS>获取数据

名称类型
---- ----
一个大的
B 小

但是,当我将输出通过管道传输到 时Select-Object,我看到列标题,但没有数据行。

PS>获取数据 | 选择-对象-属性名称、类型

名称类型
---- ----

我什至尝试指定行数,但没有运气:

PS>获取数据 | Select-Object -Property Name,Type -Last 2

检查的类型Get-Data返回数据类型DummyClass[],这是我所期望的。

(Get-Data).GetType().FullName

有人对我使用时为什么没有数据行有任何想法Select-Object吗?我不知道这是否重要,但这个 cmdlet 继承自System.Management.Automation.PSCmdlet.

4

1 回答 1

2

它不起作用的原因是它没有DummyClass[]orName属性Type,因为它是一个数组。您可以通过嵌套管道来强制它解开:

(Get-Data) |Select-Object Name,Type

更改此行:

base.WriteObject(refs);

base.WriteObject(refs, true);

修复默认行为。

第二个参数 ( enumerateCollection) 使命令运行时解开您的数组,然后再将其发送到管道中的下一个 cmdlet。

于 2019-11-18T12:32:38.813 回答