#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Outlook search returns nothing, or misses recent mail Fix : Check what the index is actually told to cover Source: https://jbtecwiz.com/support/win-office-outlook-search Run as : Indexing Options, as the affected user Expect : 20 minutes Risk : low Reversible : yes WHEN THIS IS THE RIGHT FIX Indexing runs but never completes, or search became unreliable as the mailbox grew. HOW TO UNDO IT Move the offline slider back if you changed it; mail is re-downloaded, which takes time but loses nothing. 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 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 ' Outlook search returns nothing, or misses recent mail' -ForegroundColor White Write-Host ' Check what the index is actually told to cover' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: low Reversible 20 minutes' 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 'Open Indexing Options and confirm Microsoft Outlook is ticked under Modify.' -Command { cmd.exe /c 'control srchadmin.dll' } Invoke-Step -Number 2 -Do 'Look at the item count on the Indexing Options window. If it is climbing, the index is working and simply has not caught up -- leave the machine on, plugged in and unlocked, and check again later.' -Why 'Indexing is throttled hard while a machine is on battery or under load. A laptop that is closed at five o''clock every day may never finish indexing a large mailbox, and no amount of rebuilding will change that.' -Manual Invoke-Step -Number 3 -Do 'Consider reducing how much mail is kept offline. File -> Account Settings -> Account Settings -> Change -> the Mail to keep offline slider. Twelve months indexes considerably faster than All.' -Manual Invoke-Step -Number 4 -Do 'Confirm the OST is not on a location the index skips -- a removable drive or a network path.' -Command { Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Outlook" -Filter *.ost | Select-Object FullName, @{n='GB';e={[math]::Round($_.Length/1GB,2)}} } Write-Rule " Confirm it worked" Show-Prose 'The item count in Indexing Options stops rising and Outlook reports indexing complete.' '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: Move the offline slider back if you changed it; mail is re-downloaded, which takes time but loses nothing.' 'DarkGray' Write-Rule