提问人:Kenny 提问时间:2/25/2017 最后编辑:Kenny 更新时间:11/20/2020 访问量:39200
Powershell 数组到 export-csv 显示 System.Object[]
Powershell Array to export-csv shows System.Object[]
问:
有一个简单的问题,只影响 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 中
使用 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)
知道怎么做吗?
答:
如果希望该表出现在 csv 文件中,则需要按此格式设置字符串属性的格式。使用 Out-String
就可以做到这一点Top5
将对象作为一系列字符串发送到主机。
因此,一个简单的更改应该会让您得到您想要的东西。
$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
请记住,您可以使用其他方法导出此数据,同时保持对象的吸引力。实际上取决于数据配方,但请记住还有其他 cmdlet,例如 和 .Export-CLIMXL
ConvertTo-JSON | Set-Content
评论
用于将流程对象转换为字符串,然后再通过管道将其传输到:Select-Object
Export-Csv
$OutArray |Select-Object Server,@{Expression={$_.Top5.Name -join ';'}} |Export-Csv test.csv
评论
-Join
out-string
trim()