【问题标题】:PowerShell problem using Select-Object with C# cmdlet使用带有 C# cmdlet 的 Select-Object 的 PowerShell 问题
【发布时间】:2019-11-18 08:00:58
【问题描述】:

我编写了一个简单的 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> 获取数据 | Select-Object - 属性名称、类型 名称类型 ---- ----

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

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

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

(Get-Data).GetType().FullName

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

【问题讨论】:

  • 如果你运行Get-Data | Select-Object -Property *,你看到什么了吗?
  • 这是我所看到的:计数:2
    长度:2 LongLength:2 等级:1 SyncRoot:{A,B} IsReadOnly:False IsFixedSize:True IsSynchronized:False
  • 对不起,我之前的评论太草率了,我还在弄清楚 cmets 的格式 - 请忽略
    ,并且每个属性(计数、长度等)都已打开PS中的新行。
  • cmets 的格式很少。最好将任何稍微复杂的内容添加到您的原始帖子中。 ///// 因为你的属性列表没有显示NameType ...这意味着你的对象中有一些奇怪的东西。我建议您将对象保存到 $Var,然后查看 $Var.GetType() 向您显示的内容。

标签: c# powershell cmdlet select-object


【解决方案1】:

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

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

改变这一行:

base.WriteObject(refs);

base.WriteObject(refs, true);

修复默认行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多