Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 为什么导出csv返回包含wierd数据的文件?_Powershell_Cmdlets_Cmdlet - Fatal编程技术网

Powershell 为什么导出csv返回包含wierd数据的文件?

Powershell 为什么导出csv返回包含wierd数据的文件?,powershell,cmdlets,cmdlet,Powershell,Cmdlets,Cmdlet,我有一个二进制cmdletGet CustomPSObject。当我做以下事情时: Get-CustomPSObject > a.txt 结果存储为纯文本,这意味着Get CustomPSObject工作正常 然而,当我尝试: Get-CustomPSObject | Export-csv a.csv a.csv文件变为: "Capacity","Count","IsReadOnly","IsFixedSize","SyncRoot","IsSynchronized" "4","1",

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

导出CSV获取它接收到的第一个对象来创建标题。最可能的情况是,Get-CustomPSOjbect运行一个方法/cmdlet/脚本,该方法返回一个未保存的对象。例如,您使用类似

get-childitem
而不是

$files = get-childitem
Get CustomPSObject
函数中

编辑 好的,您的cmdlet是一个二进制cmdlet。重要信息。我不是这方面的专家,如果我错了,请纠正我

当您制作可以输出多个对象的二进制cmdlet时,需要逐个编写它们。PowerShell背后的一个想法是使用管道,它可以在对象出现时使用对象,而无需等待完整的阵列

由于二进制cmdlet中当前存在“设计缺陷”,因此,
Export CSV
尝试将数组(作为一项)导出到CSV文件,而不是其中的元素

您现在可以使用以下命令:

WriteObject(list/array of objects)
这很糟糕。它同时输出所有对象

要修复此问题,请在“对象创建循环”结束时运行此命令:


这很好。您启用了管道的使用,每个对象在创建时都会一个接一个地发送出去<代码>导出CSV然后可以接收每个对象并将其转换为CSV格式。

导出CSV
将接收到的第一个对象用于创建标题。最可能的情况是,Get-CustomPSOjbect运行一个方法/cmdlet/脚本,该方法返回一个未保存的对象。例如,您使用类似

get-childitem
而不是

$files = get-childitem
Get CustomPSObject
函数中

编辑 好的,您的cmdlet是一个二进制cmdlet。重要信息。我不是这方面的专家,如果我错了,请纠正我

当您制作可以输出多个对象的二进制cmdlet时,需要逐个编写它们。PowerShell背后的一个想法是使用管道,它可以在对象出现时使用对象,而无需等待完整的阵列

由于二进制cmdlet中当前存在“设计缺陷”,因此,
Export CSV
尝试将数组(作为一项)导出到CSV文件,而不是其中的元素

您现在可以使用以下命令:

WriteObject(list/array of objects)
这很糟糕。它同时输出所有对象

要修复此问题,请在“对象创建循环”结束时运行此命令:


这很好。您启用了管道的使用,每个对象在创建时都会一个接一个地发送出去<代码>导出CSV然后可以接收每个对象并将其转换为CSV格式。

在第一个使用>的示例中,输出通过Powershell格式化系统运行,而在第二个使用导出CSV的示例中,输出不通过

如果您查看get custompsobject | gm,您应该会看到控制台中未显示或未发送到文本文件的额外属性

对于导出csv,您可以使用“选择对象”控制将哪些属性发送到csv文件

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

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

如果您查看get custompsobject | gm,您应该会看到控制台中未显示或未发送到文本文件的额外属性

对于导出csv,您可以使用“选择对象”控制将哪些属性发送到csv文件

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

您需要显示Get-CustomPSObject函数。@AbqBill Get-CustomPSObject调用了许多api调用,如果我不复制10个以上的文件,我认为这没有意义……您需要显示Get-CustomPSObject函数。@AbqBill Get-CustomPSObject调用了许多api调用,如果我不复制10个以上的文件,我认为这没有意义Get CustomPSObject最终通过WriteObject写入管道($PSObject列表);你建议怎么办?首先。我将更新该问题,以包括cmdlet是二进制cmdlet。第二,看更新的答案你是对的,循环中的writeobject起作用了!谢谢伟大:-如果你认为这是正确的答案,请验证它旁边的复选标记的问题。它将帮助未来的读者找到解决方案。完成!实际上这里还有一个问题:如果我在循环中写入对象(PSObject)并将它们传输到下一个cmdlet,例如Get CustomPSObject | Export csv a.csv,powershell是否会获取所有对象,然后传递到下一个cmdlet并运行一次Export csv,还是每次writeObject写入对象时都会执行Export csv,?Get CustomPSObject最终通过WriteObject写入管道($PSObject列表);你建议怎么办?首先。我将更新该问题,以包括cmdlet是二进制cmdlet。第二,看更新的答案你是对的,循环中的writeobject起作用了!谢谢伟大:-如果你认为这是正确的答案,请验证它旁边的复选标记的问题。它将帮助未来的读者找到解决方案。完成!实际上这里还有一个问题:如果我在循环中写入对象(PSObject)并将它们传输到下一个cmdlet,例如Get CustomPSObject | Export csv a.csv,powershell是否会获取所有对象,然后传递到下一个cmdlet并运行一次Export csv,还是每次writeObject写入对象时都会执行Export csv,?嗯,Get CustomPSObject | gm返回列表对象的所有成员和属性是正确的,这些属性正是导出到csv(容量\计数等)的内容,但选择对象列1,列2只包含参数键但不包含值的列表对象,例如:Get CustomPSObject | Select object column1,第2列给出:ObjectId:(空白)Name:(空白)。我不知道选择对象也不获取值