列出CPU时间最多的进程。(Powershell)

时间:2017-05-31 21:42:36

标签: windows powershell

如何确保不枚举系统服务?我想同时拥有系统进程以及所有其他系统服务,例如svchost不在列表中。

Get-Process | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,Id -hidetableheader

3 个答案:

答案 0 :(得分:2)

我喜欢另一个答案,但这是另一种不需要管理员权限的可能性,虽然它可能不是万无一失的:

大多数系统服务都在名为svchost的流程中运行,因此您只需使用Where-Object排除这些流程:

Get-Process | Where-Object {$_.name -ne 'svchost'} | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,Id -hidetableheader

答案 1 :(得分:1)

您可能需要处于管理员模式。

Get-Process -IncludeUserName | where {$_.UserName -notlike "NT AUTHORITY\SYSTEM"} | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName,Id -hidetableheader

这是你要求的吗?

答案 2 :(得分:0)

我喜欢其他答案的简单性,但您可以使用WMI类Win32_Process来检索流程列表和方法.GetOwner()以获取流程所有者。

由于系统流程未显示所有者,我们可以轻松过滤执行拥有所有者的流程,显示大多数非系统流程(我说最多,因为svchost显示我不时地在我的账户下。)

# Get all processes
$processes = Get-WMIObject -Class Win32_Process

foreach($process in $processes)
{
    try
    {
        $processOwner = $process.GetOwner()
    }
    catch
    {
        continue
    }

    if ($processOwner.User -ne $null)
    {
        $processData = Get-Process -Id $process.ProcessId

        $process | Select-Object -Property @{n='CPU';e={$processData.CPU}},Name,ID | Sort-Object -Property CPU
    }
}