#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Windows takes minutes to reach the desktop Fix : Read the boot performance events Source: https://jbtecwiz.com/support/win-slow-boot Run as : Elevated PowerShell Expect : 30 minutes Risk : low Reversible : yes WHEN THIS IS THE RIGHT FIX Any slow boot. Windows has been measuring this all along. HOW TO UNDO IT Set-Service -StartupType Automatic returns any service you changed. 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 5" 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 ' Windows takes minutes to reach the desktop' -ForegroundColor White Write-Host ' Read the boot performance events' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: low Reversible 30 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 'Read the boot duration events. Event 100 gives the total; 101 to 110 name what was slow.' -Why 'Event 101 is a slow application, 102 a slow driver, 103 a slow service, 106 a slow background process. The message names the culprit and the milliseconds it cost.' -Command { Get-WinEvent -LogName 'Microsoft-Windows-Diagnostics-Performance/Operational' -MaxEvents 40 | Where-Object { $_.Id -ge 100 -and $_.Id -le 110 } | Format-List TimeCreated, Id, Message } Invoke-Step -Number 2 -Do 'If it hangs on Applying computer settings, time the Group Policy extensions.' -Command { Get-WinEvent -LogName 'Microsoft-Windows-GroupPolicy/Operational' -MaxEvents 60 | Where-Object Id -in 5326,8000,8001 | Format-Table TimeCreated, Id, Message -AutoSize } Invoke-Step -Number 3 -Do 'Check for drive mappings or scripts pointing at a server that no longer exists.' -Command { Get-SmbMapping | Format-Table LocalPath, RemotePath, Status -AutoSize gpresult /h C:\temp\gpo.html } Invoke-Step -Number 4 -Do 'Look at what starts automatically and how long the delayed ones take.' -Command { Get-Service | Where-Object StartType -eq 'Automatic' | Format-Table Name, DisplayName, Status -AutoSize } Invoke-Step -Number 5 -Do 'Set a non-essential slow service to Automatic (Delayed Start) rather than disabling it.' -Why 'Delayed start moves it out of the critical path without removing the functionality, which is usually the right trade.' -Command { Set-Service -Name 'SomeService' -StartupType AutomaticDelayedStart } Write-Rule " Confirm it worked" Show-Prose 'Event 100''s boot duration drops on the next few starts.' 'White' Write-Host '' if (-not $DryRun) { Get-WinEvent -LogName 'Microsoft-Windows-Diagnostics-Performance/Operational' -MaxEvents 5 | Where-Object Id -eq 100 | Format-List TimeCreated, Message } 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-slow-boot' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Set-Service -StartupType Automatic returns any service you changed.' 'DarkGray' Write-Rule