将自定义对象导出为CSV

时间:2017-06-27 09:21:59

标签: powershell export-to-csv

我对powershell很陌生,并努力将数据输出到CSV文件。 我有一个更大的代码片段,但创建了以下包含问题的小工作示例:

$results = @()
$tmp_avs = @('tmp', 'tmp2')
$hostname = 'hostname'
$results += New-Object -TypeName PSObject -Property (@{Hostname=$hostname; avs=$tmp_avs})
$res = $results | ? {$_.avs.Count -gt 0} | Format-Table

$res | Export-Csv -NoTypeInformation "test.csv"

在PowerShell中打印上面的$res对象时,我得到输出:

avs         Hostname
---         --------
{tmp, tmp2} hostname

这也是我想在CSV文件中收到的输出,但目前我得到的是这样的:

"ClassId2e4f51ef21dd47e99d3c952918aff9cd","pageHeaderEntry","pageFooterEntry","autosizeInfo","shapeInfo","groupingEntry"
"033ecb2bc07a4d43b5ef94ed5a35d280",,,,"Microsoft.PowerShell.Commands.Internal.Format.TableHeaderInfo",
"9e210fe47d09416682b841769c78b8a3",,,,,
"27c87ef9bbda4f709f6b4002fa4af63c",,,,,
"4ec4f0187cb04f4cb6973460dfe252df",,,,,
"cf522b78d86c486691226b40aa69e95c",,,,,

是否可以以正确的CSV格式导出$res对象?

编辑: 我现在删除了Format-Table,这会产生以下CSV格式:

"avs","Hostname"
"System.Object[]","hostname"

是否写了System.Object[]而不是值?

2 个答案:

答案 0 :(得分:3)

值是一个数组。如果您运行$tmp_avs.ToString(),您还会获得System.Object[]

要解决此问题,请将avs=$tmp_avs替换为avs=$($tmp_avs -join " "),其中是数组元素之间的连接字符。它将数组转换为字符串。

<强>代码:

$results = @()
$tmp_avs = @('tmp', 'tmp2')
$hostname = 'hostname'
$results = New-Object -TypeName PSObject -Property (@{Hostname=$hostname; avs=$($tmp_avs -join " ")})
$res = $results | ? {$_.avs.Count -gt 0} 
$res | Export-Csv -NoTypeInformation "test.csv"

<强>输出:

avs,Hostname
tmp tmp2, hostname

答案 1 :(得分:0)

如果您不想看到System.object [],但是以逗号分隔的列表,您可以将数组转换为字符串,这样就可以用CSV正确输出。

尝试将$tmp_avs = $tmp_avs -join ";"添加到行$tmp_avs = @('tmp', 'tmp2')下方的脚本中。