无法使用 PowerShell 以可读形式导出 system.object
Unable to export system.object in a readable form using PowerShell
我已经查看了其他答案,但我仍在苦苦挣扎。我有一些来自 RESTAPI 的数据,我使用 Invoke-RestMethod
获取该数据,因此它已经从返回的 JSON
转换而来
$scans = Invoke-RestMethod -URI "https://<url>/api/v1/<api key>/scans"
我取回了一个包含两个字段的对象
Message:
Data:
$Scans.Data
包含从 JSON 输出转换而来的散列 table,table 中的每个条目都具有以下 key:value 对
ScanID
Username
Targets
Name
这是$scans | Get-Member
的输出
$scans | gm
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
name NoteProperty string name=<redacted>
scan_id NoteProperty string scan_id=<redacted>
targets NoteProperty Object[] targets=System.Object[]
user_name NoteProperty string user_name=<redacted>
我需要将所有数据导出到 CSV 文件中,但 $scan.data.targets
只显示为 System.Object[]
我无法使用 -expandproperty
,因为我正在选择多个字段。
如何将 $scans.data.targets
转换为可读的导出格式,同时保持它与该条目的其他字段的链接?
相当于:
$scans.data | export-CSV <filepath>
但以打开 CSV 时可读的格式导出
如评论所述,您可以在输出中选择目标的组合字段:
# demo
$scan = [PsCustomObject]@{data = [PsCustomObject]@{name = 'blah'; scan_id = 123; targets = 'abc','def','ghi'; user_name = 'ItIsMe'}}
$scan.data | Select-Object *, @{Name = 'targets'; Expression = {$_.targets -join '; '}} -ExcludeProperty targets |
Export-Csv -Path 'D:\Test\blah.csv' -NoTypeInformation
(在控制台中显示时)如下所示:
name scan_id user_name targets
---- ------- --------- -------
blah 123 ItIsMe abc; def; ghi
或者创建输出,其中每个目标在 CSV 中都有自己的行:
$result = foreach ($item in $scan.data) {
foreach ($target in $item.targets) {
[PsCustomObject]@{
Name = $item.name
ScanID = $item.scan_id
Target = $target
UserName = $item.user_name
}
}
}
# output on screen
$result
# output to CSV file
$result | Export-Csv -Path 'D:\Test\blah.csv' -NoTypeInformation
这给了你这个:
Name ScanID Target UserName
---- ------ ------ --------
blah 123 abc ItIsMe
blah 123 def ItIsMe
blah 123 ghi ItIsMe
我已经查看了其他答案,但我仍在苦苦挣扎。我有一些来自 RESTAPI 的数据,我使用 Invoke-RestMethod
获取该数据,因此它已经从返回的 JSON
$scans = Invoke-RestMethod -URI "https://<url>/api/v1/<api key>/scans"
我取回了一个包含两个字段的对象
Message:
Data:
$Scans.Data
包含从 JSON 输出转换而来的散列 table,table 中的每个条目都具有以下 key:value 对
ScanID
Username
Targets
Name
这是$scans | Get-Member
$scans | gm
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
name NoteProperty string name=<redacted>
scan_id NoteProperty string scan_id=<redacted>
targets NoteProperty Object[] targets=System.Object[]
user_name NoteProperty string user_name=<redacted>
我需要将所有数据导出到 CSV 文件中,但 $scan.data.targets
只显示为 System.Object[]
我无法使用 -expandproperty
,因为我正在选择多个字段。
如何将 $scans.data.targets
转换为可读的导出格式,同时保持它与该条目的其他字段的链接?
相当于:
$scans.data | export-CSV <filepath>
但以打开 CSV 时可读的格式导出
如评论所述,您可以在输出中选择目标的组合字段:
# demo
$scan = [PsCustomObject]@{data = [PsCustomObject]@{name = 'blah'; scan_id = 123; targets = 'abc','def','ghi'; user_name = 'ItIsMe'}}
$scan.data | Select-Object *, @{Name = 'targets'; Expression = {$_.targets -join '; '}} -ExcludeProperty targets |
Export-Csv -Path 'D:\Test\blah.csv' -NoTypeInformation
(在控制台中显示时)如下所示:
name scan_id user_name targets
---- ------- --------- -------
blah 123 ItIsMe abc; def; ghi
或者创建输出,其中每个目标在 CSV 中都有自己的行:
$result = foreach ($item in $scan.data) {
foreach ($target in $item.targets) {
[PsCustomObject]@{
Name = $item.name
ScanID = $item.scan_id
Target = $target
UserName = $item.user_name
}
}
}
# output on screen
$result
# output to CSV file
$result | Export-Csv -Path 'D:\Test\blah.csv' -NoTypeInformation
这给了你这个:
Name ScanID Target UserName
---- ------ ------ --------
blah 123 abc ItIsMe
blah 123 def ItIsMe
blah 123 ghi ItIsMe