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