Public/Get-TechCarePerformance.ps1

function Get-TechCarePerformance {
    <#
    .SYNOPSIS
        Revisa el impacto del arranque automatico y el plan de energia.
    .DESCRIPTION
        Enumera las entradas de arranque del registro y senala las que suelen
        pesar en el inicio, pero no desactiva ninguna: cual sobra depende del
        usuario, no del equipo, y desactivar el agente de sincronizacion de
        alguien es una averia, no una optimizacion.

        Lo unico que puede cambiar es el plan de energia, y solo si se indica
        -PowerPlan de forma explicita.
    .PARAMETER PowerPlan
        Plan de energia a activar. Sin este parametro no se cambia nada.
    .EXAMPLE
        Get-TechCarePerformance

        Solo revisa: lista el arranque y el plan activo.
    .EXAMPLE
        Get-TechCarePerformance -PowerPlan HighPerformance -WhatIf

        Muestra el cambio de plan que se haria, sin aplicarlo.
    .EXAMPLE
        Get-TechCarePerformance -PowerPlan Balanced -Confirm:$false

        Vuelve al plan Equilibrado sin preguntar.
    .OUTPUTS
        PSCustomObject
    .LINK
        https://github.com/earbona23/TechCare
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')]
    [OutputType([pscustomobject])]
    param(
        [ValidateSet('Balanced', 'HighPerformance', 'PowerSaver')]
        [string]$PowerPlan
    )

    if (-not (Test-TechCarePlatform)) { throw $script:PlatformMessage }

    $findings = New-Object -TypeName System.Collections.ArrayList
    $actions  = New-Object -TypeName System.Collections.ArrayList
    $recs     = New-Object -TypeName System.Collections.ArrayList
    $status   = 'Green'
    $mod      = 'Performance'

    Write-Progress -Activity 'TechCare' -Status 'Revisando arranque automatico' -PercentComplete 20

    $entries = New-Object -TypeName System.Collections.ArrayList
    $sources = @(
        @{ Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'; Scope = 'HKLM' },
        @{ Path = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run'; Scope = 'HKLM32' },
        @{ Path = 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'; Scope = 'HKCU' }
    )
    foreach ($src in $sources) {
        if (-not (Test-Path -LiteralPath $src.Path)) { continue }
        $props = Get-ItemProperty -LiteralPath $src.Path -ErrorAction SilentlyContinue
        if ($null -eq $props) { continue }
        foreach ($p in $props.PSObject.Properties) {
            if ($p.Name -like 'PS*') { continue }
            [void]$entries.Add([pscustomobject]@{ Name = $p.Name; Command = [string]$p.Value; Scope = $src.Scope })
        }
    }

    [void]$findings.Add(('Entradas de arranque automatico: {0}' -f $entries.Count))
    foreach ($e in $entries) {
        [void]$findings.Add((' - [{0}] {1} -> {2}' -f $e.Scope, $e.Name, $e.Command))
    }

    $heavy = @($entries | Where-Object { $_.Command -match 'Teams|OneDrive|Dropbox|Steam|Discord|Spotify|Adobe|Skype|CCleaner|GoogleUpdate' })
    if ($heavy.Count -gt 0) {
        $status = 'Yellow'
        [void]$recs.Add('Candidatos a quitar del arranque, a validar con el usuario antes de tocar nada:')
        foreach ($h in $heavy) { [void]$recs.Add((' - {0} [{1}]' -f $h.Name, $h.Scope)) }
    }
    if ($entries.Count -gt 15) {
        $status = 'Yellow'
        [void]$recs.Add('Mas de 15 entradas de arranque: el inicio de sesion se degrada de forma perceptible.')
    }

    $planOut = Invoke-TechCareProcess -FilePath 'powercfg.exe' -ArgumentList @('/getactivescheme')
    if ($planOut.ExitCode -eq 0) {
        [void]$findings.Add('Plan de energia actual: ' + $planOut.Output)
    } else {
        [void]$findings.Add('No se pudo leer el plan de energia: ' + $planOut.Output)
    }

    if ($PowerPlan) {
        # GUID fijos de los tres planes que Windows trae de fabrica. Se usan en
        # vez del nombre porque el nombre esta traducido en cada idioma.
        $guids = @{
            Balanced        = '381b4222-f694-41f0-9685-ff5bb260df2e'
            HighPerformance = '8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c'
            PowerSaver      = 'a1841308-3541-4fab-bc81-f71556f20b4a'
        }
        if ($PSCmdlet.ShouldProcess('Plan de energia', ('Activar ' + $PowerPlan))) {
            Write-Progress -Activity 'TechCare' -Status 'Cambiando plan de energia' -PercentComplete 80
            $r = Invoke-TechCareProcess -FilePath 'powercfg.exe' -ArgumentList @('/setactive', $guids[$PowerPlan])
            if ($r.ExitCode -eq 0) {
                [void]$actions.Add('Plan de energia cambiado a ' + $PowerPlan)
            } else {
                $status = 'Yellow'
                [void]$findings.Add(('No se pudo cambiar el plan de energia (codigo {0}): {1}' -f $r.ExitCode, $r.Output))
                [void]$recs.Add('En portatiles gestionados el plan suele venir fijado por politica de grupo.')
            }
        }
    } else {
        [void]$recs.Add('Opcional: -PowerPlan HighPerformance en equipos de escritorio conectados a la red electrica.')
    }

    Write-Progress -Activity 'TechCare' -Status 'Revision de rendimiento completada' -Completed
    return Add-TechCareResult -Module $mod -Status $status -Findings $findings.ToArray() -Actions $actions.ToArray() -Recommendations $recs.ToArray()
}