合并两个字典并用 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
我有两个数组,如下所示:
$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