Powershell 定义用于选择对象的自定义特性集(带“添加成员”)

Powershell 定义用于选择对象的自定义特性集(带“添加成员”),powershell,custom-object,pscustomobject,Powershell,Custom Object,Pscustomobject,我尝试做的很简单:创建一个具有一些属性的自定义对象,然后定义属性(列)的“组”以用于选择对象。让我澄清一下: $props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6} $obj = New-Object PSObject $props 我现在有一个自定义对象,其中包含一些虚假数据。我现在想做的是 $obj | select Male $obj | select Female 我原以为会有这样的效果: $obj | Add-Memb

我尝试做的很简单:创建一个具有一些属性的自定义对象,然后定义属性(列)的“组”以用于选择对象。让我澄清一下:

$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6}
$obj = New-Object PSObject $props
我现在有一个自定义对象,其中包含一些虚假数据。我现在想做的是

$obj | select Male
$obj | select Female
我原以为会有这样的效果:

$obj | Add-Member PropertySet "Male" @("Frank","John")
$obj | Add-Member PropertySet "Female" @("Mary","Jane","Brenda")
它不起作用-我收到以下错误:

Add-Member : Cannot convert the "System.Object[]" value of type 
"System.Object[]" to type "System.Collections.ObjectModel.Collection`1[System.String]".
我想我应该为
添加成员
提供数组以外的另一种对象类型,但我不确定该如何做

有人有这方面的经验吗


重要提示:我在Powershell 2上,我在各种网站上看到它有一个不允许设置默认属性的bug。这不是我想做的——我想创建一个自定义属性集,而不是一个默认属性集——但可能是这个错误也阻止了我得到我想要的东西。

你很接近了。问题是您没有正确创建对象。在指定属性的哈希表之前,需要指定
-Property
参数。没有它,您只需创建一个哈希表。这项工作:

$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6}
$obj = New-Object -TypeName PSObject -Property $props

$obj | Add-Member PropertySet "Male" @("Frank","John")
$obj | Add-Member PropertySet "Female" @("Mary","Jane","Brenda")

$obj | select male

Frank John
----- ----
    3    5
为什么会这样? 如果使用
Get help New Object
Get Command New Object-syntax
阅读
New Object
的语法,您将看到对于普通.Net类型,语法是:

New-Object [-TypeName] <String> [[-ArgumentList] <Object[]>] [-Property <IDictionary>]
而不是:

$obj = New-Object PSObject -Property $props
编辑上述解决方案仅适用于PS3.0。但是它仍然有效,因为PS2.0中也需要
-Property
参数。在PS2.0中,需要将propertyset数组强制转换为
string[]
(字符串数组),而不是对象数组(
object[]
),后者是默认数组。PS2.0的完整解决方案是:

$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6}
$obj = New-Object -TypeName PSObject -Property $props

$obj | Add-Member PropertySet "Male" ([string[]]@("Frank","John"))
$obj | Add-Member PropertySet "Female" ([string[]]@("Mary","Jane","Brenda"))

$obj | select male

Frank John
----- ----
    3    5

格雷默,你的回答是完整的,详细的,切中要害的,甚至比我要求的还要多。你让我开心!它现在工作得很好。很遗憾,我不能对你的答案投两次票:)你的好意已经足够了:-)
$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6}
$obj = New-Object -TypeName PSObject -Property $props

$obj | Add-Member PropertySet "Male" ([string[]]@("Frank","John"))
$obj | Add-Member PropertySet "Female" ([string[]]@("Mary","Jane","Brenda"))

$obj | select male

Frank John
----- ----
    3    5