有一个只影响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中显示的以下内容
使用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)
知道如何做到这一点?
答案 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-CLIMXL
和ConvertTo-JSON | Set-Content
。
答案 2 :(得分:0)
只需在Export-CLIXML中更改Export-CLIMXL(显而易见,但需要更正)。