使用 PowerShell 将两个 PSCustomObject 表合并为一个表

ura*_*gus 2 powershell merge pscustomobject

我想使用 PowerShell 将两个表合并为一个。

#Sample table
$CarList1 = @()
$CarList2 = @()

$CarList1 = [PSCustomObject]@{
    "Brand"           = "Audi";
    "Model"           = "A8";
    "Color"           = "Red";
    "ManufactureDate" = "2000.11.01"
}

$CarList2 = [PSCustomObject]@{
    "Brand"           = "Audi";
    "Model"           = "A4";
    "Color"           = "Green";
    "ManufactureDate" = "1998.11.01"
}
Run Code Online (Sandbox Code Playgroud)

我想将 $CarList2 的数据传输到 $CarList1

最后我希望将所有数据放在一张表中。

Brand Model Color ManufactureDate
----- ----- ----- ---------------
Audi  A8    Red   2000.11.01
Audi  A4    Green 1998.11.01
Run Code Online (Sandbox Code Playgroud)

我尝试过各种事情......

foreach ($property in $CarList2.psobject.Properties) {
    foreach ($array in $CarList2.$($property.Name)) {
        $CarList1.$($property.Name) += $array
    }
}
Run Code Online (Sandbox Code Playgroud)
$CarList1 += $CarList2

...
Run Code Online (Sandbox Code Playgroud)

我希望你能帮助我,我无法让它工作。

mkl*_*nt0 5

$CarList1 += $CarList2

这只在 is$CarList1 已经是一个 array 的情况下才有效,但这里的情况并非如此,因为即使您尝试使用 来将其初始化为数组,但考虑到后续赋值用单个对象替换了该值,$CarList1 = @()初始化也没有任何效果。$CarList1 = [PSCustomObject]@{ ... }

在不触及其他代码的情况下,最简单的解决方案是对复合赋值使用类型约束,如果需要,它会隐式转换$CarList1为数组,并且另外确保将来分配的任何值也将转换为[array]( [object[]]) :

# OK: Array concatenation, thanks to the [array] type constraint.
[array] $CarList1 += $CarList2
Run Code Online (Sandbox Code Playgroud)

请注意,为了使+运算符执行数组串联, LHS是一个数组就足够了;如果 RHS 不是,则将其作为单个元素附加到输出数组;如果是,则将其元素一一附加。


从上面可以看出,如果您(至少)使用这样的类型约束进行初始化,则可以按原样工作:$CarList1$CarList1 += $CarList2

# Initialize the variables as empty arrays and *type-constrain* them as arrays.
[array] $CarList1 = @()
[array] $CarList2 = @()

# Now, even assigning a *single* object causes an *array* to
# be stored, with on-demand conversion.
$CarList1 = [PSCustomObject]@{
    "Brand"           = "Audi";
    "Model"           = "A8";
    "Color"           = "Red";
    "ManufactureDate" = "2000.11.01"
}

# Ditto
$CarList2 = [PSCustomObject]@{
    "Brand"           = "Audi";
    "Model"           = "A4";
    "Color"           = "Green";
    "ManufactureDate" = "1998.11.01"
}

# Since (at least) $CarList1 now is an array, array concatenation
# now succeeds.
$CarList1 += $CarList2
Run Code Online (Sandbox Code Playgroud)

当然,在这个例子中,您可以不使用单独的初始化语句,只需执行以下操作:

  • [array] $CarList1 = [pscustomobject] @{ ... }, ...
  • 或者,如果不需要类型约束,您可以使用@(...), 数组子表达式运算符来确保您的单个对象成为数组:
    $CarList1 = @([pscustomobject] @{ ... })