Ran*_*ger 3 powershell export-to-csv
这段代码:
$concerningMachines = @()
foreach($aMachine in $machineRecords.GetEnumerator())
{
if($aMachine.Value.ReviewScore -gt $averageAboveAverage)
{
$machine = New-Object -TypeName PSObject
$machine | Add-Member -MemberType NoteProperty -Name MachineName -Value $aMachine.Key
$machine | Add-Member -MemberType NoteProperty -Name ManagedBy -Value $aMachine.Value.ManagedBy
$machine | Add-Member -MemberType NoteProperty -Name LastLogin -Value $aMachine.Value.LastLogin
$machine | Add-Member -MemberType NoteProperty -Name ReviewScore -Value ($aMachine.Value.ReviewScore / $averageAboveAverage * 100)
$concerningMachines += $machine
}
}
Export-Csv -InputObject $concerningMachines -Path C:\DG\ConcerningMachines.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)
生成这个 .csv 文件:
“计数”、“长度”、“长长度”、“等级”、“SyncRoot”、“IsReadOnly”、“IsFixedSize”、“IsSynchronized”、“43”、“43”、“43”、“1”、“System.对象[]","假","真","假"
...这是数组的属性,而不是数组的成员。谷歌搜索我发现的唯一建议似乎要么实现了一个完全忽略Export-Csv的解决方案,要么处理字符串(虽然字符集合,但解决方案不适用)或似乎正在做我已经在做的事情,但是生成一个有效的 CSV 文件(如果需要,我可以找到一些链接,但它们是论坛对话,而不是明确的指南)。
如何将 PSObject 数组正确导出为 CSV 文件,并避免上述意外输出?
使用管道提供输入:
$concerningMachines| Export-Csv -Path C:\DG\ConcerningMachines.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)
当您将相同的输入传递给 时-InputObject,确实是整个数组被解释为要导出的单个对象。
此行为会影响所有cmdlet,并且显然是按设计的:
InputObject 是要处理的单个对象。在管道中使用时,InputObject 绑定到管道中的每个元素并一次处理一个。如果 InputObject 作为一个集合进行处理,那么管道中的每个项目也将作为一个集合进行处理。
在某些 cmdlet 中,此行为很有用:Get-Member例如,允许您用于-InputObject检查整个集合的类型,而管道输入检查集合的每个元素。
既不属于Export-Csv也不ConvertTo-Csv属于该类别,即使Get-Help ExportCsv目前误导性地描述了该-InputObject参数(强调添加):
指定对象小号导出为CSV字符串。输入一个包含对象s的变量或键入一个命令或表达式来获取对象s。您还可以通过管道将对象导出到 Export-CSV。
在务实的结论是始终使用管道(除非你真正想传递一个集合作为一个整体)。
| 归档时间: |
|
| 查看次数: |
2688 次 |
| 最近记录: |