创建包含自定义对象Powershell的自定义对象

时间:2014-03-11 21:57:30

标签: powershell

基本上我正在尝试将一个对象和一些值存储在另一个对象中。这可能吗?我试着这样做:

$testingobject = New-Object PSOBject
$testingobject2 = New-Object PSOBject 

$testingobject2 | Add-Member -MemberType NoteProperty -name "test" -value "test"
$testingobject  | Add-Member -MemberType MemberSet -name "test2" -Value $testingobject2

错误消息是:

Add-Member : Cannot convert value "@{test=test}" to type 
"System.Collections.ObjectModel.Collection`1[System.Management.Automation.PSMemberInfo]". Error: "Cannot 
convert the "@{test=test}" value of type "System.Management.Automation.PSCustomObject" to type 
"System.Collections.ObjectModel.Collection`1[System.Management.Automation.PSMemberInfo]"."
At line:1 char:19
+ $testingobject  | Add-Member -MemberType MemberSet -name "test2" -Value $testing ...
+                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Add-Member], PSInvalidCastException
    + FullyQualifiedErrorId : InvalidCastConstructorException,Microsoft.PowerShell.Commands.AddMemberCommand

我该怎么做?

2 个答案:

答案 0 :(得分:0)

如果要使用属性创建新对象,可以使用New-Object cmdlet和-Property参数轻松执行此操作,您可以使用属性传递散列表。

$myObject = New-Object PSObject -Property @{
    Property1 = "MyValue"
    Property2 = New-Object PSObject -Property @{
        SubProperty1 = "AnotherValue"
    }
}

如果要使用Add-Member添加新属性,则应该使用NoteProperty成员类型。您可以在有关PSMemberTypes Enumeration

的文档中阅读有关可用类型的更多信息
$myObject | Add-Member -Name Property3 -MemberType NoteProperty -Value (New-Object PSObject -Property @{
    SubProperty2 = "YetAnotherValue"
})

要测试此对象,我们可以使用以下内容:

$myObject.Property1
$myObject.Property2.SubProperty1
$myObject.Property3.SubProperty2

这将产生以下输出:

  

myvalue的

     

AnotherValue

     

YetAnotherValue

如果需要,我们还可以使用具有其他子属性的对象替换属性中的一个对象:

$myObject.Property2 = New-Object PSObject -Property @{
    SubProperty3 = "A fourth value"
}

$myObject.Property2.SubProperty3

哪会产生:

  

第四个值

答案 1 :(得分:0)

是的,只需更改" MemberSet"到" NoteProperty"在你的最后一行。

如果您使用PowerShell v2或更高版本,则可以在一行中执行此操作:

$testingobject = New-Object -TypeName PSObject -Property @{ test2 = (New-Object -TypeName PSObject -Property @{test = "test"}) }