Dargslan.WinProcessMgr.psm1

<#
.SYNOPSIS
    Windows process management toolkit — process monitoring, resource analysis, hung process detection, and process tree visualization

.DESCRIPTION
    Part of the Dargslan Windows Admin Toolkit collection.
    More tools and resources at https://dargslan.com
    Free Cheat Sheets: https://dargslan.com/cheat-sheets
    Windows & DevOps Books: https://dargslan.com/books

.LINK
    https://dargslan.com

.LINK
    https://github.com/Dargslan/powershell-admin-scripts
#>


function Get-ProcessAnalysis {
    <#
    .SYNOPSIS
        Analyze running processes with resource usage
    .DESCRIPTION
        Provides detailed process analysis including CPU time, memory usage, handle counts, and detects hung processes.
        Part of Dargslan.WinProcessMgr — https://dargslan.com
    #>

    [CmdletBinding()] param([int]$Top = 15, [switch]$Json)

    $procs = Get-Process
    $report = [ordered]@{
        Summary = [PSCustomObject]@{ Total = $procs.Count; TotalMemGB = [math]::Round(($procs | Measure-Object WorkingSet64 -Sum).Sum/1GB,1); TotalHandles = ($procs | Measure-Object Handles -Sum).Sum }
        TopCPU = $procs | Sort-Object CPU -Descending | Select-Object -First $Top Name, Id, @{N="CPU_Sec";E={[math]::Round($_.CPU,1)}}, @{N="MemMB";E={[math]::Round($_.WorkingSet64/1MB,1)}}, Handles, @{N="Threads";E={$_.Threads.Count}}
        TopMemory = $procs | Sort-Object WorkingSet64 -Descending | Select-Object -First $Top Name, Id, @{N="MemMB";E={[math]::Round($_.WorkingSet64/1MB,1)}}, @{N="PeakMB";E={[math]::Round($_.PeakWorkingSet64/1MB,1)}}
        NotResponding = $procs | Where-Object { -not $_.Responding } | Select-Object Name, Id, @{N="MemMB";E={[math]::Round($_.WorkingSet64/1MB,1)}}
    }
    if ($Json) { return $report | ConvertTo-Json -Depth 3 }
    Write-Host "`n [Process Analysis]" -ForegroundColor Cyan
    Write-Host " Total: $($report.Summary.Total) processes | $($report.Summary.TotalMemGB) GB total memory"
    Write-Host "`n Top CPU:" -ForegroundColor Yellow; $report.TopCPU | Format-Table -AutoSize
    if ($report.NotResponding) { Write-Host " Not Responding:" -ForegroundColor Red; $report.NotResponding | Format-Table -AutoSize }
    return $report
}

Export-ModuleMember -Function *