Public/Get-ProcessAnalysis.ps1

function Get-ProcessAnalysis {
    [CmdletBinding()]
    param (
        [string]$OutputPath = ".\ProcessAnalysis.json",
        [int]$TopProcessCount = 15
    )

    Write-Host "Analyzing running processes..." -ForegroundColor Cyan

    # Get logical processor count for CPU percentage calculation
    $logicalProcessors = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors

    # Get all running processes with detailed information
    $processes = Get-Process | Select-Object Id, ProcessName,
    @{Name = 'CPU'; Expression = { $_.CPU } },
    @{Name = 'CPUPercent'; Expression = {
            if ($logicalProcessors) {
                [math]::Round(($_.CPU / $logicalProcessors), 2)
            } else { 0 }
        }
    },
    @{Name = 'Memory(MB)'; Expression = { [math]::Round(($_.WorkingSet / 1MB), 2) } },
    @{Name = 'PrivateMemory(MB)'; Expression = { [math]::Round(($_.PrivateMemorySize / 1MB), 2) } },
    @{Name = 'Threads'; Expression = { $_.Threads.Count } },
    @{Name = 'Handles'; Expression = { $_.HandleCount } },
    StartTime,
    @{Name = 'RunTime'; Expression = {
            if ($_.StartTime) {
                $runTime = (Get-Date) - $_.StartTime
                "$($runTime.Days)d $($runTime.Hours)h $($runTime.Minutes)m"
            } else { "N/A" }
        }
    }

    # Get top CPU consumers
    $topCPUConsumers = $processes | Sort-Object CPU -Descending | Select-Object -First $TopProcessCount

    # Get top memory consumers
    $topMemoryConsumers = $processes | Sort-Object "Memory(MB)" -Descending | Select-Object -First $TopProcessCount

    # Identify resource-intensive processes
    $highCpuProcesses = $processes | Where-Object { $_.CPU -gt 50 }
    $highMemoryProcesses = $processes | Where-Object { $_."Memory(MB)" -gt 200 }

    # Create process groups by category
    $systemProcesses = $processes | Where-Object { $_.ProcessName -match "svchost|System|Registry|csrss|wininit|services|lsass|winlogon" }
    $browserProcesses = $processes | Where-Object { $_.ProcessName -match "msedge|chrome|firefox|opera|iexplore" }
    $developerTools = $processes | Where-Object { $_.ProcessName -match "pwsh|rstudio|code|WindowsTerminal|conhost|rsession" }

    $report = [PSCustomObject]@{
        AllProcesses        = $processes
        TopCPUConsumers     = $topCPUConsumers
        TopMemoryConsumers  = $topMemoryConsumers
        HighCPUProcesses    = $highCpuProcesses
        HighMemoryProcesses = $highMemoryProcesses
        SystemProcesses     = $systemProcesses
        BrowserProcesses    = $browserProcesses
        DeveloperTools      = $developerTools
        Timestamp           = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    }

    # Convert the report to JSON format
    $jsonReport = $report | ConvertTo-Json -Depth 5

    # Output the JSON report to a file
    $jsonReport | Out-File -FilePath $OutputPath

    Write-Host "Process analysis saved to $OutputPath" -ForegroundColor Green

    return $report
}