为什么export-csv返回包含wierd数据的文件?

时间:2013-03-13 22:31:41

标签: powershell cmdlets cmdlet

我有一个二进制cmdlet Get-CustomPSObject。当我做类似的事情时:

Get-CustomPSObject > a.txt

结果存储为纯文本,这意味着Get-CustomPSObject正常工作。

然而,当我尝试:

Get-CustomPSObject | Export-csv a.csv

a.csv文件变为:

"Capacity","Count","IsReadOnly","IsFixedSize","SyncRoot","IsSynchronized"
"4","1","False","False","System.Object","False"

这些字段都不在我的PSObject中。我不知道他们代表什么。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

Export-CSV获取它收到的第一个对象来创建标题。最有可能的是,Get-CustomPSOjbect运行一个方法/ cmdlet /脚本,它返回一个你没有保存的对象。例如。你使用像

这样的东西
get-childitem

而不是

$files = get-childitem

Get-CustomPSObject功能中。

修改 好的,所以你的cmdlet是一个二进制cmdlet。重要信息。我不是这方面的专家,所以如果我错了请纠正我。

当您创建可以输出多个对象的二进制cmdlet时,您需要逐个编写它们。 PowerShell背后的一个想法是使用一个可以在不等待完整数组的情况下使用对象的管道。

由于您的二进制cmdlet中当前存在“设计缺陷”,Export-CSV会尝试将数组(作为一个项目)导出到csv文件而不是内部元素。

您现在使用此:

WriteObject(list/array of objects)

这很糟糕。它同时输出所有对象。

要修复它,请在“对象创建循环”结束时运行它:

WriteObject(mycurrentobject) 

这很好。您可以启用管道,并且每个对象在创建时都会逐个发送。然后Export-CSV可以接收每个对象并将它们转换为csv格式。

答案 1 :(得分:1)

在您使用>的第一个示例中输出通过Powershell格式化系统运行,而在第二个使用export-csv则不是。

如果你看一下get-custompsobject |你应该看到那些没有在控制台中显示或发送到你的文本文件的额外属性。

对于export-csv,您可以使用select-object控制将哪些属性发送到csv文件

get-custompsobjct | select-object column1, column2 | export-csv a.csv