如何使用嵌套表和数组合并两个Powershell哈希表

时间:2018-11-30 06:19:48

标签: powershell nested hashtable

试图将两个哈希表与嵌套表和/或数组合并。我发现发布了Merging hashtables in Powershell: how?,这导致我创建了以下函数,以修改帖子中找到的sonjz代码,并且该代码可以很好地与非嵌套对象一起使用,但是当涉及父表中的嵌套表和数组时,它无法正确合并。

如何更新此代码以输出哈希表与嵌套表和/或数组(如果存在)的合并?

    Function Merge-HashTables
    {
        [CmdletBinding(ConfirmImpact = 'Low',
                       PositionalBinding = $true)]
        [OutputType([hashtable])]
        param
        (
            [Parameter(Mandatory = $true,
                       Position = 0)]
            [ValidateNotNullOrEmpty()]
            [hashtable]$BaseTable,

            [Parameter(Mandatory = $true,
                       Position = 1)]
            [ValidateNotNullOrEmpty()]
            [hashtable]$NewTable
        )

        Begin
        {
            [hashtable]$Base = $BaseTable.Clone()
        }

        Process
        {
            foreach ($Key in $NewTable.Keys)
            {
                if ($Base.ContainsKey($Key))
                {
                    $Base.Remove($Key)
                }
            }

            Write-Output ($Base + $NewTable)
        }
    }

1 个答案:

答案 0 :(得分:0)

当合并中的键冲突时,现在您只是丢弃一个而保留另一个,因此,如果实际上它们是两个不同的对象,则您总是会丢失一些信息。对于那些对象本身是哈希表或数组的情况,这当然仍然成立,因此,要处理此问题,必须确定要使用特殊合并逻辑处理的类型。

对于哈希表,您可以递归调用自己的函数。您将需要一个level参数来限制可以递归和/或处理循环引用的距离。

对于数组,您可以将它们添加在一起。

要确定对象是否属于某种类型,请使用..../dashboard%2Fus运算符。

当值的类型不同时,这将变得更加复杂,例如其中一个是-is,而其中一个是[hashtable]。您如何结合这些?

您可能还希望处理更多类型的词典和集合以进行组合,在这种情况下,您可以将[string]运算符用于接口,例如:

-is

if ($NewTable[$Key] -is [System.Collections.IDictionary]) { # handle combining dictionaries } 等类似。

如果此功能的范围非常有限,并且可以对期望值中的值进行假设,那么可能会更轻松,这实际上取决于您的用例。