我正在寻找一个可以提供与 Linux Top 应用程序类似功能的 PowerShell cmdlet。它可以按给定的时间间隔刷新并显示带有 CPU % util 的进程列表。
我见过循环列出 CPU 百分比利用率的脚本,但是像 top 这样的脚本会更方便,因为我们已经设置了 SSH/Powershell 访问权限进行管理(我仍然更喜欢 putty shell!)
答案1
这是一个简单的单行代码,它也会将标签保持在顶部:
While(1) {ps | sort -des cpu | select -f 15 | ft -a; sleep 1; cls}
这是有效的,因为不使用任何参数来格式化表格只会绘制默认表格。autosize
用于自动调整列宽,以便所有数据都能适合屏幕。
缩短命令的细目:
select -f
: 快捷方式-first
ft
: 快捷方式Format-Table
-a
: 快捷方式-autosize
sleep
:默认使用秒
答案2
与其他解决方案类似,但使用Get-Counter
而不是Get-Process
:
While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls; $p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}
示例输出:
Path InstanceName CookedValue
---- ------------ -----------
\\server_name\process(_total)\% processor time _total 4806.03969127454
\\server_name\process(idle)\% processor time idle 1103.7573538257
\\server_name\process(program2)\% processor time program 749.692930701698
\\server_name\process(program5)\% processor time program 563.424255927765
\\server_name\process(program1)\% processor time program 535.714866291973
\\server_name\process(program6)\% processor time program 455.665518455242
\\server_name\process(program3)\% processor time program 426.416718284128
\\server_name\process(program)\% processor time program 395.628507577693
\\server_name\process(program4)\% processor time program 335.591496700144
\\server_name\process(microsoftedgecp2)\% processor time microsoftedgecp 129.310484967028
\\server_name\process(system)\% processor time system 80.0493478367316
\\server_name\process(chrome8)\% processor time chrome 1.53941053532176
我发现这里的大多数其他解决方案都使用Get-Process
报告自进程开始以来的总 CPU 时间,但这对我的服务器没有用,因为服务器全天候运行,而顶级结果总是需要svchost
数system
百万秒的时间。
- 真实
top
或任务管理器等效项将提供最近在某个固定时间内记录的 CPU 使用率快照,并Get-Counter
提供该快照。我认为这个替代方案值得贡献,因为这个问题仍然是 Google 上关于powershell top
。
基于示例 13Get-Counter
文档,命令的细分:
While(1) {
:创建循环get-counter '\Process(*)\% Processor Time'
:选择 CPU % 数据,这需要很长时间才能返回,因此无需sleep
cls
:清除新表sort -des CookedValue
CookedValue
:按[我们感兴趣的领域]最大排序select -f 15
:显示前 15 个ft -a
:以格式化表格形式显示
答案3
我对单个 cmdlet 形式一无所知,但就像您说的那样,脚本很容易编写以模拟顶部。
while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
答案4
每次更新时都在顶部提供漂亮的标题,而无需清除整个控制台:
$saveY = [console]::CursorTop
$saveX = [console]::CursorLeft
while ($true) {
Get-Process | Sort -Descending CPU | Select -First 30;
Sleep -Seconds 2;
[console]::setcursorposition($saveX,$saveY+3)
}