Powershell pscustomobject 格式-表格新行而不是一行

Posted

技术标签:

【中文标题】Powershell pscustomobject 格式-表格新行而不是一行【英文标题】:Powershell pscustomobject format-table new row instead of one line 【发布时间】:2016-11-03 04:28:08 【问题描述】:

我对员工有一个非常大的 JSON 响应,我试图将其转换为表格格式、导出为 CSV 并最终插入 SQL Server。我能够确定如何从 json 文件中获取所有变量,但是现在我将所有值插入到每一列的一行中,而不是每个员工的新行中。 另外,当我导出到 CSV 时,值会变成 System.Object[]。

$json1 = Invoke-webRequest -Uri $Workeruri -Certificate $cert -Headers $WorkerHeader | convertfrom-json

$table = [PSCustomObject] @
 associateOID = $json1.workers.associateOID
 workerID = $json1.workers.workerID.idValue 
 GivenName = $json1.workers.person.legalName.givenName
 MiddleName = $json1.workers.person.legalName.middleName
 FamilyName1 = $json.workers.person.legalName.familyName1 

  |format-table -autosize
 $table | export-csv $filepath -NoTypeInformation

这些列是一个小样本,实际上可能有 100 列。但是,我的回复是这样的:

associateOID     workerID        givenName                                          
------------     --------        ---------                                                                                                                                                                                                                                           
1,2,3,4,5...  a,b,c,d,e...   Lebron James, Micheal Jordan, Steph Curry...

我希望它返回:

associateOID     workerID        givenName                                          
------------     --------        --------- 
1                 A              Lebron James
2                 B              Micheal Jordan
3                 C              Steph Curry

此外,当导出为 CSV 时,响应具有正确的列,但所有列都返回:System.Object[]。 此外,我的具有整数和日期的字段没有返回数据。我该如何解决这个问题?

我尝试过使用 sort-object、group-object、for-each 循环。没有任何效果。

【问题讨论】:

【参考方案1】:

你可以这样试试:

$json1 = Invoke-webRequest -Uri $Workeruri -Certificate $cert -Headers $WorkerHeader | ConvertFrom-Json

$table = $json1 | ForEach-Object 
    [PSCustomObject] @
        associateOID = $_.workers.associateOID
        workerID = $_.workers.workerID.idValue 
        GivenName = $_.workers.person.legalName.givenName
        MiddleName = $_.workers.person.legalName.middleName
        FamilyName1 = $_.workers.person.legalName.familyName1
    


$table | Export-Csv $filepath -NoTypeInformation

$table | Format-Table -AutoSize

您的 sn-p 获取每一列的所有值并将它们存储在单个对象中,而不是迭代从 JSON 转换的对象集合。

此外,一旦您使用Format-Table,数据将被格式化以供显示,但不再可在管道中使用。这就是我将屏幕显示和 CSV 导出分开的原因。

【讨论】:

我尝试了您的确切代码,但每个员工仍然在 CSV 的同一单元格中。从另一个线程我读到我可以做一个 for 循环,并在每个列名的末尾使用 [i]。这适用于总是填写的列,但不是 MiddleName 的列最终使用该方法以错误的顺序结束。【参考方案2】:

@sodawillow 几乎得到它,假设 json1.workers 是包含您的工人的对象列表。

$json1 = Invoke-webRequest -Uri $Workeruri -Certificate $cert -Headers $WorkerHeader | ConvertFrom-Json

$table = $json1.workers | ForEach-Object 
    [PSCustomObject] @
        associateOID = $_.associateOID
        workerID = $_.workerID.idValue 
        GivenName = $_.person.legalName.givenName
        MiddleName = $_.person.legalName.middleName
        FamilyName1 = $_.person.legalName.familyName1
    


$table | Export-Csv $filepath -NoTypeInformation

$table | Format-Table -AutoSize

【讨论】:

以上是关于Powershell pscustomobject 格式-表格新行而不是一行的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell Add-Member ...奇怪的行为?

Powershell追踪路由

Azure VM 通过 powershell 的 Powerstate

Powershell中不存在特定对象属性时如何删除条目?

PowerShell - 使用排序的对象数组打印 JSON 输出?

Powershell System.Array 到 CSV 文件