将成员添加到 PSCustomObject 变量 - 了解发生了什么



我试图弄清楚这里发生了什么,我想知道是否有人知道一个资源可以指出我正确的方向,或者可以为我解释一下。

我正在尝试创建一个 PSCustomObject 变量,然后创建它的成员,如下所示:

$myObject += [PSCustomObject]@{
FirstName = 'Bill'
LastName = 'Bobbins'
Age    = '30'
}
$myObject += [PSCustomObject]@{
FirstName = 'Ben'
LastName = 'Bobbins'
Age    = '40'
}

因此,第一段代码执行正常,但第二位代码会导致错误"方法调用失败,因为 [System.Management.Automation.PSObject] 不包含名为'op_Addition'的方法。另外,如果我通过管道$myObject获取成员,我可以看到$myObject是TypeName:System.Management.Automation.PSCustomObject。

现在,如果我先将$myObject设置为空数组,然后尝试添加成员,则成功。此代码工作正常,没有错误:

$myObject=@()
$myObject += [PSCustomObject]@{
FirstName = 'Bill'
LastName = 'Bobbins'
Age    = '30'
}
$myObject += [PSCustomObject]@{
FirstName = 'Ben'
LastName = 'Bobbins'
Age    = '40'
}

如果我现在通过管道$myObject获取成员,我仍然得到TypeName:System.Management.Automation.PSCustomObject。所以我的问题是,当两个示例中的数据类型相同时,为什么允许我在第二个示例中向$myObject添加多个成员,而不是在第一个示例中添加多个成员?

任何帮助都非常感谢!

谢谢

这里的问题是Get-Member/管道的工作方式 - 它之前绊倒了我!

这将展开数组,并在每个元素通过管道传递时为您提供其类型:

$myObject | Get-Member

这将传递整个对象,并正确为您提供类型System.Object[]

Get-Member -InputObject $myObject

例如,您可以通过在代码末尾添加$myObject += "test string"并尝试双向获取成员来测试这一点。第一个将返回PSObjectString类型。

旁注:通过在第一次声明数组时指定要创建数组来避免$myObject = @()$myObject。例:

[array]$myObject = [PSCustomObject]@{
[PSCustomObject[]]$myObject = [PSCustomObject]@{

最新更新