Every fix
All 73 of them. What each one does, how risky it is, how long it takes, and the exact command it runs.
31 are free. The rest need a license, $49 once. Free fixes are marked Free. The rest are marked License.
Every fix runs a tool that already comes with Windows. Click "Show the command" to see exactly what it runs. The Kit shows you the same thing before you press anything.
Fix It 46 fixes
Repairs for Windows, updates, drives, printers and devices.
Restarts the desktop and taskbar, which clears most display glitches in Explorer.
Show the command
taskkill /f /im explorer.exe >nul 2>&1 & start explorer.exe
Shows whether Windows is activated, and for how long.
Show the command
cscript //nologo %SystemRoot%\System32\slmgr.vbs /xpr
Reads each drive's own health report and warns if one is failing.
Show the command
PowerShell "$d = @(Get-PhysicalDisk); if ($d.Count -eq 0) { 'No drives reported health information.'; exit 1 }; $bad = @($d | Where-Object { $_.HealthStatus -ne 'Healthy' }); if ($bad.Count -eq 0) { 'All ' + $d.Count + ' drives report good health.' } else { 'WARNING: ' + $bad.Count + ' drive(s) are not reporting good health. Back up anything important now, before doing anything else.' }; ''; ($d | ForEach-Object { [pscustomobject]@{ Drive = $_.FriendlyName; Size = [string][math]::Round($_.Size/1GB) + ' GB'; Type = [string]$_.MediaType; Health = [string]$_.HealthStatus } } | Format-Table -AutoSize | Out-String -Width 200).TrimEnd(); if ($bad.Count -gt 0) { exit 1 }"Saves a system snapshot you can roll back to.
Show the command
PowerShell "Checkpoint-Computer -Description 'Remedii'"
Downloads and repairs the underlying Windows image.
Show the command
PowerShell "$out = & cmd /c 'DISM /Online /Cleanup-Image /RestoreHealth 2>&1'; $keep = @($out | Where-Object { $_ -match '\S' -and $_ -notmatch '\d+(\.\d+)?%' -and $_ -notmatch '^\s*\[' -and $_ -notmatch '^Deployment Image' -and $_ -notmatch '^Version:' }); 'Windows image repair finished.'; ''; ($keep | Select-Object -Last 3) -join [Environment]::NewLine; ''; 'If it repaired anything, follow up with Repair Corrupt System Files to put the repaired copies back in place.'"Restarts the update-related services.
Show the command
PowerShell "$names = @('wuauserv','bits'); $bad = @(); foreach ($n in $names) { try { Restart-Service -Name $n -Force -ErrorAction Stop } catch { $bad += $n } }; Start-Sleep -Milliseconds 800; $stopped = @(Get-Service -Name $names -ErrorAction SilentlyContinue | Where-Object { $_.Status -ne 'Running' } | ForEach-Object { $_.Name }); if ($stopped.Count -gt 0) { 'These update services did not come back up: ' + ($stopped -join ', ') + '. Restart the PC and try again.'; exit 1 }; 'The Windows Update services have been restarted.'; ''; 'Try checking for updates again. If it still fails, Full Reset of Update Components clears the download folders as well.'"Completely resets the Windows Update stack when updates are stuck.
Show the command
PowerShell "$svc = @('wuauserv','cryptSvc','bits','msiserver'); foreach ($s in $svc) { try { Stop-Service $s -Force -ErrorAction Stop } catch { } }; $renamed = 0; foreach ($pair in @(@((Join-Path $env:WINDIR 'SoftwareDistribution'), (Join-Path $env:WINDIR 'SoftwareDistribution.old')), @((Join-Path $env:WINDIR 'System32\catroot2'), (Join-Path $env:WINDIR 'System32\catroot2.old')))) { if (Test-Path $pair[1]) { [System.IO.Directory]::Delete($pair[1], $true) }; if (Test-Path $pair[0]) { try { Rename-Item $pair[0] (Split-Path $pair[1] -Leaf) -Force -ErrorAction Stop; $renamed++ } catch { } } }; foreach ($s in $svc) { Start-Service $s -ErrorAction SilentlyContinue }; if ($renamed -eq 0) { 'Could not reset the update folders - Windows still has them open. Restart the PC and try again.'; exit 1 }; 'Windows Update has been reset to a clean state.'; ''; 'The next update check rebuilds what was cleared, so it may take longer than usual.'"Clears superseded Windows update files, which can free several gigabytes.
Show the command
PowerShell "$before = (Get-PSDrive C).Free; $out = & cmd /c 'DISM /Online /Cleanup-Image /StartComponentCleanup 2>&1'; $freed = (Get-PSDrive C).Free - $before; $keep = @($out | Where-Object { $_ -match '\S' -and $_ -notmatch '\d+(\.\d+)?%' -and $_ -notmatch '^\s*\[' -and $_ -notmatch '^Deployment Image' -and $_ -notmatch '^Version:' }); 'Component store cleanup finished.'; ''; if ($freed -gt 1073741824) { 'About ' + [math]::Round($freed/1GB,1) + ' GB was recovered.' } elseif ($freed -gt 1048576) { 'About ' + [math]::Round($freed/1MB,0) + ' MB was recovered.' } else { 'No significant space was recovered - there was little to clean up.' }; ''; ($keep | Select-Object -Last 2) -join [Environment]::NewLine"Scans and repairs protected Windows files.
Show the command
PowerShell "$out = & cmd /c 'sfc /scannow 2>&1'; $keep = @($out | Where-Object { $_ -match '\S' -and $_ -notmatch '\d+%' -and $_ -notmatch '^\s*\[' }); if ($keep.Count -eq 0) { 'The scan finished but reported nothing back.'; exit 1 }; 'System file check finished.'; ''; ($keep | Select-Object -Last 3) -join [Environment]::NewLine"Resets a broken OneDrive sync client.
Show the command
PowerShell "$paths = @((Join-Path $env:LOCALAPPDATA 'Microsoft\OneDrive\OneDrive.exe'), (Join-Path $env:ProgramFiles 'Microsoft OneDrive\OneDrive.exe'), (Join-Path ${env:ProgramFiles(x86)} 'Microsoft OneDrive\OneDrive.exe')); $exe = $paths | Where-Object { Test-Path $_ } | Select-Object -First 1; if (-not $exe) { 'OneDrive is not installed on this PC, so there is nothing to reset.'; exit 0 }; Start-Process $exe -ArgumentList '/reset'; Start-Sleep -Seconds 5; if (-not (Get-Process OneDrive -ErrorAction SilentlyContinue)) { Start-Process $exe }; 'OneDrive has been reset and restarted.'; ''; 'It re-checks every synced file, so the sync icons may churn for a while. Nothing in your OneDrive folder is deleted by this.'"Re-syncs the clock with the time server.
Show the command
PowerShell "Start-Service w32time -ErrorAction SilentlyContinue; Start-Sleep -Milliseconds 500; $out = & w32tm /resync 2>&1; if ($LASTEXITCODE -ne 0) { Start-Sleep -Seconds 2; $out = & w32tm /resync 2>&1 }; if ($LASTEXITCODE -ne 0) { 'Could not set the clock from a time server.'; ''; ($out | Where-Object { $_ -match '\S' } | Select-Object -Last 2) -join ' '; exit 1 }; 'Clock synchronised with Microsoft''s time server.'; ''; 'This PC now reads ' + (Get-Date).ToString('dddd d MMMM yyyy, HH:mm:ss') + '.'"Clears stuck print jobs and restarts printing.
Show the command
net stop spooler & del /q %WINDIR%\System32\spool\PRINTERS\* & net start spooler
Checks Microsoft for updates your PC has not installed yet.
Show the command
PowerShell "try { $n = (New-Object -ComObject Microsoft.Update.Session).CreateUpdateSearcher().Search('IsInstalled=0 and Type=''Software''').Updates.Count; if ($n -eq 0) { 'Windows is up-to-date. Nothing is waiting to install.' } else { $w = 'updates are'; if ($n -eq 1) { $w = 'update is' }; [string]$n + ' ' + $w + ' ready to install.' } } catch { 'Could not check for updates. Windows Update may be turned off, or managed by your workplace.' }"Lists the programs installed most recently, so you can spot something you did not put there.
Show the command
PowerShell "$keys = @('HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*', 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'); $apps = @(); foreach ($k in $keys) { $apps += @(Get-ItemProperty $k -ErrorAction SilentlyContinue) }; $ci = [Globalization.CultureInfo]::InvariantCulture; $rows = @($apps | Where-Object { $_.DisplayName -and $_.InstallDate -match '^\d{8}$' } | ForEach-Object { $dt = $null; try { $dt = [datetime]::ParseExact([string]$_.InstallDate, 'yyyyMMdd', $ci) } catch { }; if ($dt) { [pscustomobject]@{ On = $dt; App = [string]$_.DisplayName; By = [string]$_.Publisher } } } | Sort-Object On -Descending | Select-Object -First 10); if ($rows.Count -eq 0) { 'Windows has no install dates recorded for the programs on this PC, so there is nothing to list.'; exit 0 }; 'The programs most recently installed on this PC:'; ''; ($rows | ForEach-Object { [pscustomobject]@{ Installed = $_.On.ToString('d MMM yyyy'); Program = $_.App; Publisher = $_.By } } | Format-Table -AutoSize | Out-String -Width 220).TrimEnd(); ''; 'Anything here you did not install yourself is worth looking into - unwanted software usually arrives alongside something else.'"Repairs a broken Start menu. Pinned apps may go back to their defaults.
Show the command
PowerShell "$done = @(); foreach ($n in @('Microsoft.Windows.StartMenuExperienceHost','Microsoft.Windows.ShellExperienceHost')) { $p = Get-AppxPackage $n; if ($p) { try { $p | Reset-AppxPackage -ErrorAction Stop; $done += $n } catch { } } }; if ($done.Count -eq 0) { 'Could not reset the Start menu on this PC. Nothing was changed.'; exit 1 } else { Stop-Process -Name StartMenuExperienceHost -Force -ErrorAction SilentlyContinue; 'Start menu reset, and restarted so it works again straight away. If it still misbehaves, sign out of Windows and back in.' }"Lists apps with a newer version available, and the version you have now.
Show the command
PowerShell "if (-not (Get-Command winget -ErrorAction SilentlyContinue)) { 'This needs the Windows Package Manager (winget), which is not installed on this PC. Install App Installer from the Microsoft Store, then try again.'; exit 0 }; $prev = [Console]::OutputEncoding; [Console]::OutputEncoding = [Text.Encoding]::UTF8; $raw = winget upgrade --disable-interactivity --accept-source-agreements 2>$null; [Console]::OutputEncoding = $prev; $rows = @(); foreach ($line in $raw) { if ($line -match '^(.+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$') { $app = $matches[1].Trim(); $inst = $matches[3]; $avail = $matches[4]; if ($app -cmatch '[A-Za-z0-9]' -and $inst -cmatch '[0-9]' -and $avail -cmatch '[0-9]') { $rows += [pscustomobject]@{ App = $app; Installed = $inst; Available = $avail } } } }; if ($rows.Count -eq 0) { 'All your apps are up to date.' } else { $w = 'apps have'; if ($rows.Count -eq 1) { $w = 'app has' }; [string]$rows.Count + ' ' + $w + ' a newer version available:'; $rows | Format-Table -AutoSize App, Installed, Available }"Reinstalls built-in apps that won't open.
Show the command
PowerShell "$pkgs = @(Get-AppxPackage); $ok = 0; $skip = 0; foreach ($p in $pkgs) { if (-not $p.InstallLocation) { $skip++; continue }; $m = Join-Path $p.InstallLocation 'AppXManifest.xml'; if (-not (Test-Path $m)) { $skip++; continue }; try { Add-AppxPackage -DisableDevelopmentMode -Register $m -ErrorAction Stop; $ok++ } catch { $skip++ } }; 'Re-registered ' + $ok + ' of ' + $pkgs.Count + ' Store apps.'; if ($skip -gt 0) { [string]$skip + ' were skipped, which is normal - Windows will not re-register an app it is using right now.' }; ''; 'Sign out of Windows and back in for this to take full effect.'"Clears and resets the Store app.
Show the command
PowerShell "Start-Process wsreset.exe; 'The Microsoft Store cache has been cleared.'; ''; 'The Store opens by itself once it finishes - that is how wsreset signals it is done, and it can be closed straight away.'"
Fixes no-sound issues by restarting audio.
Show the command
PowerShell "$s = Get-Service -Name 'audiosrv' -ErrorAction SilentlyContinue; if (-not $s) { 'This PC has no audio service, so there is nothing to restart.'; exit 0 }; try { Restart-Service -Name 'audiosrv' -Force -ErrorAction Stop } catch { 'Could not restart the audio service: ' + $_.Exception.Message; exit 1 }; Start-Sleep -Milliseconds 600; $s = Get-Service -Name 'audiosrv'; if ($s.Status -ne 'Running') { 'The audio service did not come back up. Restart the PC and try again.'; exit 1 }; 'The audio service has been restarted and is running again.'; ''; 'If sound is still missing, check the speaker icon by the clock for a muted or wrong output device.'"Restarts the Windows print service to clear stuck jobs and printing errors.
Show the command
PowerShell "$s = Get-Service -Name 'Spooler' -ErrorAction SilentlyContinue; if (-not $s) { 'This PC has no print service, so there is nothing to restart.'; exit 0 }; try { Restart-Service -Name 'Spooler' -Force -ErrorAction Stop } catch { 'Could not restart the print service: ' + $_.Exception.Message; exit 1 }; Start-Sleep -Milliseconds 600; $s = Get-Service -Name 'Spooler'; if ($s.Status -ne 'Running') { 'The print service did not come back up. Restart the PC and try again.'; exit 1 }; 'The print service has been restarted and is running again.'; ''; 'Anything stuck in a print queue was cleared when the service restarted.'"Updates every app winget manages.
Show the command
PowerShell "if (-not (Get-Command winget -ErrorAction SilentlyContinue)) { 'This needs the Windows Package Manager (winget), which is not installed on this PC. Install App Installer from the Microsoft Store, then try again.'; exit 0 }; $prev = [Console]::OutputEncoding; [Console]::OutputEncoding = [Text.Encoding]::UTF8; $raw = winget upgrade --all --include-unknown --disable-interactivity --accept-source-agreements --accept-package-agreements 2>$null; [Console]::OutputEncoding = $prev; $done = @($raw | Where-Object { $_ -match 'Successfully installed' }).Count; $failed = @($raw | Where-Object { $_ -match 'Installer failed|failed with exit code' }).Count; if ($done -eq 0 -and $failed -eq 0) { 'Nothing needed updating - every app is already on its latest version.'; exit 0 }; [string]$done + ' app(s) updated.' + $(if ($failed -gt 0) { ' ' + [string]$failed + ' could not be updated automatically.' } else { '' }); ''; 'Apps that were open during the update may need closing and reopening.'"Shows used and free space on C:.
Show the command
PowerShell "Get-PSDrive C"
Scans the drive for file-system problems (read-only).
Show the command
PowerShell "$out = chkdsk C: 2>&1; $code = $LASTEXITCODE; if ($code -eq 0) { 'No problems found. The file system on your C: drive is healthy.' } elseif ($code -eq 1 -or $code -eq 2) { 'Problems were found on your C: drive.'; ''; 'Run Repair Hard Drive Errors to fix them. That one schedules a repair which runs while the PC restarts.' } else { 'The drive check could not run:'; ''; ($out | Where-Object { $_ -notmatch 'Progress:' -and $_.Trim() -ne '' } | Select-Object -Last 6); exit 1 }"Permanently deletes items in the Recycle Bin.
Show the command
PowerShell "$bin = (New-Object -ComObject Shell.Application).Namespace(10); $count = @($bin.Items()).Count; $before = (Get-PSDrive C).Free; Clear-RecycleBin -Force -ErrorAction SilentlyContinue; $freed = (Get-PSDrive C).Free - $before; if ($count -eq 0) { 'The Recycle Bin was already empty. Nothing to delete.' } else { $w = 'items'; if ($count -eq 1) { $w = 'item' }; $m = 'Recycle Bin emptied - ' + $count + ' ' + $w + ' permanently deleted.'; if ($freed -gt 1073741824) { $m = $m + ' About ' + [math]::Round($freed/1GB,1) + ' GB freed.' } elseif ($freed -gt 1048576) { $m = $m + ' About ' + [math]::Round($freed/1MB,0) + ' MB freed.' }; $m }"Tunes the drive the way it needs: defragments a hard disk, trims a solid-state drive.
Show the command
PowerShell "defrag C: /O | Out-Null; $code = $LASTEXITCODE; if ($code -ne 0) { 'The optimization did not finish (error code ' + $code + '). Close other programs and try again.'; exit 1 }; $n = (Get-Partition -DriveLetter C | Get-Disk).Number; $media = (Get-PhysicalDisk | Where-Object { $_.DeviceId -eq $n }).MediaType; $v = Get-Volume -DriveLetter C; if ($media -eq 'SSD') { 'Your C: drive is a solid-state drive, so Windows trimmed it rather than defragmenting it. Trimming is the right upkeep for this kind of drive and keeps it writing at full speed.' } elseif ($media -eq 'HDD') { 'Your C: drive was defragmented, so files are stored in fewer pieces and open faster.' } else { 'Windows ran the upkeep suited to your C: drive.' }; ''; 'Drive size: ' + [math]::Round($v.Size/1GB,1) + ' GB'; 'Free space: ' + [math]::Round($v.SizeRemaining/1GB,1) + ' GB'"Finds the 20 biggest files in your personal folders, and where they are.
Show the command
PowerShell "$p = $env:USERPROFILE; Get-ChildItem -LiteralPath $p -File -Recurse -Depth 5 -Force -ErrorAction SilentlyContinue | Sort-Object Length -Descending | Select-Object -First 20 | ForEach-Object { $d = $_.DirectoryName; if ($d.StartsWith($p, 'OrdinalIgnoreCase')) { $d = $d.Substring($p.Length).TrimStart('\') }; if ($d -eq '') { $d = '(your user folder)' }; $s = if ($_.Length -ge 1GB) { [string][math]::Round($_.Length/1GB,1) + ' GB' } else { [string][math]::Round($_.Length/1MB,0) + ' MB' }; [pscustomobject]@{ Size = $s; File = $_.Name; Folder = $d } } | Format-Table -AutoSize Size, File, Folder | Out-String -Width 240"Clears stuck print jobs.
Show the command
net stop spooler && del /q %WINDIR%\System32\spool\PRINTERS\* && net start spooler
Deletes everything in the temp folder.
Show the command
del /q/f/s %TEMP%\*
Schedules a full repair of the C: drive, which runs at the next restart.
Show the command
PowerShell "$out = & cmd /c 'echo Y| chkdsk C: /f /r 2>&1'; 'A full repair of the C: drive has been scheduled.'; ''; 'It runs automatically the next time this PC restarts, before Windows loads. Allow an hour or more on a large drive - the PC cannot be used while it runs, and it must not be switched off part-way.'"
Shows which earlier days this PC can be rolled back to, and how recent the newest one is.
Show the command
PowerShell "try { $rp = @(Get-ComputerRestorePoint -ErrorAction Stop) } catch { 'Could not read the restore points on this PC.'; exit 1 }; if ($rp.Count -eq 0) { 'This PC has no restore points, so Windows cannot roll it back to an earlier day. Use Create a Restore Point to make one now - it takes a minute and costs nothing until you need it.'; exit 0 }; $rows = @($rp | Sort-Object SequenceNumber -Descending | Select-Object -First 12 | ForEach-Object { [pscustomobject]@{ When = $_.ConvertToDateTime($_.CreationTime).ToString('d MMM yyyy, HH:mm'); Reason = [string]$_.Description } }); $newest = $rp | Sort-Object SequenceNumber -Descending | Select-Object -First 1; $age = (New-TimeSpan -Start $newest.ConvertToDateTime($newest.CreationTime) -End (Get-Date)).Days; 'This PC can be rolled back to ' + [string]$rp.Count + ' earlier point(s). The newest is ' + $(if ($age -eq 0) { 'from today' } elseif ($age -eq 1) { 'from yesterday' } else { [string]$age + ' days old' }) + '.'; ''; ($rows | Format-Table -AutoSize | Out-String -Width 220).TrimEnd(); ''; 'Rolling back undoes settings, drivers and installed programs. Your own documents and photos are left alone.'"Opens the Windows wizard for making a USB recovery drive.
Show the command
PowerShell "Start-Process recoverydrive.exe; 'The Recovery Drive wizard is opening in its own window.'; ''; 'Follow it there: it needs a USB stick of at least 16 GB, and it erases everything already on that stick.'"
Saves a copy of the registry to a file before making changes.
Show the command
PowerShell "$dir = [Environment]::GetFolderPath('Desktop'); $out = Join-Path $dir 'registry-backup.reg'; reg export HKLM $out /y | Out-Null; if (-not (Test-Path $out)) { 'Could not export the registry backup.'; exit 1 }; $mb = [math]::Round((Get-Item $out).Length/1MB,1); 'Registry backup saved to your Desktop as registry-backup.reg (' + $mb + ' MB).'; ''; 'This is a copy of the machine settings only, taken now. Double-clicking it would put those settings back, so keep it somewhere safe and do not run it unless you mean to.'"Copies your Desktop, Documents, Pictures and Videos to an external drive.
Show the command
robocopy "%USERPROFILE%\Desktop" "{DRIVE}\PCRescue Kit Backup\Desktop" /E /R:1 /W:1 /XJ /NFL /NDL /NP ### robocopy "%USERPROFILE%\Documents" "{DRIVE}\PCRescue Kit Backup\Documents" /E /R:1 /W:1 /XJ /NFL /NDL /NP ### robocopy "%USERPROFILE%\Pictures" "{DRIVE}\PCRescue Kit Backup\Pictures" /E /R:1 /W:1 /XJ /NFL /NDL /NP ### robocopy "%USERPROFILE%\Videos" "{DRIVE}\PCRescue Kit Backup\Videos" /E /R:1 /W:1 /XJ /NFL /NDL /NPRolls the system back to a saved restore point (PC will restart).
Show the command
PowerShell "Restore-Computer -RestorePoint {RESTOREID}"Finds devices reporting errors.
Show the command
PowerShell "$d = Get-PnpDevice -PresentOnly | Where Status -ne 'OK' | Select Status, Class, FriendlyName | Sort Status, Class; if ($d) { $d | Format-Table -AutoSize } else { 'No problems found. Every connected device is reporting OK.' } "Re-checks every connected device, which often wakes up hardware Windows has missed.
Show the command
PowerShell "$before = @(Get-PnpDevice -PresentOnly -ErrorAction SilentlyContinue).Count; pnputil /scan-devices | Out-Null; Start-Sleep -Seconds 2; $after = @(Get-PnpDevice -PresentOnly -ErrorAction SilentlyContinue); $new = $after.Count - $before; $bad = @($after | Where-Object { $_.Status -ne 'OK' }); if ($new -gt 0) { 'Windows found ' + [string]$new + ' device(s) it had not seen before and is setting them up now.' } else { 'Windows re-checked every connected device. Nothing new turned up.' }; ''; if ($bad.Count -eq 0) { 'Every connected device is working.' } else { [string]$bad.Count + ' device(s) still need attention:'; ''; ($bad | Select-Object -First 10 | ForEach-Object { [pscustomobject]@{ Status = [string]$_.Status; Type = [string]$_.Class; Device = [string]$_.FriendlyName } } | Format-Table -AutoSize | Out-String -Width 200).TrimEnd(); ''; 'If a device is still missing, its driver probably needs installing from the maker''s website.' }"Saves all your drivers to a folder.
Show the command
PowerShell "$dir = Join-Path ([Environment]::GetFolderPath('Desktop')) 'Driver Backup'; if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null }; dism /online /export-driver /destination:$dir | Out-Null; $files = @(Get-ChildItem $dir -Recurse -File -ErrorAction SilentlyContinue); if ($files.Count -eq 0) { 'No third-party drivers were found to back up. Windows'' own drivers do not need backing up - they come with Windows.'; exit 0 }; $mb = [math]::Round((($files | Measure-Object Length -Sum).Sum)/1MB,0); $folders = @(Get-ChildItem $dir -Directory -ErrorAction SilentlyContinue).Count; [string]$folders + ' drivers backed up to the Driver Backup folder on your Desktop (' + $mb + ' MB).'; ''; 'Copy this folder somewhere safe. After a Windows reinstall you can point Device Manager at it to put the drivers back.'"Fixes flaky Bluetooth by restarting it.
Show the command
PowerShell "$s = Get-Service -Name 'bthserv' -ErrorAction SilentlyContinue; if (-not $s) { 'This PC has no Bluetooth service, so there is nothing to restart.'; exit 0 }; try { Restart-Service -Name 'bthserv' -Force -ErrorAction Stop } catch { 'Could not restart the Bluetooth service: ' + $_.Exception.Message; exit 1 }; Start-Sleep -Milliseconds 600; $s = Get-Service -Name 'bthserv'; if ($s.Status -ne 'Running') { 'The Bluetooth service did not come back up. Restart the PC and try again.'; exit 1 }; 'The Bluetooth service has been restarted and is running again.'; ''; 'Re-pair the device if it still will not connect.'"Opens Network status, where Windows' guided network fixes live.
Show the command
ms-settings:network-status
Opens Printers & scanners, where Windows' guided printer troubleshooter lives.
Show the command
ms-settings:printers
Switch how your screens are used - extend, duplicate, or use just one.
Show the command
DisplaySwitch /extend
Opens Sound settings, where Windows' guided audio troubleshooter lives.
Show the command
ms-settings:sound
Saves a full hardware and OS report to a text file.
Show the command
PowerShell "$dir = [Environment]::GetFolderPath('Desktop'); $out = Join-Path $dir 'system-report.txt'; systeminfo | Out-File -FilePath $out -Encoding utf8; if (-not (Test-Path $out)) { 'Could not save the system report.'; exit 1 }; $kb = [math]::Round((Get-Item $out).Length/1KB,1); 'System report saved to your Desktop as system-report.txt (' + $kb + ' KB).'; ''; 'It lists this PC''s Windows version, hardware, memory and network details - useful to send to whoever is helping you.'"Lists the errors Windows has logged, and can save a report to hand to a technician.
Show the command
PowerShell "$ev = @(Get-WinEvent -FilterHashtable @{LogName='System'; Level=1,2} -MaxEvents 300 -ErrorAction SilentlyContinue); $rows = @($ev | ForEach-Object { $m = ($_.Message -split '\r?\n')[0].Trim(); [pscustomobject]@{ S = $_.ProviderName; M = $m; At = $_.TimeCreated } } | Group-Object S, M | ForEach-Object { $g = $_.Group | Sort-Object At -Descending; [pscustomobject]@{ When = $g[0].At; Times = $_.Count; Source = $g[0].S; What = $g[0].M } } | Sort-Object When -Descending); if ($rows.Count -eq 0) { 'Windows has not recorded any system errors. That is a good sign.'; exit 0 }; [string]$rows.Count + ' kind(s) of error have been recorded. The most recent:'; ''; (@($rows | Select-Object -First 5) | ForEach-Object { $w = $_.What; if ($w.Length -gt 62) { $w = $w.Substring(0,59).TrimEnd('.',' ') + '...' }; [pscustomobject]@{ When = $_.When.ToString('dd MMM HH:mm'); Times = $_.Times; 'What happened' = $w } } | Format-Table -AutoSize | Out-String -Width 200).TrimEnd(); ''; 'Some of these are harmless and some are not - telling them apart is a technician''s job. Use Save a report to put a PDF on your Desktop you can send on.'"Clears the font cache and restarts its service, which fixes garbled or missing text.
Show the command
PowerShell "try { Stop-Service FontCache -Force -ErrorAction Stop } catch { 'Could not stop the font cache service, so nothing was changed.'; exit 1 }; $dir = Join-Path $env:WINDIR 'ServiceProfiles\LocalService\AppData\Local\FontCache'; $gone = 0; $bytes = 0; if (Test-Path $dir) { foreach ($f in @(Get-ChildItem $dir -File -Force -ErrorAction SilentlyContinue)) { try { $len = $f.Length; [System.IO.File]::Delete($f.FullName); $gone++; $bytes += $len } catch { } } }; Start-Service FontCache -ErrorAction SilentlyContinue; $svc = Get-Service FontCache -ErrorAction SilentlyContinue; if ($svc -and $svc.Status -ne 'Running') { 'The font cache was cleared but its service did not restart. Restart the PC to finish.'; exit 1 }; if ($gone -eq 0) { 'The font cache was already empty. Nothing needed clearing.'; exit 0 }; 'Cleared ' + $gone + ' font cache files (' + [math]::Round($bytes/1MB,1) + ' MB) and restarted the service.'; ''; 'Windows rebuilds the cache as fonts are used, so text may take a moment longer to appear the first time.'"Fixes broken or blank icons.
Show the command
PowerShell "Stop-Process -Name explorer -Force -ErrorAction SilentlyContinue; Start-Sleep -Seconds 1; $gone = 0; $targets = @((Join-Path $env:LOCALAPPDATA 'IconCache.db')) + @(Get-ChildItem (Join-Path $env:LOCALAPPDATA 'Microsoft\Windows\Explorer') -Filter 'iconcache*.db' -Force -ErrorAction SilentlyContinue | ForEach-Object { $_.FullName }); foreach ($t in $targets) { if (Test-Path $t) { try { [System.IO.File]::Delete($t); $gone++ } catch { } } }; Start-Process explorer.exe; if ($gone -eq 0) { 'No icon cache files could be cleared - something still has them open. Restart the PC and try again.'; exit 1 }; 'Cleared ' + $gone + ' icon cache files and restarted the desktop.'; ''; 'Icons rebuild as you open folders, so a few may look plain for a moment.'"Speed It Up 6 fixes
Find what is actually slowing the PC down.
Force-closes an unresponsive app by name.
Show the command
taskkill /f /im {PROGRAM}Shows which programs are working the processor hardest right now.
Show the command
PowerShell "$win = $env:SystemRoot; $sys = 'MsMpEng','MpDefenderCoreService','NisSrv','SecurityHealthService','Memory Compression','Secure System','Registry','System','Idle'; $user = Get-Process | Where-Object { $_.Name -notin $sys -and $_.Path -ne $null -and -not $_.Path.StartsWith($win, 'OrdinalIgnoreCase') }; $cores = [Environment]::ProcessorCount; $before = @{}; foreach ($p in $user) { if ($p.CPU -ne $null) { $before[$p.Id] = $p.CPU } }; Start-Sleep -Seconds 2; $rows = Get-Process | Where-Object { $before.ContainsKey($_.Id) } | ForEach-Object { $prev = $before[$_.Id]; $delta = $(if ($_.CPU -ne $null) { $_.CPU - $prev } else { 0 }); [pscustomobject]@{ Key = $(if ($_.Description) { $_.Description } else { $_.Name }); Delta = $delta } } | Group-Object Key | ForEach-Object { $d = ($_.Group | Measure-Object Delta -Sum).Sum; [pscustomobject]@{ Program = $_.Name; Pct = [math]::Round(($d / (2 * $cores)) * 100, 1) } } | Where-Object { $_.Pct -ge 0.5 } | Sort-Object Pct -Descending | Select-Object -First 5; if (-not $rows) { 'No program is working the processor hard right now. If the PC still feels slow, try Show Top Memory Hogs.' } else { 'These programs are using the processor right now:'; $rows | ForEach-Object { [pscustomobject]@{ Program = $_.Program; CPU = [string]$_.Pct + [char]37 } } | Format-Table -AutoSize | Out-String -Width 200 }"Lists apps that launch at startup.
Show the command
PowerShell "Get-CimInstance Win32_StartupCommand | Select Name,Command"
Shows the programs using the most memory, counting a browser's many windows as one.
Show the command
PowerShell "$win = $env:SystemRoot; $sys = 'MsMpEng','MpDefenderCoreService','NisSrv','SecurityHealthService','Memory Compression','Secure System','Registry','System','Idle'; $user = Get-Process | Where-Object { $_.Name -notin $sys -and $_.Path -ne $null -and -not $_.Path.StartsWith($win, 'OrdinalIgnoreCase') }; $rows = $user | Where-Object { $_.WorkingSet64 -gt 0 } | Group-Object -Property { if ($_.Description) { $_.Description } else { $_.Name } } | ForEach-Object { $b = ($_.Group | Measure-Object WorkingSet64 -Sum).Sum; [pscustomobject]@{ Program = $_.Name; Bytes = $b; Memory = $(if ($b -ge 1GB) { [string][math]::Round($b/1GB,1) + ' GB' } else { [string][math]::Round($b/1MB,0) + ' MB' }); Running = $(if ($_.Count -eq 1) { '1 process' } else { [string]$_.Count + ' processes' }) } } | Sort-Object Bytes -Descending | Select-Object -First 5; if (-not $rows) { 'No programs of yours are using much memory right now.' } else { 'These programs are using the most memory:'; $rows | Format-Table -AutoSize Program, Memory, Running | Out-String -Width 200 }"Saves a detailed battery health report.
Show the command
PowerShell "if (-not (Get-CimInstance Win32_Battery -ErrorAction SilentlyContinue)) { 'This PC has no battery, so there is no battery health to report. That is normal for a desktop.'; exit 0 }; $dir = [Environment]::GetFolderPath('Desktop'); $out = Join-Path $dir 'battery-report.html'; powercfg /batteryreport /output $out | Out-Null; if (-not (Test-Path $out)) { 'Could not create a battery report on this PC.'; exit 1 }; 'Battery report saved to your Desktop as battery-report.html.'; ''; 'Open it and look for Design Capacity against Full Charge Capacity - the gap between them is how much capacity the battery has lost since it was new.'"Turns off hibernation and gives back the disk space its file was using.
Show the command
PowerShell "$h = Join-Path $env:SystemDrive 'hiberfil.sys'; $size = 0; if (Test-Path $h) { try { $size = (Get-Item $h -Force).Length } catch { } }; powercfg /hibernate off | Out-Null; Start-Sleep -Milliseconds 500; if (Test-Path $h) { 'Could not turn hibernation off. This needs administrator rights.'; exit 1 }; 'Hibernation is off' + $(if ($size -gt 1073741824) { ', freeing about ' + [math]::Round($size/1GB,1) + ' GB.' } elseif ($size -gt 0) { ', freeing about ' + [math]::Round($size/1MB,0) + ' MB.' } else { '.' }); ''; 'Sleep still works as before. What you lose is Hibernate, and Fast Startup - which means a slightly slower boot, and a genuinely clean one.'"Secure It 11 fixes
Make sure protection is on and nothing is hiding.
Checks whether your PC is actually being protected, and how current the virus definitions are.
Show the command
PowerShell "try { $s = Get-MpComputerStatus -ErrorAction Stop } catch { 'Could not read the protection status of this PC.'; exit 1 }; $mode = [string]$s.AMRunningMode; $rtp = $s.RealTimeProtectionEnabled; $age = [int]$s.AntivirusSignatureAge; $bad = $false; if ($mode -match 'Passive|SxS') { $v = 'Microsoft Defender is standing back because another antivirus program is installed and protecting this PC. That is normal.' } elseif (-not $rtp) { $v = 'Real-time protection is OFF, so this PC is not being protected. Use Turn On Real-Time Protection to switch it back on.'; $bad = $true } elseif ($age -gt 7) { $v = 'Protection is on, but the virus definitions are ' + $age + ' days out of date. Run Check for Windows Updates to refresh them.'; $bad = $true } else { $v = 'Your PC is protected.' }; $v; ''; $fmt = { param($n) if ($n -eq 0) { 'today' } elseif ($n -eq 1) { 'yesterday' } else { [string]$n + ' days ago' } }; 'Real-time protection: ' + $(if ($rtp) { 'On' } else { 'Off' }); 'Virus definitions: ' + $(if ($age -eq 0) { 'updated today' } else { 'updated ' + (& $fmt $age) }); 'Last quick scan: ' + (& $fmt ([int]$s.QuickScanAge)); 'Tamper protection: ' + $(if ($s.IsTamperProtected) { 'On' } else { 'Off' }); if ($bad) { exit 1 }"Lists every account with administrator rights, so you can spot one that should not be there.
Show the command
PowerShell "try { $m = Get-LocalGroupMember -Group 'Administrators' -ErrorAction Stop } catch { $m = $null }; if (-not $m) { net localgroup administrators; exit 0 }; $rows = @($m | ForEach-Object { $n = $_.Name.Split('\')[-1]; $t = switch ($_.PrincipalSource) { 'Local' { 'Local account' } 'MicrosoftAccount' { 'Microsoft account' } 'ActiveDirectory' { 'Work or school account' } default { [string]$_.PrincipalSource } }; if ($_.ObjectClass -eq 'Group') { $t = $t + ' (group)' }; [pscustomobject]@{ Account = $n; Type = $t } }); $w = 'accounts have'; if ($rows.Count -eq 1) { $w = 'account has' }; [string]$rows.Count + ' ' + $w + ' administrator rights on this PC:'; ($rows | Format-Table -AutoSize Account, Type | Out-String -Width 200).TrimEnd(); ''; 'If you do not recognise one of these, it should not be there - an unexpected administrator is how someone keeps access to a PC.'"Scans every file on the PC with Microsoft Defender. Closing this window does not stop the scan - it keeps running in Windows Security.
Show the command
PowerShell "try { $s = Get-MpComputerStatus -ErrorAction Stop } catch { $s = $null }; if ($s -and $s.FullScanStartTime -and $s.FullScanStartTime -gt $s.FullScanEndTime) { 'A full scan is already running on this PC. It carries on in the background - open Windows Security to watch its progress.'; exit 0 }; Start-MpScan -ScanType FullScan -ErrorAction SilentlyContinue; try { $a = Get-MpComputerStatus -ErrorAction Stop } catch { $a = $null }; if ($a -and $a.FullScanEndTime -and $a.FullScanEndTime -ge $a.FullScanStartTime) { 'Full scan finished.' } else { 'The scan has been started and is still running in the background.' }; ''; 'Open Windows Security to see anything it found.'"Tells Microsoft Defender to clean up every threat it has flagged.
Show the command
PowerShell "Remove-MpThreat -ErrorAction SilentlyContinue | Out-Null; 'Microsoft Defender has been asked to clean up everything it has flagged.'; ''; 'Defender does not report a removal count, so open Windows Security to see exactly what it found and what it did with it.'"
Switches on always-on virus protection, then confirms it actually came on.
Show the command
PowerShell "Set-MpPreference -DisableRealtimeMonitoring $false -ErrorAction SilentlyContinue; Start-Sleep -Milliseconds 800; try { $s = Get-MpComputerStatus -ErrorAction Stop } catch { 'Could not read the protection status afterwards.'; exit 1 }; if ($s.RealTimeProtectionEnabled) { 'Real-time protection is on. Windows is watching for threats as they appear.' } elseif ($s.IsTamperProtected) { 'Could not switch real-time protection on, because Tamper Protection is blocking changes to Defender. Turn Tamper Protection off in Windows Security first, then run this again.'; exit 1 } else { 'Could not switch real-time protection on. Another antivirus program may be in charge of this PC.'; exit 1 }"Switches the Windows firewall on for every network type.
Show the command
PowerShell "netsh advfirewall set allprofiles state on | Out-Null; try { $p = Get-NetFirewallProfile -ErrorAction Stop } catch { 'Firewall switched on, but the result could not be confirmed.'; exit 0 }; $off = @($p | Where-Object { -not $_.Enabled }); if ($off.Count -eq 0) { 'The Windows firewall is on for all network types - home, work and public.' } else { 'The firewall is still off for: ' + (($off | ForEach-Object { $_.Name }) -join ', '); exit 1 }"Runs a fast Microsoft Defender scan.
Show the command
PowerShell "Start-MpScan -ScanType QuickScan"
Says whether your drive is encrypted, so its files are unreadable if the PC is stolen.
Show the command
PowerShell "if (-not (Get-Command Get-BitLockerVolume -ErrorAction SilentlyContinue)) { 'BitLocker is not available on this edition of Windows - it needs Windows Pro or better. Windows Home has Device Encryption instead: check Settings, Privacy and security, Device encryption.'; exit 0 }; try { $v = @(Get-BitLockerVolume -ErrorAction Stop | Where-Object { $_.MountPoint }) } catch { 'Could not read the encryption status of this PC.'; exit 1 }; if ($v.Count -eq 0) { 'No drives reported an encryption status.'; exit 0 }; $sys = $v | Where-Object { $_.MountPoint -eq $env:SystemDrive } | Select-Object -First 1; if (-not $sys) { 'Could not find the status of your Windows drive.' } elseif ($sys.ProtectionStatus -eq 'On') { 'PROTECTED. Your Windows drive (' + $env:SystemDrive + ') is encrypted and locked. If this PC is lost or stolen, nothing on it can be read.' } elseif ([int]$sys.EncryptionPercentage -eq 100) { 'NOT PROTECTED. Your Windows drive (' + $env:SystemDrive + ') is fully encrypted, but its lock is switched off - the key is sitting unlocked on the drive, so the encryption is guarding nothing. Windows does this on purpose while it installs some updates, and normally re-locks at the next restart. If it stays like this, turn BitLocker back on from Manage BitLocker.' } else { 'NOT PROTECTED. Your Windows drive (' + $env:SystemDrive + ') is not encrypted. Anyone who takes the drive out of this PC can read every file on it.' }; ''; 'Drive by drive:'; ($v | ForEach-Object { [pscustomobject]@{ Drive = $_.MountPoint; Locked = $(if ($_.ProtectionStatus -eq 'On') { 'Yes' } else { 'No' }); Encrypted = [string]$_.EncryptionPercentage + [char]37 } } | Format-Table -AutoSize Drive, Locked, Encrypted | Out-String -Width 200).TrimEnd()"Blocks websites from sending pop-up notifications - the fake 'virus detected' alerts scammers use.
Show the command
PowerShell "$pol = @(@('HKLM:\SOFTWARE\Policies\Google\Chrome','DefaultNotificationsSetting','DWord',2), @('HKLM:\SOFTWARE\Policies\Google\Chrome\NotificationsBlockedForUrls','1','String','*'), @('HKLM:\SOFTWARE\Policies\Microsoft\Edge','DefaultNotificationsSetting','DWord',2), @('HKLM:\SOFTWARE\Policies\Microsoft\Edge\NotificationsBlockedForUrls','1','String','*'), @('HKLM:\SOFTWARE\Policies\Mozilla\Firefox\Permissions\Notifications','BlockNewRequests','DWord',1)); $fail = 0; foreach ($p in $pol) { try { if (-not (Test-Path $p[0])) { New-Item -Path $p[0] -Force -ErrorAction Stop | Out-Null }; New-ItemProperty -Path $p[0] -Name $p[1] -PropertyType $p[2] -Value $p[3] -Force -ErrorAction Stop | Out-Null } catch { $fail++ } }; if ($fail -eq $pol.Count) { 'Could not apply the block. This needs administrator rights.'; exit 1 }; $b = @(@('Microsoft Edge', ${env:ProgramFiles(x86)} + '\Microsoft\Edge\Application\msedge.exe', $env:ProgramFiles + '\Microsoft\Edge\Application\msedge.exe'), @('Google Chrome', $env:ProgramFiles + '\Google\Chrome\Application\chrome.exe', ${env:ProgramFiles(x86)} + '\Google\Chrome\Application\chrome.exe', $env:LOCALAPPDATA + '\Google\Chrome\Application\chrome.exe'), @('Mozilla Firefox', $env:ProgramFiles + '\Mozilla Firefox\firefox.exe', ${env:ProgramFiles(x86)} + '\Mozilla Firefox\firefox.exe')); $on = @(); $off = @(); foreach ($x in $b) { $found = $false; for ($i = 1; $i -lt $x.Count; $i++) { if (Test-Path $x[$i]) { $found = $true } }; if ($found) { $on += $x[0] } else { $off += $x[0] } }; if ($on.Count -eq 0) { 'Pop-up notifications are blocked, but none of the supported browsers are installed on this PC.'; exit 0 }; 'Websites can no longer ask to send pop-up notifications in:'; foreach ($n in $on) { ' - ' + $n }; if ($off.Count -gt 0) { ''; 'Also set for ' + ($off -join ' and ') + ', which is not installed here.' }; ''; 'This blocks the fake virus warnings scammers send this way. It also stops genuine sites asking, so notifications you did want will need this reversing.'"Guards folders against ransomware.
Show the command
PowerShell "Set-MpPreference -EnableControlledFolderAccess Enabled -ErrorAction SilentlyContinue; Start-Sleep -Milliseconds 800; try { $s = Get-MpPreference -ErrorAction Stop } catch { 'Could not confirm the setting.'; exit 1 }; if ([string]$s.EnableControlledFolderAccess -ne 'Enabled' -and [int]$s.EnableControlledFolderAccess -ne 1) { 'Could not switch ransomware protection on. Tamper Protection may be blocking changes to Defender.'; exit 1 }; 'Ransomware protection is on. Documents, Pictures and your other personal folders are now closed to programs Windows does not trust.'; ''; 'Expect a prompt the first time a program you do use tries to save there - allow it in Windows Security and it will not ask again.'"Shows any website redirections set on this PC, which is how some hijacks work.
Show the command
PowerShell "$f = Join-Path $env:WINDIR 'System32\drivers\etc\hosts'; if (-not (Test-Path $f)) { 'This PC has no hosts file, so nothing is redirecting websites.'; exit 0 }; $lines = @(Get-Content $f -ErrorAction SilentlyContinue | Where-Object { $_.Trim() -ne '' -and -not $_.Trim().StartsWith('#') } | Where-Object { ($_ -split '\s+' | Where-Object { $_ })[1] -notmatch '^localhost' }); if ($lines.Count -eq 0) { 'Your hosts file has no unusual entries. Nothing on this PC is redirecting websites.'; exit 0 }; 'Your hosts file redirects ' + $lines.Count + ' address(es):'; ''; $lines | ForEach-Object { ' ' + ($_.Trim() -replace '\s+', ' ') }; ''; 'An entry here sends a website somewhere other than its real address. Ad blockers and security software add them for good reasons, but anything you do not recognise is worth investigating.'"Network 10 fixes
Wi-Fi and internet problems.
Asks your router for a fresh network address. Your connection drops for a few seconds.
Show the command
PowerShell "ipconfig /release | Out-Null; ipconfig /renew | Out-Null; $all = @(Get-NetIPConfiguration | Where-Object { $_.NetAdapter.Status -eq 'Up' -and $_.IPv4Address }); $routed = @($all | Where-Object { $_.IPv4DefaultGateway }); if ($routed.Count -eq 0) { 'No working connection came back. Check the network cable, or that Wi-Fi is switched on.'; exit 1 }; $online = Test-Connection -ComputerName 1.1.1.1 -Count 1 -Quiet -ErrorAction SilentlyContinue; if ($online) { 'Reconnected, and the internet is reachable.' } else { 'Reconnected to your router, but the internet is not reachable. That usually points at the modem or your internet provider rather than this PC.' }; ''; $routed | ForEach-Object { [pscustomobject]@{ Connection = $_.InterfaceAlias; Address = $_.IPv4Address.IPAddress; Router = $_.IPv4DefaultGateway.NextHop } } | Format-Table -AutoSize Connection, Address, Router"Rates your Wi-Fi signal and shows the network, band and speed.
Show the command
PowerShell "$raw = netsh wlan show interfaces; if (($raw -join ' ') -match 'no wireless interface|not running') { 'This PC has no Wi-Fi adapter in use - it is either connected by cable, or has no wireless hardware.'; exit 0 }; $map = @{}; foreach ($line in $raw) { if ($line -match '^\s{2,}([^:]+?)\s*:\s*(.*)$') { $k = $matches[1].Trim(); $v = $matches[2].Trim(); if (-not $map.ContainsKey($k)) { $map[$k] = $v } } }; if ($map['State'] -and $map['State'] -notmatch 'connected') { 'Wi-Fi is switched on but not connected to a network.'; exit 0 }; if (-not $map['Signal']) { $raw; exit 0 }; $n = [int]($map['Signal'] -replace '[^0-9]',''); $verdict = if ($n -ge 75) { 'strong' } elseif ($n -ge 50) { 'good' } elseif ($n -ge 30) { 'weak - try moving closer to the router' } else { 'very weak - you are close to losing the connection' }; $out = @('Your Wi-Fi signal is ' + $verdict + ' (' + $n + [char]37 + ').', ''); $out += 'Network: ' + $map['SSID']; $out += 'Signal: ' + $n + [char]37; $b = $map['Band']; if ($b) { if ($map['Channel']) { $b = $b + ' (channel ' + $map['Channel'] + ')' }; $out += 'Band: ' + $b }; if ($map['Receive rate (Mbps)']) { $out += 'Speed: ' + $map['Receive rate (Mbps)'] + ' Mbps' }; $out"Checks whether the internet is reachable, how fast it responds, and whether website names resolve.
Show the command
PowerShell "$r = @(Test-Connection -ComputerName 8.8.8.8 -Count 4 -ErrorAction SilentlyContinue); $got = $r.Count; $dns = $false; try { Resolve-DnsName -Name microsoft.com -ErrorAction Stop | Out-Null; $dns = $true } catch { }; if ($got -eq 0) { 'Your PC cannot reach the internet at all. Check that Wi-Fi is on or the network cable is plugged in, then try Reconnect to the Internet.'; exit 1 }; $avg = [math]::Round(($r | Measure-Object ResponseTime -Average).Average); $lost = 4 - $got; if (-not $dns) { 'Your PC can reach the internet, but cannot look up website names. That is a DNS problem, which is why pages fail to load even though the connection works. Try Switch to Secure DNS.'; exit 1 }; if ($lost -gt 0) { 'Your internet is working, but ' + $lost + ' of 4 test messages went missing. Patchy connections like this cause video calls to freeze and pages to stall.' } elseif ($avg -gt 150) { 'Your internet is working, but slow to respond (' + $avg + ' ms). Calls and games may feel laggy.' } else { 'Your internet is working normally.' }; ''; 'Replies: ' + $got + ' of 4'; 'Response time: ' + $avg + ' ms'; 'Website names: ' + $(if ($dns) { 'resolving normally' } else { 'not resolving' })"Wipes stored DNS lookups so pages load from fresh addresses.
Show the command
ipconfig /flushdns
Resets Windows' network settings to default. Needs a restart afterwards.
Show the command
PowerShell "$a = netsh int ip reset 2>&1; $b = netsh winsock reset 2>&1; $txt = ($a + $b) -join ' '; if ($txt -match 'requires elevation|Access is denied') { 'Could not reset the network settings - this needs administrator rights.'; exit 1 }; 'Network settings have been reset to their Windows defaults.'; ''; 'This one needs a restart to take effect. Save your work and restart the PC.'"Clears any proxy server Windows was told to use, a common leftover from malware.
Show the command
PowerShell "netsh winhttp reset proxy | Out-Null; $s = netsh winhttp show proxy 2>&1; 'Proxy settings have been cleared - Windows will connect directly again.'; ''; 'This clears the system proxy. If a browser is still going through one, check its own settings too.'"
Clears custom or malware-blocked host entries.
Show the command
PowerShell "$f = Join-Path $env:WINDIR 'System32\drivers\etc\hosts'; $bak = $f + '.backup'; $had = 0; if (Test-Path $f) { $had = @(Get-Content $f -ErrorAction SilentlyContinue | Where-Object { $_.Trim() -ne '' -and -not $_.Trim().StartsWith('#') }).Count; try { Copy-Item $f $bak -Force -ErrorAction Stop } catch { 'Could not back up the current hosts file, so nothing was changed.'; exit 1 } }; $def = @('# Windows hosts file', '#', '# An entry here overrides the real address of a website.', '# Windows handles localhost itself and needs no entry for it.'); try { Set-Content -Path $f -Value $def -Encoding ASCII -Force -ErrorAction Stop } catch { 'Could not write the hosts file. Security software may be protecting it.'; exit 1 }; 'Hosts file reset. ' + $(if ($had -gt 0) { [string]$had + ' redirection(s) were removed.' } else { 'It had no redirections in it.' }); ''; 'The previous file was kept alongside it as hosts.backup, in case one of those entries was wanted.'"Resets the firewall to its Windows defaults, clearing any rules that were added.
Show the command
PowerShell "netsh advfirewall reset | Out-Null; Start-Sleep -Milliseconds 500; try { $p = Get-NetFirewallProfile -ErrorAction Stop } catch { 'Firewall reset, but the result could not be confirmed.'; exit 0 }; $off = @($p | Where-Object { -not $_.Enabled }); if ($off.Count -gt 0) { 'Firewall reset, but it is off for: ' + (($off | ForEach-Object { $_.Name }) -join ', '); exit 1 }; 'The firewall has been reset to its Windows defaults and is on for all network types.'; ''; 'Any rules you or your software added have been cleared, so a program may ask for network permission again.'"Shows the saved password for a Wi-Fi network this PC has connected to.
Show the command
PowerShell "$n = '{SSID}'; $out = netsh wlan show profile name=$n key=clear 2>&1; $line = $out | Where-Object { $_ -match 'Key Content' } | Select-Object -First 1; if (-not $line) { 'No saved password was found for ' + $n + '. Windows only keeps one for networks this PC has connected to, and open networks have none.'; exit 1 }; $key = ($line -split ':', 2)[1].Trim(); 'Network: ' + $n; 'Password: ' + $key; ''; 'Anyone with this password can join the network. Share it only with people you trust.'"Points this PC at Cloudflare's DNS, which is faster than most and can block malware.
Show the command
PowerShell "$ad = @(Get-NetAdapter -Physical | Where-Object Status -eq 'Up'); if ($ad.Count -eq 0) { 'No active network connection was found, so nothing was changed.'; exit 1 }; $ad | Set-DnsClientServerAddress {DNS} -ErrorAction SilentlyContinue; Start-Sleep -Milliseconds 500; $rows = $ad | ForEach-Object { $s = (Get-DnsClientServerAddress -InterfaceIndex $_.ifIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue).ServerAddresses; [pscustomobject]@{ Connection = $_.Name; 'DNS servers' = $(if ($s) { $s -join ', ' } else { 'from your router' }) } }; 'DNS settings applied to ' + $ad.Count + ' connection(s).'; ''; ($rows | Format-Table -AutoSize | Out-String -Width 200).TrimEnd(); ''; 'If pages still fail to load, run Clear Internet Address Cache so Windows stops using the old answers.'"One rule. If Check Disk Health or the Diagnose scan warns about your drive, stop. Back up first. No software fixes a failing drive.
Download freeBuy the license, $49
Fix list as of October 31, 2026. Updates add fixes over time.