Powershell 数组到 export-csv 显示 System.Object[]

Powershell Array to export-csv shows System.Object[]

提问人:Kenny 提问时间:2/25/2017 最后编辑:Kenny 更新时间:11/20/2020 访问量:39200

问:

有一个简单的问题,只影响 export-csv 输出、out-gridview 和控制台的结果就可以了。希望通过一组服务器上的“句柄”捕获前 5 个进程。

代码如下:

$Servers = "Server1", "Server2", "Server3"
$OutArray = @()
ForEach ($Item in $Servers)

$Top5 = Get-Process -Computer $Item | Sort Handles -descending |Select -First 5

     $OutArray += New-Object PSObject -property @ {
     Server = $Item
     Top5 = $Top5

    } #OutArray

} #ForEach

$OutArray | Export-csv Test.csv

其结果通过控制台看起来很好,如下所示

 Server   Top5                                                                                                                                                                                                         
 ------   ----                                                                                                                                                                                                         
 SERVER1 {@{ProcessName=svchost.exe; PercentCpuLoad=13.79}, @{ProcessName=services.exe; PercentCpuLoad=11.4}, @{ProcessName=WmiPrvSE.exe; PercentCpuLoad=10.03}, @{ProcessName=irfilcol.exe; PercentCpuLoad=9.79}...} 

...但是,在 csv 中,它们显示如下:

Server  Top5
Server1 System.Object[]
Server2 System.Object[]
Server3 System.Object[]

我认为这是因为 $Top 5 变量是一个具有多个属性(每个属性 5 个)的变量。如何更正代码以使 export-csv 显示实际值?

任何帮助表示赞赏!

我希望 csv 结果如下所示,显示在 GRIDVIEW 中

enter image description here

使用 BenH 的建议来查看 Powershell 传奇人物 Boe Prox 的帖子,我现在有以下工作:

 $Top5 = Get-Process -Computer $Item | Sort Handles -descending |Select -expand Handles | |Select -First 5 
 $new = [pscustomobject]@{ Top5 = (@($Top5) -join ',')
 }

现在差不多可以工作了:

我想添加更多的格式,其中 Top5Processes 现在在(括号)中使用了实际的 CPU 百分比,我有以下输出

 Top2Proc                            Top2CPU                  
services.exe,BESClient.exe           32.76,16.6

但是,如果我能将上述两个值合二为一,那么输出方面会更好,所以它看起来像这样:

 Top2Proc
 Services(32.76), BesClient.exe(16.6)

知道怎么做吗?

PowerShell

评论

0赞 Matt 2/25/2017
PowerShell 正在尽最大努力处理这些数据。它不知道如何将该对象表示为该“单元格”中的字符串。你需要告诉它该怎么做。 目前,您没有向我们展示您对输出的期望。CSV 是字符串分隔数据的集合。如果要保留该数据结构,则需要使用JSON或XML...等。
0赞 Kenny 2/25/2017
帖子已更新,包括我通过 out-gridview 看到的内容的屏幕截图,这就是我希望进入 CSV 的内容
0赞 BenH 2/25/2017
Boe Prox 的这篇博文将有助于解释这个问题。注意:底部的脚本中心链接坏了,脚本可以在他的GitHub上找到
0赞 Ranadip Dutta 2/25/2017
您应该使用 或-Joinout-stringtrim()
0赞 Kenny 2/25/2017
谢谢,我会再次查看 Boe Prox 的帖子,我之前已经找到了它,但没有完成他的所有建议

答:

1赞 Matt 2/25/2017 #1

如果希望该表出现在 csv 文件中,则需要按此格式设置字符串属性的格式。使用 Out-String 就可以做到这一点Top5

将对象作为一系列字符串发送到主机。

因此,一个简单的更改应该会让您得到您想要的东西。

$Top5 = Get-Process -Computer $Item |
    Sort Handles -descending |
    Select -First 5 |
    Out-String

当不使用等宽字体显示时,它看起来会有点丑陋,就像您在 中看到的那样。还可以考虑使用 来删除 .Out-GridView.Trim()$top5

还有其他方法可以解决这个问题。您可以根据需要将上述内容与/结合使用。一般来说,如果您希望将输出保存为在主机中显示的内容,则需要进行测试。Format-TableFormat-ListOut-String


我会尝试为每个进程添加一行,第一列是计算机名称。这样,您将拥有更好的结构化输出,可以根据需要进行排序或查询。

ComputerName ProcessName Handles
------------ ----------- -------
Computer1    avp           54639
Computer1    OUTLOOK        7708
Computer1    RDTabs         6108
Computer1    svchost        3160
Computer1    chrome         2530

请记住,您可以使用其他方法导出此数据,同时保持对象的吸引力。实际上取决于数据配方,但请记住还有其他 cmdlet,例如 和 .Export-CLIMXLConvertTo-JSON | Set-Content

评论

0赞 Kenny 2/25/2017
谢谢你提供这个信息。我尝试了 out-string,但结果只是空白的,奇怪的。
0赞 Matt 2/25/2017
打开 Excel 时结果是否为空?数据在那里,但你可能在那个折叠的单元格中看不到它。“表”前后都有空格,可能会隐藏您的结果。文本文件是否包含数据?
0赞 Kenny 2/25/2017
啊!是的,它就在那里,只需向下滚动即可!好的,现在有了这个
2赞 Mathias R. Jessen 2/25/2017 #2

用于将流程对象转换为字符串,然后再通过管道将其传输到:Select-ObjectExport-Csv

$OutArray |Select-Object Server,@{Expression={$_.Top5.Name -join ';'}} |Export-Csv test.csv

评论

0赞 Kenny 2/27/2017
谢谢,Mathais,我会试试的
0赞 Matt 3/1/2017
仅当需要单个属性时,这才有效。OP 似乎在要求一切