在将两个哈希表与Powershell进行比较时,如何选择特定的哈希表键和值?

时间:2019-05-06 18:11:09

标签: powershell foreach compare hashtable

我需要比较并合并两个哈希表,但保留特定键的值。

$Left = @{Name = "Alex"; CreationDate = "2018-10-20"; Status = "Married"}
$Right = @{CreationDate = "2019-03-15"; Status = "Divorced"; City = "NY"; Country = "US"}

这两个对象一旦合并,就不能更改名称 ,CreationDate必须保留“ 2001-10-20”,就像在$ Left表中一样,状态需要更新,并且城市和国家应添加到列表中。 以下脚本正在正确更新,添加和保留所有键的值,但它覆盖了我的CreationDate。

这是用于使用Powershell更新某些文件标签。

function New-Result($Key, $Value) {
        New-Object -Type PSObject -Property @{
                    Key    = $Key
                    Value = $Value
            }
    }
    [Object[]]$Results = $Left.Keys | % {
        if ($Left.ContainsKey($_) -and !$Right.ContainsKey($_)) {
            New-Result $_ $Left[$_]
        }
    }
    $Results += $Right.Keys | % {
        if (!$Left.ContainsKey($_) -and $Right.ContainsKey($_) -and ($Right[$_])){
                New-Result $_ $Right[$_]

        }
    }

    $Results += $Right.Keys | % {
        if ($Left.ContainsKey($_) -and $Right.ContainsKey($_) -and ($Right[$_])) {
            New-Result $_ $Right[$_]
        } 
    }
    return $Results 

我需要为CreationDate键选择$ Left值,但到目前为止无法这样做。

1 个答案:

答案 0 :(得分:2)

这是家常便饭,但是可以用。 [咧嘴]

它做什么...

  • 通过表的 new 版本中的键
  • 进行迭代
  • 如果键为Status,请使用新值
  • 更新版本
  • 如果该键不在 old 版本的键列表中,则添加它及其值

由于哈希表是通过引用传递的,因此可以根据需要将其放入函数中。我不确定这样做是否有意义。我可能会把它循环处理您的收藏夹中的项目。

代码...

$Original = @{
    Name = "Alex"
    CreationDate = "2018-10-20"
    Status = "Married"
    }
$Updated = @{
    CreationDate = "2019-03-15"
    Status = "Divorced"
    City = "NY"
    Country = "US"
    }

foreach ($Key in $Updated.Keys)
    {
    if ($Key -eq 'Status')
        {
        $Original[$Key] = $Updated[$Key]
        }
    if ($Key -notin $Original.Keys)
        {
        $Original.Add($Key, $Updated[$Key])
        }
    }

$Original

输出...

Name                           Value
----                           -----
CreationDate                   2018-10-20
Status                         Divorced
Name                           Alex
City                           NY
Country                        US