合并两个字典并用 powershell 中的值替换键

Combine two dictionaries and replace keys with values in powershell

我有两个数组,如下所示:

$ht1 = @{

"computer55" = "port33"

“computer1” = “port1”

“computer2” = “port2”



}

$ht2 = @{

"A1:B2:C3:D4:E5:F6" = "port1"

"A2:B3:C4:D5:E6:F7" = "port2"

"A3:B4:C5:D6:E7:F8" = "port33"

"A4:B4:C5:D6:E7:F8" = "port45"
}

第一个是我手动硬编码到脚本中的,我有一个实际的设备名称列表以及它们插入交换机的哪个端口。第二个是用登录的开关脚本生成的,获取 mac 地址 table 并将其记录为散列 table.

我想要的结果是这样的,如果有指定名称的端口,请将端口名称替换为设备名称。

$ht3(or any name) = @{

"A1:B2:C3:D4:E5:F6" = "computer1"

"A2:B3:C4:D5:E6:F7" = "computer2"

"A3:B4:C5:D6:E7:F8" = "computer55"

"A4:B4:C5:D6:E7:F8" = "port45"
}

我不知何故花了大约一天的时间(...几乎是我想出的第一个 powershell 脚本),我的最终结果总是一样的,我最终合并了两个散列tables 并将端口与计算机名称配对,而不是 mac 地址与计算机名称配对。任何方向表示赞赏

重要说明,.ContainsValue 方法区分大小写,如果您想要不区分大小写的搜索,请使用以下方法之一:

if($val = [string]$ht1.Keys.Where({$ht1[$_] -eq $ht2[$key]}))
{
    @{$key = $val}
    continue
}
if($ht1.Values -contains $ht2[$key])
{
    ...
}
if($ht2[$key] -in $ht1.Values)
{
   ...
}

代码

$ht1 = @{
    computer55 = 'port33'
    computer1 = 'port1'
    computer2 = 'port2'
}

$ht2 = @{
    'A1:B2:C3:D4:E5:F6' = 'port1'
    'A2:B3:C4:D5:E6:F7' = 'port2'
    'A3:B4:C5:D6:E7:F8' = 'port33'
    'A4:B4:C5:D6:E7:F8' = 'port45'
}

$result = foreach($key in $ht2.Keys)
{
    if($ht1.ContainsValue($ht2[$key]))
    {
        @{$key = [string]$ht1.Keys.Where({$ht1[$_] -eq $ht2[$key]})}
        continue
    }
    @{$key = $ht2[$key]}
}

查看 $result 产量:

Name                           Value      
----                           -----      
A1:B2:C3:D4:E5:F6              computer1  
A3:B4:C5:D6:E7:F8              computer55 
A4:B4:C5:D6:E7:F8              port45     
A2:B3:C4:D5:E6:F7              computer2  

[string]$ht1.Keys.Where({$ht1[$_] -eq $ht2[$key]})

也可以是下面的,不过我不确定哪个更有效:

$ht1.GetEnumerator().Where({$_.Value -eq $ht2[$key]}).Key