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() } |