#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Disk at 100% in Task Manager and the machine is unusable Fix : Name the process rather than guessing at it Source: https://jbtecwiz.com/support/win-hw-disk-100 Run as : Elevated PowerShell Expect : 25 minutes Risk : low Reversible : yes WHEN THIS IS THE RIGHT FIX The drive is healthy and a real transfer rate is showing. HOW TO UNDO IT The search index rebuilds itself; nothing else was changed permanently. 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 ' Disk at 100% in Task Manager and the machine is unusable' -ForegroundColor White Write-Host ' Name the process rather than guessing at it' -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 'Sort by actual disk bytes rather than trusting the Task Manager percentage.' -Command { Get-Process | Sort-Object -Property @{Expression={$_.ReadOperationCount + $_.WriteOperationCount}} -Descending | Select-Object -First 10 Name,Id,@{n='MB';e={[math]::Round(($_.WorkingSet64/1MB),0)}} } Invoke-Step -Number 2 -Do 'Use Resource Monitor''s Disk tab for the file-level view, which shows exactly which file is being hammered.' -Command { cmd.exe /c 'resmon.exe' } Invoke-Step -Number 3 -Do 'If it is SearchIndexer, rebuild the index rather than disabling search.' -Why 'A corrupt index makes the indexer restart the same crawl forever. Deleting the database forces a clean rebuild, which is heavy for a few hours and then quiet -- disabling the service instead breaks Outlook and Start menu search permanently.' -Command { Stop-Service WSearch -Force Remove-Item "$env:ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb" -Force -ErrorAction SilentlyContinue Start-Service WSearch } Invoke-Step -Number 4 -Do 'If it is MsMpEng, add the genuinely safe exclusions for the workload rather than turning Defender off, and check no second antivirus is installed alongside it.' -Manual Invoke-Step -Number 5 -Do 'If the machine has a mechanical drive, moving to an SSD is the fix. On a 5400rpm laptop drive, a modern Windows install is at its limit before any application starts.' -Manual Write-Rule " Confirm it worked" Show-Prose 'Disk active time falls below 20% at idle after the indexer finishes.' 'White' Write-Host '' if (-not $DryRun) { Get-Counter '\PhysicalDisk(_Total)\% Idle Time' -SampleInterval 2 -MaxSamples 5 } 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-disk-100' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: The search index rebuilds itself; nothing else was changed permanently.' 'DarkGray' Write-Rule