Powershell System.Array 到 CSV 文件
Posted
技术标签:
【中文标题】Powershell System.Array 到 CSV 文件【英文标题】:Powershell System.Array to CSV file 【发布时间】:2014-08-10 06:26:42 【问题描述】:我在让 Export-Csv 工作时遇到了一些困难。我正在创建一个这样的数组...
[pscustomobject] @
Servername = $_.Servername
Name = $_.Servername
Blk = ""
Blk2 = ""
Method = "RDP"
Port = "3389"
我遇到的问题是,当我尝试将其导出到 CSV 时,我得到的垃圾看起来像这样......
"9e210fe47d09416682b841769c78b8a3",,,,,
我已经阅读了大量解决此问题的文章,但我只是不明白如何正确获取数据。
【问题讨论】:
你能把数组显示到屏幕上并读取好吗? 是的。当我将它通过管道传输到格式表时看起来很棒。 【参考方案1】:为了测试,我构建了一个带有服务器名称的 CSV 文件,并将其读入,以下内容在 PS4 中有效:
$serverList = import-csv "datafile.csv"
$AllObjects = @()
$serverList | ForEach-Object
$AllObjects += [pscustomobject]@
Servername = $_.Servername
Name = $_.Servername
Blk = ""
Blk2 = ""
Method = "RDP"
Port = "3389"
$AllObjects | Export-Csv -Path "outfile.csv" -NoTypeInformation
【讨论】:
那么是什么让这个工作?只是在循环之前声明数组? 很可能,尽管如果循环仅输出对象,并且您将循环通过管道传输到 export-csv,我也不明白为什么它不起作用。 在他的示例中,他将对象通过管道传输到 Export-Csv。你描述的问题,@HunterEidson,发生在你从 Format-Table/Format-List 管道到 Export 命令时,这不起作用。 我遇到了一个稍微不同的问题,它输出的是属性类型而不是值。将[pscustomobject]
添加到@...
对象为我解决了这个问题。【参考方案2】:
当您尝试从任何 Format-*
命令输出时会发生这种情况。
Format-List
、Format-Table
和 Format-Wide
cmdlet 在 PowerShell 中是特殊的,因为它们旨在使用管道,并将其转换为在控制台中显示。所以,你不能从FL
、FT
或FW
到Export-csv
。正如 Don Jones 所说的“右侧格式”。
不相信我?请注意,当我运行Get-Process
时,将其通过Format-Table
发送,然后转换为Csv。
gps | ft | ConvertTo-Csv
#TYPE Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
"ClassId2e4f51ef21dd47e99d3c952918aff9cd","pageHeaderEntry","pageFooterEntry","autosizeInfo","shapeInfo","groupingEntry"
"033ecb2bc07a4d43b5ef94ed5a35d280",,,,"Microsoft.PowerShell.Commands.Internal.Format.TableHeaderInfo",
"9e210fe47d09416682b841769c78b8a3",,,,,
"27c87ef9bbda4f709f6b4002fa4af63c",,,,,
"27c87ef9bbda4f709f6b4002fa4af63c",,,,,
"27c87ef9bbda4f709f6b4002fa4af63c",,,,,
甚至是同一个字符串!为什么我们会得到这个字符串?我真希望我知道,但我认为这与 Format-*
命令将对象转换为文本指令以在控制台中显示的方式有关。
如果您真的很喜欢 Format-Table
的外观,请将其发送到 Out-File
,这是重定向 Format-*
命令输出的唯一方法。
另一条消息是使用Tee-Object
将管道的副本转储到变量中,然后将其发送到 Export。
Get-Process | Tee-Object -Variable ExportMe | Format-Table
$exportMe | export-Csv .\Export.csv
我称之为“吃蛋糕,也吃它”。
【讨论】:
当您使用 |ft 参数时,您删除的“Powershell 对象”是那些正在格式化以打印在屏幕上的对象。因此,如果您要对任何 powershell 命令的结果进行进一步操作,请不要在管道中使用 FT 或 Format-Table。【参考方案3】:使用Select-Object
防止错误的 CSV 导出。
例子:
Get-Services | Select-Object * | export-csv -Path C:\log.csv
【讨论】:
以上是关于Powershell System.Array 到 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型