Разбор вывода Invoke-RestMethod в CSV-файл - PullRequest
1 голос
/ 11 июня 2019

Мне нужно проанализировать вывод из Invoke-RestMethod, чтобы извлечь элементы в отдельные столбцы в файле CSV, чтобы я мог импортировать в базу данных.Любая помощь будет оценена.

Пробные foreach, split и регулярные выражения

$trusted_facts = @{
query=’["from", "facts",
    ["extract", ["certname", "environment", "value"],
      ["=", "name", "trusted"]
    ]
  ]’
}

$jsonbody = $trusted_facts | ConvertTo-Json

$response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers - 
Body $jsonbody -ContentType 'application/JSON'

$response.value | Format-List

$response.value | Export-Csv -Path $csvFileName -NoTypeInformation

Это вывод, когда я передаю его в Format-List

domain        : prci.com
certname      : xobqpupm.prci.com
hostname      : xobqpupm
extensions    : 
authenticated : remote

domain        : proghszq.com
certname      : scpupt03.proghszq.com
hostname      : scpupt03
extensions    : 
authenticated : remote

domain        : proghszq.com
certname      : scpupq13.proghszq.com
hostname      : scpupq13
extensions    : @{pp_role=test_server; pp_apptier=development; pp_project=corporate; pp_department=puppet_common}
authenticated : remote

domain        : proghszq.com
certname      : scchocot01.proghszq.com
hostname      : scchocot01
extensions    : @{pp_role=chocotest; pp_apptier=production; pp_project=puppet_ets; pp_department=compute}
authenticated : remote

Thisэто вывод, когда я передаю данные по каналу Export-CSv

"prci.com","xobqpupm.prci.com","xobqpupm","","remote"
"proghszq.com","scpupt03.proghszq.com","scpupt03","","remote"
"proghszq.com","scpupq13.proghszq.com","scpupq13","@{pp_role=test_server; pp_apptier=development; pp_project=corporate; pp_department=puppet_common}","remote"
"proghszq.com","scchocot01.proghszq.com","scchocot01","@{pp_role=chocotest; pp_apptier=production; pp_project=puppet_ets; pp_department=compute}","remote"

Это вывод, который я желаю (т. е. при заполнении расширений извлекать элементы и помещать в отдельные столбцы)

"proghszq.com","scpupq13.proghszq.com","scpupq13","test_server","development","corporate","puppet_common"
"proghszq.com","scchocot01.proghszq.com","scchocot01","chocotest","production","puppet_ets","compute"

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Export-Csv: преобразование в файл CSV предполагает одинаковое количество столбцов во всех входных данных.Используйте вычисленные свойства :

$response.value | Select-Object -Property *,
    @{ n='pp_role';
       e={ if ('pp_role' -in $_.extensions.psobject.Properties.name) 
                {$_.extensions.pp_role} else {''} }},
    @{ n='pp_apptier';
       e={ if ('pp_apptier' -in $_.extensions.psobject.Properties.name) 
                {$_.extensions.pp_apptier} else {''} }},
    @{ n='pp_project';
       e={ if ('pp_project' -in $_.extensions.psobject.Properties.name) 
                {$_.extensions.pp_project} else {''} }},
    @{ n='pp_department';
       e={ if ('pp_department' -in $_.extensions.psobject.Properties.name) 
                {$_.extensions.pp_department} else {''} }}

Проверено на $aux вместо $response.value, где $aux определяется следующим образом:

$aux = @(
    [PSCustomObject]@{
        domain        = 'A.proghszq.com'
        certname      = 'A.scpupq13.proghszq.com'
        hostname      = 'A.scpupq13'
        extensions    = ''
        authenticated = 'A.remote'
    },
    [PSCustomObject]@{
        domain        = 'proghszq.com'
        certname      = 'scpupq13.proghszq.com'
        hostname      = 'scpupq13'
        extensions    = [PSCustomObject]@{ 
                            pp_role      ='test_server'
                            pp_apptier   ='development'
                            pp_project   ='corporate'
                            pp_department='puppet_common'
                        }
        authenticated = 'remote'
    }
)

Вывод :

domain        : A.proghszq.com
certname      : A.scpupq13.proghszq.com
hostname      : A.scpupq13
extensions    : 
authenticated : A.remote
pp_role       : 
pp_apptier    : 
pp_project    : 
pp_department : 

domain        : proghszq.com
certname      : scpupq13.proghszq.com
hostname      : scpupq13
extensions    : @{pp_role=test_server; pp_apptier=development; pp_project=corporate; pp_department=puppet_common}
authenticated : remote
pp_role       : test_server
pp_apptier    : development
pp_project    : corporate
pp_department : puppet_common
0 голосов
/ 12 июня 2019

Вот еще один подход, который отфильтровывает ответы, которые не имеют записей в поле расширений:

$aux | where {($_.extensions -ne $null) -and ($_.extensions -ne '')} |
    select domain, certname, hostname, 
    @{n='pp_role';e={$_.extensions.pp_role}},
    @{n='pp_apptier';e={$_.extensions.pp_apptier}}, 
    @{n='pp_project';e={$_.extensions.pp_project}},
    @{n='pp_department';e={$_.extensions.pp_department}} |
      ConvertTo-Csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...