3

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

$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]".

我想我应该提供另一种对象类型而不是我的数组 to Add-Member,但我不确定我应该如何做到这一点。

有人对此有经验吗?

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

4

1 回答 1

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

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

New-Object [-TypeName] <String> [[-ArgumentList] <Object[]>] [-Property <IDictionary>]

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

$obj = New-Object -TypeName PSObject -ArgumentList $props

代替:

$obj = New-Object PSObject -Property $props

编辑上述解决方案仅适用于 PS3.0 。但它仍然有效,因为-Property在 PS2.0 中也需要该参数。在 PS2.0 中,您需要将 propertyset-array 转换为string[](string-array) 而不是作为object[]默认数组的 object-array ( )。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
于 2013-02-21T16:37:38.433 回答