从PSObject填充DataTable

时间:2019-10-14 07:41:25

标签: powershell

在谈到PS脚本时,我是一个绝对的初学者,我为一件简单的事情而苦苦挣扎:遍历PSObject项以将它们组合成1个数组。

我已经编写了一个基于Invoke-RestMethod的简单脚本,该脚本将为我使用的一种服务获取DNS配置。 我从他们的API获得的输出是JSON,当被Invoke-RestMethod使用时,它被转换成具有以下结构的customPSObject:

  • dns
    • dkim1
      • 有效
      • 主机
      • 类型
      • 数据
    • dkim2
      • 有效
      • 主机
      • 类型
      • 数据
    • domain_cname
      • 有效
      • 主机
      • 类型
      • 数据
    • owner_cname
      • 有效
      • 主机
      • 类型
      • 数据
    • mail_cname
      • 有效
      • 主机
      • 类型
      • 数据

当前,我正在使用以下代码来获取结果:

$res = Add-SGAuthDomains $SGapiKeyName $SGsubUserName

$strng = $res.Body.dns.dkim1 | Out-String
Write-Host $strng

$strng = $res.Body.dns.dkim2 | Out-String
Write-Host $strng
(...)

但是,正如您所看到的,这将生成单独的表。我想拥有的是所有这些结果都放在一个表中。

我已尝试根据以下代码使用DataTable

$dnsConf = New-Object System.Data.DataTable
[void]$dnsConf.Columns.Add("valid")
[void]$dnsConf.Columns.Add("host")
[void]$dnsConf.Columns.Add("type")
[void]$dnsConf.Columns.Add("data")

foreach ($item in $res.Body.dns) {
    $($item | Get-Member -MemberType *Property).Value
    [void]$dnsConf.Rows.Add($item.valid, $item.host, $item.type, $item.data)
}

$dnsConf | Format-Table

但是没有产生任何输出。我在做什么错了?

这是我得到的输出:

valid type  host                    data
----- ----  ----                    ----
False cname em9570.justchecking.xyz u13091771.wl022.sendgrid.net


valid type  host                           data
----- ----  ----                           ----
False cname s1._domainkey.justchecking.xyz s1.domainkey.u13091771.wl022.sendgrid.net


valid type  host                           data
----- ----  ----                           ----
False cname s2._domainkey.justchecking.xyz s2.domainkey.u13091771.wl022.sendgrid.net


valid type  host                     data
----- ----  ----                     ----
False cname url3844.justchecking.xyz sendgrid.net


valid type  host                      data
----- ----  ----                      ----
False cname 13091771.justchecking.xyz sendgrid.net

这就是我想要的样子:

valid type  host                    data
----- ----  ----                    ----
False cname em9570.justchecking.xyz u13091771.wl022.sendgrid.net
False cname s1._domainkey.justchecking.xyz s1.domainkey.u13091771.wl022.sendgrid.net
False cname s2._domainkey.justchecking.xyz s2.domainkey.u13091771.wl022.sendgrid.net
False cname url3844.justchecking.xyz sendgrid.net
False cname 13091771.justchecking.xyz sendgrid.net

1 个答案:

答案 0 :(得分:0)

可以通过将它们组合成一个大array来从不同对象中选择属性。仅当array中的所有对象都具有相同的属性时,这才起作用。

$res = @{
    Body = @{
        dns = @{
            dkim1 = @(
                [PSCustomObject]@{
                    valid = $false
                    type  = 'dkms1 name A'
                    host  = 'dkms1 host A'
                    data  = 'dkms1 data A'
                }
                [PSCustomObject]@{
                    valid = $false
                    type  = 'dkms1 name B'
                    host  = 'dkms1 host B'
                    data  = 'dkms1 data B'
                }
            )
            dkim2 = @(
                [PSCustomObject]@{
                    valid = $false
                    type  = 'dkms2 name A'
                    host  = 'dkms2 host A'
                    data  = 'dkms2 data A'
                }
                [PSCustomObject]@{
                    valid = $false
                    type  = 'dkms2 name B'
                    host  = 'dkms2 host B'
                    data  = 'dkms2 data B'
                }
            )
        }
    }
}

@($res.Body.dns.dkim1, $res.Body.dns.dkim2) | Format-Table

将导致:

valid type         host         data
----- ----         ----         ----
False dkms1 name A dkms1 host A dkms1 data A
False dkms1 name B dkms1 host B dkms1 data B
False dkms2 name A dkms2 host A dkms2 data A
False dkms2 name B dkms2 host B dkms2 data B