定义自定义属性集(使用Add-Member?)以在Select-Object中使用

Joo*_*ost 3 powershell custom-object pscustomobject

我尝试做的很简单:创建一个具有一些属性的自定义对象,然后定义属性(列)的"组"以在Select-Object中使用.让我澄清一下:

$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6}
$obj = New-Object PSObject $props
Run Code Online (Sandbox Code Playgroud)

我现在有一个带有一些虚假数据的自定义对象.我现在想要做的是

$obj | select Male
$obj | select Female
Run Code Online (Sandbox Code Playgroud)

而我曾想过会做的伎俩是这样的:

$obj | Add-Member PropertySet "Male" @("Frank","John")
$obj | Add-Member PropertySet "Female" @("Mary","Jane","Brenda")
Run Code Online (Sandbox Code Playgroud)

它不起作用 - 我收到此错误:

Add-Member : Cannot convert the "System.Object[]" value of type 
"System.Object[]" to type "System.Collections.ObjectModel.Collection`1[System.String]".
Run Code Online (Sandbox Code Playgroud)

我想我应该提供另一个对象类型而不是我的数组Add-Member,但我不确定我应该怎么做.

有任何人对此有经验吗?

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

Fro*_* F. 7

你很近.问题是您没有正确创建对象.-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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?如果您阅读New-Object使用Get-help new-object或的语法Get-Command New-Object -Syntax,您会看到对于普通的.Net类型,语法是:

New-Object [-TypeName] <String> [[-ArgumentList] <Object[]>] [-Property <IDictionary>]
Run Code Online (Sandbox Code Playgroud)

请注意,这-ArgumentList是第二个参数,不像-Property您预期的那样.所以你的代码实际上做了:

$obj = New-Object -TypeName PSObject -ArgumentList $props
Run Code Online (Sandbox Code Playgroud)

代替:

$obj = New-Object PSObject -Property $props
Run Code Online (Sandbox Code Playgroud)

编辑上述解决方案仅适用于PS3.0.它仍然有效,因为-PropertyPS2.0中也需要参数.在PS2.0中,您需要将propertyset-array转换为string[](string-array),而不是将对象数组(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
Run Code Online (Sandbox Code Playgroud)