#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Laptop throttles, runs hot, or shuts down under load Fix : Reduce the power the machine is allowed to draw Source: https://jbtecwiz.com/support/win-hw-thermal Run as : Elevated Command Prompt Expect : 25 minutes Risk : low Reversible : yes WHEN THIS IS THE RIGHT FIX The cooling is clean and it still throttles -- thin machines frequently ship with a power limit their cooler cannot sustain. HOW TO UNDO IT Set PROCTHROTTLEMAX back to 100 for both AC and DC, then powercfg /setactive SCHEME_CURRENT. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 4" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' Laptop throttles, runs hot, or shuts down under load' -ForegroundColor White Write-Host ' Reduce the power the machine is allowed to draw' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: low Reversible 25 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Cap the maximum processor state, which lowers peak clocks and drops the temperature sharply for a small performance cost.' -Why 'The last ten per cent of clock speed costs a disproportionate amount of power and heat. Capping at 90% typically costs a few per cent of real performance and can drop package temperature by 10-15C, which is the difference between throttling and not.' -Command { cmd.exe /c 'powercfg /setacvalueindex SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX 90 & powercfg /setdcvalueindex SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX 80 & powercfg /setactive SCHEME_CURRENT' } Invoke-Step -Number 2 -Do 'Check the vendor utility for a performance mode set to Ultra, and choose Balanced.' -Manual Invoke-Step -Number 3 -Do 'Turn off processor boost on battery if the machine is used on a lap.' -Command { cmd.exe /c 'powercfg /setdcvalueindex SCHEME_CURRENT SUB_PROCESSOR PERFBOOSTMODE 0 & powercfg /setactive SCHEME_CURRENT' } Invoke-Step -Number 4 -Do 'Raise the machine off soft surfaces. A laptop on a duvet has no intake at all.' -Manual Write-Rule " Confirm it worked" Show-Prose 'Sustained load holds a steady clock rather than sawtoothing, and the shutdowns stop.' 'White' Write-Host '' if (-not $DryRun) { cmd.exe /c 'powercfg /query SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX' } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/win-hw-thermal' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Set PROCTHROTTLEMAX back to 100 for both AC and DC, then powercfg /setactive SCHEME_CURRENT.' 'DarkGray' Write-Rule