0

我有一个二进制 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 中。我不知道他们代表什么。有什么想法吗?

4

2 回答 2

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 格式。

于 2013-03-14T08:18:51.497 回答
1

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

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

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

get-custompsobjct | select-object column1, column2 | export-csv a.csv
于 2013-03-14T12:18:00.527 回答