#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Outlook search returns nothing, or misses recent mail Fix : Rebuild the index Source: https://jbtecwiz.com/support/win-office-outlook-search Run as : PowerShell as administrator, with the machine free for several hours Expect : 3 hours Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX The service is healthy, Outlook is included, and search is still wrong. Do this last -- a rebuild takes hours and everyone's search is degraded until it finishes. HOW TO UNDO IT None needed and none possible -- the index is derived data and is rebuilt from the mailbox and the file system. No mail is at risk at any point. 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. #> [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 # This fix is documented as needing an elevated session. $id = [Security.Principal.WindowsIdentity]::GetCurrent() if (-not (New-Object Security.Principal.WindowsPrincipal $id).IsInRole( [Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Host '' Write-Host ' This fix needs an elevated PowerShell.' -ForegroundColor Yellow Write-Host ' Close this window, right-click PowerShell, Run as administrator,' Write-Host ' and run the script again.' Write-Host '' exit 3 } 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 ' Outlook search returns nothing, or misses recent mail' -ForegroundColor White Write-Host ' Rebuild the index' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 3 hours' 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 'Warn the user first. Until the rebuild completes, search across the whole machine returns partial results, and that includes the Start menu.' -Manual Invoke-Step -Number 2 -Do 'Close Outlook.' -Command { Get-Process OUTLOOK -ErrorAction SilentlyContinue | Stop-Process -Force } Invoke-Step -Number 3 -Do 'Stop the service and remove the index database.' -Why 'Deleting Windows.edb is the same operation as the Rebuild button in Indexing Options, but it works when the button does nothing -- which is the usual state by the time you get here. The file is a cache and holds no original data.' -Command { Stop-Service WSearch Remove-Item "$env:ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb" -Force } Invoke-Step -Number 4 -Do 'Start the service and let it rebuild.' -Command { Start-Service WSearch } Invoke-Step -Number 5 -Do 'Leave the machine on, plugged in and signed in. Check progress by item count rather than by searching.' -Command { cmd.exe /c 'control srchadmin.dll' } Write-Rule " Confirm it worked" Show-Prose 'Indexing Options reports indexing complete, and a search in Outlook for a word from a recent message returns it.' 'White' 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-office-outlook-search' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: None needed and none possible -- the index is derived data and is rebuilt from the mailbox and the file system. No mail is at risk at any point.' 'DarkGray' Write-Rule