在Powershell中,将两个表合并为一个表的最佳方法是什么?

在Powershell中,将两个表合并为一个表的最佳方法是什么?

我是Powershell的新手,我想知道是否有人知道有任何更好的方法来完成以下示例问题。


我有一个从IP地址到主机名的映射数组。这表示活动DHCP租约列表:


PS H:\> $leases


IP                    Name

--                    ----

192.168.1.1           Apple

192.168.1.2           Pear

192.168.1.3           Banana

192.168.1.99          FishyPC

我有另一个从MAC地址到IP地址的映射数组。这代表了IP预订列表:


PS H:\> $reservations


IP                    MAC

--                    ---

192.168.1.1           001D606839C2

192.168.1.2           00E018782BE1

192.168.1.3           0022192AF09C

192.168.1.4           0013D4352A0D

为方便起见,我能够使用以下代码生成从MAC地址到IP地址和主机名的第三个映射数组。我们的想法是$reservations应该获得第三个字段“Name”,只要有匹配的“IP”字段就填充该字段:


$reservations = $reservations | foreach {

    $res = $_

    $match = $leases | where {$_.IP -eq $res.IP} | select -unique

    if ($match -ne $NULL) {

        "" | select @{n="IP";e={$res.IP}}, @{n="MAC";e={$res.MAC}}, @{n="Name";e={$match.Name}}

    }

}

所需的输出是这样的:


PS H:\> $ideal


IP                    MAC                 Name

--                    ---                 ----

192.168.1.1           001D606839C2        Apple

192.168.1.2           00E018782BE1        Pear

192.168.1.3           0022192AF09C        Banana

192.168.1.4           0013D4352A0D

有没有更好的方法呢?


弑天下
浏览 1019回答 3
3回答

慕莱坞森

Lee Holmes写了一篇关于Join-Object函数的博客文章,它可以满足您的需求。太糟糕了,它还没有内置到PowerShell中。

牛魔王的故事

功能很棒,但是如果在Powershell模块中使用它,请小心。由于作用域的工作方式,$Left和$Right变量在-Merge脚本块中不可用(模块的变量是模块专用的,因此脚本块无法看到它们)。如果点源或将函数直接包含在调用它的脚本中,则这不是问题。
打开App,查看更多内容
随时随地看视频慕课网APP