Answers:
我对单个cmdlet形式一无所知,但是就像您说的那样,脚本易于编写以模仿top。
while (1) { ps | sort -desc cpu | select -first 30; sleep -seconds 2; cls }
与其他解决方案类似的解决方案,但使用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(program#2)\% processor time program 749.692930701698
\\server_name\process(program#5)\% processor time program 563.424255927765
\\server_name\process(program#1)\% processor time program 535.714866291973
\\server_name\process(program#6)\% processor time program 455.665518455242
\\server_name\process(program#3)\% processor time program 426.416718284128
\\server_name\process(program)\% processor time program 395.628507577693
\\server_name\process(program#4)\% processor time program 335.591496700144
\\server_name\process(microsoftedgecp#2)\% processor time microsoftedgecp 129.310484967028
\\server_name\process(system)\% processor time system 80.0493478367316
\\server_name\process(chrome#8)\% processor time chrome 1.53941053532176
我发现这里使用get-process报告的大多数其他解决方案都报告了自该进程开始以来的总CPU时间。这对我的服务器保持24/7的速度无济于事,在该服务器上,最高的结果始终是公正的,svchost
并且运行system
时间为数百万秒。True top
或Task Manager等效项将提供最近在某个固定时间内记录的CPU使用情况的快照,Get-Counter会提供该快照。由于该超级用户的帖子仍然是“ powershell top”在Google上排名最高的结果,因此我认为这种选择值得一提。
我的命令基于Get-Counter文档中的示例13:https : //docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Diagnostics/Get-Counter。
这是单线的细分,因此您可以更轻松地根据需要进行修改:
While(1) {
只是循环get-counter '\Process(*)\% Processor Time'
选择CPU%数据。此命令似乎需要大量时间才能返回,因此无需sleep
cls
清除新表sort -des CookedValue
CookedValue是我们最感兴趣的领域,可以将最大的领域放在首位select -f 15
显示前15个ft -a
显示在格式化表格中Get-Counter
为您提供“瞬时” CPU,而不是从开始的累积CPU时间ps
。更好的格式: Get-Counter '\Process(*)\% Processor Time' | Select-Object -ExpandProperty countersamples| Select-Object -Property instancename, cookedvalue| ? {$_.instanceName -notmatch "^(idle|_total|system)$"} | Sort-Object -Property cookedvalue -Descending| Select-Object -First 25| ft InstanceName,@{L='CPU';E={($_.Cookedvalue/100/$env:NUMBER_OF_PROCESSORS).toString('P')}} -AutoSize
我不知道提供该功能的PowerShell cmdlet。有一个免费软件的外部命令可以满足您的需求。查看Sysinternals套件中Mark Russinovich的pslist。Pslist在可配置视图中提供了正在执行的进程的列表。“ pslist -s”提供所需的连续更新,默认刷新速率为每秒一次。
我更喜欢使用Mark的GUI Process Explorer,但是pslist对于控制台会话很方便。
Sysinternals主页在这里:http : //technet.microsoft.com/zh-cn/sysinternals
丹尼斯
另外,我想指出的是,如果您想要Windows的类似Linux的环境,则可以使用Cygwin。它将Linux环境带到Windows。您几乎可以使用所有命令。不确定这对您有多有用。
这也可以解决问题:
function htopish {
Param (
[Parameter(Position=1)] [Alias("l")]
[int]$TotalList=24,
[Parameter(Position=2)] [Alias("r")]
[int]$Invertal=1
)
Begin {}
Process {
While ($true) {
$CounterSamples = Get-Counter '\Process(*)\ID Process','\Process(*)\% Processor Time','\Process(*)\Working Set' | Select-Object -Expand CounterSamples
Clear-Host
$CounterSamples | Group-Object { Split-Path $_.Path } | Where-Object {$_.Group[1].InstanceName -notmatch "^Idle|_Total|System$"} | Sort-Object -Property {$_.Group[1].CookedValue} -Descending | Select-Object -First $TotalList | Format-Table @{Name="ProcessId";Expression={$_.Group[0].CookedValue}},@{Name="ProcessorUsage";Expression={[System.Math]::Round($_.Group[1].CookedValue/100/$env:NUMBER_OF_PROCESSORS,4)}},@{Name="ProcessName";Expression={$_.Group[1].InstanceName}},@{Name="WorkingSet";Expression={[System.Math]::Round($_.Group[2].CookedValue/1MB,4)}}
Sleep -Seconds $Invertal
}
}
End {}
}
该函数依赖于Get-Counter
样本,并将输出ProcessId,ProcessName,ProcessorUsage
和WorkingSet
。此计数器示例可以进一步增强User
,CommandLine
以在输出中包括,但是我还没有找到一种执行该方法的有效方法。
马克(Mark)的评论应该得到更多建议,因为它几乎完全是问题所在,并且行之有效:
每次更新都在顶部提供漂亮的标题,而无需清除整个控制台。
$saveY = [console]::CursorTop
$saveX = [console]::CursorLeft
while ($true) {
Get-Process | Sort -Descending CPU | Select -First 30;
Sleep -Seconds 2;
[console]::setcursorposition($saveX,$saveY+3)
}
(评论链接:https : //superuser.com/a/770455/989044)
您应该为此创建一个简单的模块,并将其托管在github上,或为其提供choco。我认为它首先应该是一个标准的模块,因为它在Google上被大量搜索,并且有各种各样的解决方法,但是它们都不是那么优雅并且接近linux top命令。
很抱歉这样发布它,但是由于这里的醒目规则,如果没有50业力左右,就无法发表评论或做笔记。
您可以为Windows尝试使用htop-alternative- NTop
类似于Windows的htop系统监视器,带有Vi-emulation。因为使用任务管理器还不够酷。
与Windows NT-op或NukeTop中的NTop相同。无论您喜欢什么(显然后者)。
命令行选项:
- -C使用单色配色方案。
- -h显示帮助信息。
- -p PID,PID ...仅显示给定的PID。
- -s COLUMN按此列排序。
- -u USERNAME仅显示属于该用户的进程。
- -v打印版本。
交互式命令:
- 向上和向下箭头PgUp和PgDown,j和k 滚动进程列表。
- CTRL +左箭头和右箭头 更改过程排序列。
- g 转到过程列表的顶部。
- G 转到过程列表的底部。
- 用空格 标记选定的进程。
- U 取消标记所有已标记进程。
- K 杀死所有标记的进程。
- 我 反转排序顺序。
- F 跟随过程:如果排序顺序导致当前选择的过程在列表中移动,请使选择栏跟随它。手动移动光标会自动禁用此功能。
- n 搜索下一个。
- N 搜索中的上一个。
Vi命令:
- :exec CMD 执行给定的Windows命令。
- :kill PID 杀死所有给定进程。
- :q,:quit 退出NTop。
- / PATTERN,:search PATTERN 进行搜索。
- :sort COLUMN 在给定列之后对过程列表进行排序。
- :tree 查看进程树。
预编译的二进制文件可以在这里下载
将以下内容保存mytop.ps1
在PATH
环境变量中的文件夹中的文件中。然后在任何PowerShell控制台中使用以下之一:
mytop
-在“内存”列中使用默认排序,并显示前30行。mytop CPU 50
-按“ CPU”列排序并显示前50行。While(1) {$p = myTop Memory 50; cls; $p}
-使它每秒刷新一次。mytop.ps1
内容:
##################################################
# Linux top equivalent in PowerShell
##################################################
if ($args[0] -eq $null) {
$SortCol = "Memory"
} else {
$SortCol = $args[0]
}
if ($args[1] -eq $null) {
$Top = 30
} else {
$Top = $args[1]
}
$LogicalProcessors = (Get-WmiObject -class Win32_processor `
-Property NumberOfLogicalProcessors).NumberOfLogicalProcessors;
function myTopFunc ([string]$SortCol = "Memory", [int]$Top = 30) {
## Check user level of PowerShell
if (
([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
)
{
$procTbl = get-process -IncludeUserName | select ID, Name, UserName, Description, MainWindowTitle
} else {
$procTbl = get-process | select ID, Name, Description, MainWindowTitle
}
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 {
$procIndex = [array]::indexof($procTbl.ID, [Int32]$_.Group[0].CookedValue)
[pscustomobject]@{
Name = $_.Group[0].InstanceName;
ID = $_.Group[0].CookedValue;
User = $procTbl.UserName[$procIndex]
CPU = if($_.Group[0].InstanceName -eq "idle") {
$_.Group[1].CookedValue / $LogicalProcessors
} else {
$_.Group[1].CookedValue
};
Memory = $_.Group[2].CookedValue / 1KB;
Description = $procTbl.Description[$procIndex];
Title = $procTbl.MainWindowTitle[$procIndex];
}
} |
sort -des $SortCol |
select -f $Top @(
"Name", "ID", "User",
@{ n = "CPU"; e = { ("{0:N1}%" -f $_.CPU) } },
@{ n = "Memory"; e = { ("{0:N0} K" -f $_.Memory) } },
"Description", "Title"
) | ft -a
}
myTopFunc -SortCol $SortCol -top $Top
输出示例:
Name ID User CPU Memory Description
---- -- ---- --- ------ -----------
sqlservr 7776 NT SERVICE\MSSQLSERVER 0.0% 19,001,488 K SQL Server Windows NT - 64 Bit
python 12872 NA\user1 0.0% 2,159,796 K Python
svchost 3328 NT AUTHORITY\SYSTEM 1.6% 1,022,080 K Host Process for Windows Services
onedrive 11872 NA\user1 0.0% 423,396 K Microsoft OneDrive
python 13764 NA\user1 0.0% 304,608 K Python
chrome 21188 NA\user1 0.0% 250,624 K Google Chrome
python 28144 NA\user2 0.0% 225,824 K Python
code 21384 NA\user1 0.0% 211,160 K Visual Studio Code
code 27412 NA\user2 0.0% 185,892 K Visual Studio Code
ssms 18288 NA\user1 29.5% 155,452 K SSMS
chrome 7536 NA\user1 0.0% 154,124 K Google Chrome
code 21652 NA\user1 0.0% 149,900 K Visual Studio Code
explorer 3204 NA\user1 0.0% 134,340 K Windows Explorer
python 11712 NA\user1 0.0% 130,624 K Python
chrome 21588 NA\user1 0.0% 107,448 K Google Chrome
code 10152 NA\user1 0.0% 100,880 K Visual Studio Code
code 20232 NA\user2 0.0% 99,124 K Visual Studio Code
python 22184 NA\user1 0.0% 94,800 K Python
code 14828 NA\user1 0.0% 84,872 K Visual Studio Code
searchui 13344 NA\user1 0.0% 78,260 K Search and Cortana application
com.docker.service 10644 NT AUTHORITY\SYSTEM 0.0% 77,332 K Docker.Service
额外信用:
其他要看的是:
https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-utilities
有一个命令行工具可以转储所有进程(当然还有进程监视器或进程资源管理器)。