- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一些 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/
我有几个长度不等的 vector ,我想对其进行cbind。我将 vector 放入列表中,并尝试结合使用do.call(cbind, ...): nm <- list(1:8, 3:8, 1:5)
合并(合并)两个 JSONObjects 的最佳方式是什么? JSONObject o1 = { "one": "1", "two": "2", "three": "3" }
我在一个表中有许多空间实体,其中有一个名为 Boundaries 的 geometry 字段。我想生成一个具有简化形状/几何图形的 GeoJson 文件。 这是我的第一次尝试: var entitie
谁能说出为什么这个选择返回 3.0 而不是 3.5: SELECT coalesce(1.0*(7/2),0) as foo 这个返回 3: SELECT coalesce(7/2,0) as foo
首先抱歉,也许这个问题已经提出,但我找不到任何可以帮助我的东西,可能是因为我对 XSLT 缺乏了解。 我有以下 XML: 0 OK
有时用户会使用 Windows 资源管理器复制文件并在他们应该执行 svn 存储库级别的复制或合并时提交它们。因此,SVN 没有正确跟踪这些变化。一旦我发现这一点,损坏显然已经完成,并且可能已经对相关
我想组合/堆叠 2 个不同列的值并获得唯一值。 如果范围相邻,则可以正常工作。例如: =UNIQUE(FILTERXML(""&SUBSTITUTE(TEXTJOIN(",",TRUE,TRANSPO
使用iTextSharp,如何将多个PDF合并为一个PDF,而又不丢失每个PDF中的“表单字段”及其属性? (我希望有一个使用来自数据库的流的示例,但文件系统也可以) 我发现this code可以正常
是否有一个合并函数可以优先考虑公共(public)变量中的非缺失值? 考虑以下示例。 首先,我们生成两个 data.frames,它们具有相同的 ID,但在特定变量上有互补的缺失值: set.seed
我们正在尝试实现 ALM Rangers 在最新的 Visual Studio TFS Branching and Merging Guide 中描述的“基本双分支计划”。 .从指导: The bas
我在不同目录(3个不同名称)中有很多(3个只是一个例子)文本文件,如下所示: 目录:A,文件名:run.txt 格式:txt制表符分隔 ; file one 10 0.2 0.5 0.
我有一张包含学生等级关系的表: Student Grade StartDate EndDate 1 1 09/01/2009 NULL 2
我在学习 https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-associatio
我觉得我有世界上最简单的 SVN 用例: 我有一个文件,Test.java在 trunk SVN的。 我分行trunk至 dev-branch . 我搬家Test.java进入 com/mycompa
我有两个数据框,其中一些列名称相同,而另一些列名称不同。数据框看起来像这样: df1 ID hello world hockey soccer 1 1 NA NA
Elasticsearch 中是否缺少以扁平化形式(多个子/子aggs)返回结果的方法? 例如,当前我正在尝试获取所有产品类型及其状态(在线/离线)。 这就是我最终得到的: aggs [ { key:
如何合并如下所示的 map : Map1 = Map(1 -> Class1(1), 2 -> Class1(2)) Map2 = Map(2 -> Class2(1), 3 -> Class2(2)
我试图通过从netezza服务器导入数据来合并两个数据集。 以下是数据集,其数字为,ID为,字母为,名称为: 下表都是使用命令从netezza导入的: sqoop import --connect n
我有两个数组 $array1 = array('first', 'second', 'third', 'fourth'); $array2 = array('first', 'third', 'fou
我正在 SQL Server 中运行合并。在我的更新中,我只想在值发生更改时更新该行。有一个版本行在每次更新时都会递增。下面是一个例子: MERGE Employee as tgt USING (SE
我是一名优秀的程序员,十分优秀!