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-ListFormat-TableFormat-Wide cmdlet 在 PowerShell 中是特殊的,因为它们旨在使用管道,并将其转换为在控制台中显示。所以,你不能从FLFTFWExport-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 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 PowerShell 中调用动态变量

System.Array 到 List 的转换

如何将 System::^array 从 C# 函数转换为 C++ 中的等效数据类型

System.Array.CopyTo() 和 System.Array.Clone() 之间的区别

System.Array.IndexOf 分配内存

System.Array' 不包含 'Count' 的定义