gpt4 book ai didi

PowerShell - 如何将两个自定义对象的属性添加到一起以创建单个合并的自定义对象

转载 作者:行者123 更新时间:2023-12-05 05:39:31 26 4
gpt4 key购买 nike

我正在使用一些 PowerShell 函数从某个 REST API 端点获取数据。遍历第一个查询的结果允许我使用 id 字段来检索第二个查询中的匹配结果,但是,第二个查询的返回结果没有任何与原始查询匹配的属性结果集,所以我不认为我可以执行 JOIN 或类似的东西。

例如,假设查询第一个 REST 端点的结果存储在 $a 中。

$a = 
ID Title Location Internal IP Address
-- ----- -------- -------------------
1 Endpoint 1 UK 10.0.0.1
2 Endpoint 2 US 10.1.0.1
3 Endpoint 3 AUS 10.2.0.1

然后使用 ID = 1 查询第二个 REST 端点,我们得到以下存储在 $b 中:

$b = 
NATed IP Address Last Provisioned Time
---------------- ---------------------
1.2.3.4 2022-02-10T04:09:31.988909+01:00

我想做的是结合两者的属性,一次一个记录,所以在我检索到 $b 之后,我将创建 $c,它看起来像这样:

$c =
ID Title Location Internal IP Address NATed IP Address Last Provisioned Time
-- ----- -------- ------------------- ---------------- ---------------------
1 Endpoint 1 UK 10.0.0.1 1.2.3.4 2022-02-10T04:09:31.988909+01:00

由于代码然后遍历 $a 的结果,因此我应该构建一个完整的合并对象,并且在 $a 的三次迭代之后,我们应该结束像这样:

$d =
ID Title Location Internal IP Address NATed IP Address Last Provisioned Time
-- ----- -------- ------------------- ---------------- ---------------------
1 Endpoint 1 UK 10.0.0.1 1.2.3.4 2022-02-10T04:09:31.988909+01:00
2 Endpoint 2 US 10.1.0.1 1.2.3.5 2022-02-10T04:09:31.988909+01:00
3 Endpoint 3 AUS 10.2.0.1 1.2.3.6 2022-02-10T04:09:31.988909+01:00

我觉得这相当简单,但是,我查看了许多不同的帖子和网站,但似乎没有一个能帮助我实现我想要的,或者更可能的是我只是误解了诸如 Add-Member 可能在多个管道循环中起作用,或者遗漏了明显的盲点。

我最接近的是下面的代码,它实际上产生了一个数组或哈希表(取决于我如何初始化 $collection 变量),但结果是相似的:

$collection = @{}

foreach ($item in $a) {
$collection += @{
"Title" = $item.Title
"Location" = $item.Location
"Internal IP Address" = $item."Internal IP Address"
}
}

foreach ($item in $b) {
$collection += @{
"NATed IP Address" = $item."NATed IP Address"
"Last Provisioned Time" = $item."Last Provisioned Time"
}
}

这会产生一个键/值表,例如:

Name                           Value
---- -----
ID 1
Title Endpoint 1
Internal IP Address 10.0.0.1
Location UK
NATed IP Address 1.2.3.4
Last Provisioned Time 2022-02-10T03:21:29.265257+01:00

这意味着我最终会得到一个数组数组(或哈希表的哈希表)。虽然我认为我仍然可以使用这种类型的数据格式,但我很想知道我需要做什么才能实现最初的目标。

更新

获取$a$b的代码如下。有一些函数包装了 API 调用:

$a = Get-Endpoints -Creds $Credentials -URI $FQDN

$a| ForEach-Object {
$b = Get-ProvisioningInfoEndpoint -Creds $Credentials -URI $FQDN -id $_.id |
Select-Object -Property @{Name="NATed IP Address";Expression={$_.ip}}, @{Name="Last Provisioned Time";Expression={$_.ts_created}}
}

更新 2

这是完整的代码,它可以工作,但是有点冗长而且可能真的很低效,并且会产生一个哈希表的哈希表:

$a = Get-Endpoints -Creds $Credentials -URI $FQDN

$a| ForEach-Object {
$b = Get-ProvisioningInfoEndpoint -Creds $Credentials -URI $FQDN -id $_.id |
Select-Object -Property @{Name="NATed IP Address";Expression={$_.ip}}, @{Name="Last Provisioned Time";Expression={$_.ts_created}}

$EndpointSelectedData = $_ | Select-Object -Property ID, @{Name="Title";Expression={$_.title}}, @{Name="Location";Expression={$_.location}}, @{Name="Internal IP Address";Expression={$_.ip}}

$c = @{}
foreach ($EndpointData in $EndpointSelectedData) {
$c += @{
"ID" = $EndpointData.id
"Title" = $EndpointData.Title
"Location" = $EndpointData.Location
"Internal IP Address" = $EndpointData."Internal IP Address"
}
}

foreach ($ProvisionedD in $ProvisionedData) {
$collection += @{
"NATed IP Address" = $ProvisionedD."NATed IP Address"
"Last Provisioned Time" = $ProvisionedD."Last Provisioned Time"
}
}

$d = $d + @{"Node_$i" = $c}
$i = $i + 1
}

更新 3

在@Santiago 的建议回答和@iRon 的指示之后,我现在有以下代码:

$Endpoints = Get-Endpoints -Creds $Credentials -URI $FQDN

foreach($i in $Endpoints) {
foreach($z in Get-ProvisioningInfoEndpoint -Creds $Credentials -URI $FQDN -Id $i.id) {
[pscustomobject]@{
'ID' = $i.Id
'Title' = $i.Title
'Location' = $i.Location
'Internal IP Address' = $i.Ip
'NATed IP Address' = $z.Ip
'Last Provisioned Time' = $z.Ts_Created
}
}
}

这会导致屏幕转储(我猜是管道清理):

ID                    : 1
Title : Endpoint 1
Location : UK
Internal IP Address : 10.0.0.1
NATed IP Address : 1.2.3.4
Last Provisioned Time : 2022-02-10T04:09:32.126357+01:00

ID : 2
Title : Endpoint 2
Location : US
Internal IP Address : 10.1.0.1
NATed IP Address : 1.2.3.5
Last Provisioned Time : 2022-02-10T04:21:32.657364+01:00

ID : 3
Title : Endpoint 3
Location : Aus
Internal IP Address : 10.2.0.1
NATed IP Address : 1.2.3.6
Last Provisioned Time : 2022-02-10T04:09:31.990202+01:00

...

所以,我想这已经接近我想要的,但还不是真的。我现在需要弄清楚如何处理管道输出...这与思维方式的改变同样重要,因此可能需要一些挠头。

更新 4 - 可能的解决方案

好的,所以扩展上面的代码块,我创建了一些额外的逻辑来将 pscustomobject 的输出通过管道传输到 CSV 文件。最终目的是根据前一天的配置检查各种端点的状态,看看是否有任何变化(因为它确实发生了变化,而且通常是在管理员不知情的情况下发生的!)。

分配了一个变量来存储嵌套的 foreach 循环的结果。然后将其用于导出为 CSV。我在脚本的开头添加了一些进一步的逻辑来检查文件是否存在,如果存在则删除今天的配置文件,这样如果脚本每天不小心运行一次以上,它就会创建一个新的配置文件.

主循环完成后,今天和昨天的文件将被重新导入,Compare-Object CmdLet 用于查看是否有任何变化。如果两个文件之间存在差异,我可能会添加一些发送电子邮件代码。

$DateStamp = get-date -Format FileDate
if (Test-Path -Path ".\endpoint-$($DateStamp).csv" -PathType Leaf) {
Remove-Item -Path ".\endpoint-$($DateStamp).csv"
}
$Endpoints = Get-Endpoints -Creds $Credentials -ERMMgr $MgrFQDN

$result = foreach($i in $Endpoints) {
foreach($z in Get-ProvisioningInfoEndpoint -Creds $Credentials -URI $FQDN -Id $i.id) {
[pscustomobject]@{
'ID' = $i.Id
'Title' = $i.Title
'Location' = $i.Location
'Internal IP Address' = $i.Ip
'NATed IP Address' = $z.Ip
'Last Provisioned Time' = $z.Ts_Created
}
}
}

$result | Export-Csv ".\endpoint-$DateStamp.csv"

if (Test-Path -Path ".\endpoint-$($DateStamp-1).csv" -PathType Leaf) {
$InFile2 = Import-CSV -Path ".\endpoint-$($DateStamp-1).csv"
Compare-Object -ReferenceObject $result -DifferenceObject $InFile2 -Property Title, "NATed IP Address" | Export-Csv ".\endpoint_diff-$DateStamp.csv"
}

最佳答案

从外观上看,这可能会为您提供所需的东西:

$result = foreach($i in Get-Endpoints -Creds $Credentials -URI $FQDN) {
foreach($z in Get-ProvisioningInfoEndpoint -Creds $Credentials -URI $FQDN -Id $id.id) {
[pscustomobject]@{
'ID' = $i.Id
'Title' = $i.Title
'Location' = $i.Location
'Internal IP Address' = $i.Ip
'NATed IP Address' = $z.Ip
'Last Provisioned Time' = $z.Ts_Created
}
}
}

基本上可以在运行时创建对象,而不是同时收集结果 $a$b 然后加入/合并它们。

关于PowerShell - 如何将两个自定义对象的属性添加到一起以创建单个合并的自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72665997/

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