我是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
有没有更好的方法呢?
李霍姆斯写了一个blog post on a Join-Object function做你想要的。太糟糕了,它还没有内置到PowerShell中。
在1。5年后,我在原始答案中粘贴的cmdlet经历了如此多的更新,以至于它已经完全过时了。因此,我已将code和ReadMe替换为最新版本的链接。
可以使用以下命令从PowerShell库下载Join-Object cmdlet:
Install-Script -Name Join
Join
包中包含Join-Object
(别名Join
)命令和以下代理命令:
InnerJoin-Object
,别名InnerJoin
(Join-Object -JoinType Inner
)
仅返回已连接的对象LeftJoin-Object
,别名LeftJoin
(Join-Object -JoinType Left
)
返回连接的对象和其余的左对象RightJoin-Object
,别名RightJoin
(Join-Object -JoinType Right
)
返回连接的对象和其他正确的对象FullJoin-Object
,别名FullJoin
(Join-Object -JoinType Full
)
返回连接的对象以及左右对象的其余部分CrossJoin-Object
,别名CrossJoin
(Join-Object -JoinType Cross
)
将每个左对象连接到每个右对象Update-Object
,别名Update
(Join-Object -JoinType Left -Merge = {RightOrLeft.$_}
)
使用正确的对象属性更新左对象Merge-Object
,别名Merge
(Join-Object -JoinType Full -Merge = RightOrLeft.$_}
)
使用正确的对象属性更新左对象,如果相关属性的值不相等,则向右插入。完整的自述文件(和源代码)可从GitHub获得:https://github.com/iRon7/Join-Object
下载(Install-Script -Name Join
)后,dot sourcing可以简单地调用该脚本:
. .\Join.ps1
您还可以考虑将脚本重命名为PowerShell模块(.psm1
)并将其移动到$env:PSModulePath
中定义的模块文件夹之一,从而将脚本转换为PowerShell模块。有关详细信息,请参阅:How to Write a PowerShell Script Module。
注意:加载代理命令需要Import-Module
命令。
要回答问题中的实际示例:
$reservations | LeftJoin $leases -On IP
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
更多示例可以在相关的Stackoverflow问题中找到: