gpt4 book ai didi

powershell - 匹配两个数组中的数据并与数组中的其他数据组合

转载 作者:行者123 更新时间:2023-12-05 05:42:09 28 4
gpt4 key购买 nike

目标

查看 $SP.ip 是否在 $NLIP.IpRanges 中,如果是,则添加 $NLIP.IpRanges $NLIP.DisplayName$SP 数组或全部到一个新数组。

数组

数组 1$SP,它是一个 CSV 导入,具有属性“name”和“ip”,它看起来像这样:

name: bob
ip: 1.9.8.2

数组 2$NLIP 并且具有相关属性“IpRanges”和“DisplayName”。它取自:$NLIP = Get-AzureADMSNamedLocationPolicy | where-object {$_.OdataType -eq "#microsoft.graph.ipNamedLocation"},它看起来像这样:

DisplayName : Named Location 1
IpRanges : {class IpRange {
CidrAddress: 16.29.28.9/28 #fictitious CIDR
}
, class IpRange {
CidrAddress: 1.9.8.3/28 #fictitious CIDR
}
}

代码/问题

我正在使用 IPInRange.ps1来自 https://github.com/omniomi/PSMailTools 的函数查找 IP 是否在范围内。它是这样工作的:

> IPInRange 1.9.8.2 1.9.8.3/28
True

我还计算出了 $NLTP.IpRanges.split() | Where-Object ($_ -like "*/*") 可以返回所有范围,但是 $NLIP | Where-Object {$_.IpRanges.split() -like "*/*"} 没有。我自然会使用第二个将变量保留在管道中以返回 DisplayName。所以我正在努力研究如何以这样的方式拉出各个范围,然后我可以添加'IpRange' 和 'DisplayName' 到数组。另外,也许是因为我还没有解决上述问题,但我正在努力思考如何遍历两个数组并将它们组合成一个。我知道我可能会进入一个 foreach ($item in $SP) 并创建一个临时数组,但在那之后它变得模糊了。

结果

我最终希望得到的是:

name: bob
ip: 1.9.8.2
IpRange: 1.9.8.3/28 #fictitious CIDR
DisplayName: Named Location 1

提前致谢。

最佳答案

如果我正确理解 NLIP 结构,我相信这对你有用。

我们将遍历所有 SP 对象,看看是否可以使用您链接的 IPinRange 函数找到与 IP 范围匹配的任何 NLIP。然后,如果匹配,我们会将您想要的 2 个属性添加到 SP 对象,最后传递给管道,或者您可以附加 | export-csv -path YourPath 如果你想发送到csv文件到最后

$SP | ForEach-Object {
$target = $_
$matched = $NLIP | ForEach-Object {
$item = $_
# Using where to single out matching range using IPinRange function
$_.IpRanges.Where({ IPInRange -IPAddress $target.ip -Range $_.CidrAddress }) |
ForEach-Object {
# for matching range output custom object containing the displayname and iprange
[PSCustomObject]@{
DisplayName = $item.DisplayName
IpRange = $_.CidrAddress
}
}
}
# add the 2 properties (DisplayName and IpRange) from the match to the original $SP
# object and then pass thru
$target | Add-Member -NotePropertyName DisplayName -NotePropertyValue $matched.DisplayName
$target | Add-Member -NotePropertyName IpRange -NotePropertyValue $matched.IpRange -PassThru

}

顺便说一句,这就是我对 NLIP 对象的设想以及我测试的内容

$NLIP = @(
[pscustomobject]@{
DisplayName = 'Named location 1'
IpRanges = @(
[pscustomobject]@{
CidrAddress = '16.29.28.9/28'
},
[pscustomobject]@{
CidrAddress = '1.9.8.3/28'
}
)
},
[pscustomobject]@{
DisplayName = 'Named location 2'
IpRanges = @(
[pscustomobject]@{
CidrAddress = '16.29.28.25/28'
},
[pscustomobject]@{
CidrAddress = '1.9.8.25/28'
}
)
}
)

关于powershell - 匹配两个数组中的数据并与数组中的其他数据组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72115399/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com