使用 Select-Object 和 C# cmdlet 的 PowerShell 问题

PowerShell problem using Select-Object with C# cmdlet

我写了一个简单的 C# cmdlet,我们称它为 Get-Data,returns 一个 objects.

的数组
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> Get-Data

Name Type
---- ----
A    big
B    small

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

PS> Get-Data | Select-Object -Property Name,Type

Name Type
---- ----

我什至尝试指定行数,但没有成功:

PS> Get-Data | Select-Object -Property Name,Type -Last 2

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

(Get-Data).GetType().FullName

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

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

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

更改此行:

base.WriteObject(refs);

base.WriteObject(refs, true);

修复默认行为。

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