导出-csv的Powershell数组显示System.Object []

时间:2017-02-24 17:16:47

标签: powershell

有一个只影响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[]

我认为这是因为$ Top5变量是一个服务器具有多个属性(每个属性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)

知道如何做到这一点?

3 个答案:

答案 0 :(得分:3)

使用Select-Object将流程对象转换为字符串,然后再将其汇总到Export-Csv

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

答案 1 :(得分:1)

如果您希望该表出现在您的csv文件中,那么您需要格式化字符串Top5属性。使用Out-String即可完成

  

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

所以一个简单的改变应该能得到你想要的东西。

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

如果没有像Out-GridView中看到的单空格字体显示,它看起来会有点难看。另请考虑使用.Trim()删除$top5上的前导和尾随空格。

还有其他方法可以解决这个问题。您可以根据需要将上述内容与Format-Table / Format-List结合使用。通常,如果您希望保存输出,因为它在主机Out-String中显示是要测试的内容。

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

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

请记住,您可以使用其他方法导出此数据,同时保持对象生效。确实取决于数据recipeint,但记住还有其他cmdlet,如Export-CLIMXLConvertTo-JSON | Set-Content

答案 2 :(得分:0)

只需在Export-CLIXML中更改Export-CLIMXL(显而易见,但需要更正)。