public/Get-ResourceHogs.ps1

function Get-ResourceHogs {
    <#
    .SYNOPSIS
        Show Windows processes using the most resources
    .DESCRIPTION
        Show Windows processes using the most resources by selected properties/metrics
    .PARAMETER Metric
        The process property to sort by. Default is CPU
    .PARAMETER Top
        Limit the output to the first [Top] items, sorted in descending order (most to least)
    .PARAMETER ShowPath
        Include process Path property in output.
    .EXAMPLE
        Get-ResourceHog
    .EXAMPLE
        Get-ResourceHog -Metric WorkingSet
    .EXAMPLE
        Get-ResourceHog -Metric HandleCount -Top 5 ShowPath
    .LINK
        https://github.com/Skatterbrainz/helium/blob/master/docs/Get-ResourceHogs.md
    #>

    param (
        [parameter()]
            [string]
            [ValidateSet('CPU','WorkingSet','MaxWorkingSet','HandleCount','VirtualMemorySize','PagedMemorySize64','PagedSystemMemorySize','PeakVirtualMemorySize')]
            $Metric = 'CPU',
        [parameter()][int][ValidateRange(0,100)]$Top = 10,
        [parameter()][switch]$ShowPath
    )
    try {
        if ($PSVersionTable.Platform -eq 'Unix') { throw "No supported on Linux systems" }
        $outprops = @('ProcessName','Id',$Metric)
        if ($ShowPath) { $outprops += 'Path' }
        $outparams = @{ First = $Top; Property = $outprops }
        Get-Process | Group-Object ProcessName |
            ForEach-Object { $_.Group | Sort-Object $Metric -Descending | Select-Object -First 1 } |
                Sort-Object $Metric -Descending | Select-Object @outparams
    } catch {
        Write-Error $_.Exception.Message
    }
}