powershell - 在 PowerShell 中加入数组,类似于连接 DataFrame 列
问题描述
有没有一种方法可以在 PowerShell 中加入数组,类似于将 Python Pandas 中的 DataFrame 列与concat
或在 R 中连接cbind
而不是遍历每个项目?
下面是一个可重现的示例,它将四个数组绑定在一起作为 PowerShell 对象中的四列。我将如何摆脱for
循环并获得相同的结果?
$LogicalProcessors = (Get-WmiObject –class Win32_processor
-Property NumberOfLogicalProcessors).NumberOfLogicalProcessors;
function myTop([String]$SortCol='CPU', [Int32]$top=30) {
$NameArray = get-counter '\Process(*)\ID Process' -EA SilentlyContinue |
Select -Expand CounterSamples | Select InstanceName, CookedValue
$CpuArray = get-counter '\Process(*)\% Processor Time' -EA SilentlyContinue |
Select -Expand CounterSamples | Select CookedValue
$MemArray = get-counter '\Process(*)\Working Set - Private' -EA SilentlyContinue |
Select -Expand CounterSamples | Select CookedValue
$TopTable = For ($i=0; $i -lt $NameArray.Length; $i++) {
if ($NameArray[$i].InstanceName -eq '_total') {continue}
if ($NameArray[$i].InstanceName -eq 'memory compression') {continue}
if ($NameArray[$i].InstanceName -eq 'idle') {
$CPU = ($CpuArray[$i].CookedValue) / $LogicalProcessors;
} else {
$CPU = $CpuArray[$i].CookedValue;
}
[PSCustomObject]@{
Name = $NameArray[$i].InstanceName;
ID = $NameArray[$i].CookedValue;
CPU = $CPU;
Memory = $MemArray[$i].CookedValue;
}
}
$TopTable | sort -des $SortCol | select -f $top |`
select Name, ID,`
@{Name='CPU'; Expression = {("{0:N1}%" -f $_.CPU) } },`
@{Name='Memory'; Expression = {("{0:N0} K" -f ($_.Memory /1kb) )} }
}
myTop -SortCol Memory -top 30 | ft -a
解决方案
我认为 PowerShell 没有提供组合列的方法。在这种情况下,它可以对应Group-Object
。
function myTop([string]$SortCol = "CPU", [int]$Top = 30)
{
$LogicalProcessors = (Get-WmiObject Win32_processor NumberOfLogicalProcessors).NumberOfLogicalProcessors
Get-Counter '\Process(*)\ID Process','\Process(*)\% Processor Time','\Process(*)\Working Set - Private' -ea SilentlyContinue |
foreach CounterSamples |
where InstanceName -notin "_total","memory compression" |
group { $_.Path.Split("\\")[3] } |
foreach {
[pscustomobject]@{
Name = $_.Group[0].InstanceName
ID = $_.Group[0].CookedValue
CPU = if($_.Name -eq "idle") { $_.Group[1].CookedValue / $LogicalProcessors } else { $_.Group[1].CookedValue }
Memory = $_.Group[2].CookedValue / 1KB
}
} |
sort -des $SortCol |
select -f $Top @(
"Name","ID"
@{ n = "CPU"; e = { ("{0:N1}%" -f $_.CPU) } }
@{ n = "Memory"; e = { ("{0:N0} K" -f $_.Memory) } }
)
}
myTop -SortCol Memory -top 10 | ft -a
推荐阅读
- python - 为什么与使用 np.int16 的相同操作相比,使用 dtype np.int64 的操作要慢得多?
- android - 带有 LiveData 的嵌套观察者(观察观察者)
- php - 如何使我需要的包全局化,而不会在 composer-php 中发生冲突?
- python - KV 中的动态图像文件 - 最简单的方法?
- html - 将颜色渐变添加到边框(直立三角形)?
- java - 如何将选定的项目保存在级联组合框上,而不是将值保存到 jsp 中的数据库中
- java - 授予权限后刷新谷歌地图(Android Java)
- java - 为什么它的类型是 Nothing?
- json - 在命令行中使用 osmtogeojson 编码问题
- react-native - 按 id 分组通知并像 Whatsapp 一样显示