使用 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[]
没有 Name
或 Type
属性,因为它是一个数组。您可以通过嵌套管道强制它展开:
(Get-Data) |Select-Object Name,Type
更改此行:
base.WriteObject(refs);
至
base.WriteObject(refs, true);
修复默认行为。
第二个参数 (enumerateCollection
) 使命令运行时解开您的数组,然后再将其发送到管道中的下一个 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[]
没有 Name
或 Type
属性,因为它是一个数组。您可以通过嵌套管道强制它展开:
(Get-Data) |Select-Object Name,Type
更改此行:
base.WriteObject(refs);
至
base.WriteObject(refs, true);
修复默认行为。
第二个参数 (enumerateCollection
) 使命令运行时解开您的数组,然后再将其发送到管道中的下一个 cmdlet。