#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : 0x8004010F and damaged Outlook data files Fix : Repair a PST safely Source: https://jbtecwiz.com/support/win-app-pst-corrupt Run as : The Inbox Repair Tool Expect : 1-4 hours Risk : high Reversible : yes WHEN THIS IS THE RIGHT FIX It is a PST. This is the only copy of that mail -- copy it before doing anything. HOW TO UNDO IT Restore the copy made in step one. 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 ' 0x8004010F and damaged Outlook data files' -ForegroundColor White Write-Host ' Repair a PST safely' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: high Reversible 1-4 hours' 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 'Close Outlook and copy the PST somewhere else. This copy is the safety net for everything that follows.' -Command { Copy-Item 'C:\Users\me\Documents\Outlook Files\archive.pst' 'D:\backup\archive-copy.pst' } Invoke-Step -Number 2 -Do 'Find the repair tool. It ships with Office and is not on the Start menu.' -Command { Get-ChildItem 'C:\Program Files\Microsoft Office' -Recurse -Filter SCANPST.EXE -ErrorAction SilentlyContinue | Select-Object -First 1 FullName } Invoke-Step -Number 3 -Do 'Run SCANPST.EXE against the file, let it make its own backup when offered, and run it repeatedly until it reports no errors -- one pass is frequently not enough.' -Why 'The tool fixes what it can see in a single pass and often uncovers more damage underneath. Three or four passes on a badly damaged file is normal, and stopping after one leaves it broken.' -Manual Invoke-Step -Number 4 -Do 'If a PST is over about 20GB, or lives on a network share or a synced folder such as OneDrive, that is the cause and it will recur. Move it to a local disk.' -Why 'Outlook data files are not supported on network shares or sync folders. The access pattern is incompatible with them and corruption is the normal outcome, not bad luck.' -Manual Invoke-Step -Number 5 -Do 'If the repair cannot complete, a commercial PST recovery tool run against the copy is the next step.' -Manual Write-Rule " Confirm it worked" Show-Prose 'The file opens in Outlook, the folder tree is intact, and old items open correctly -- check several from different years.' '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-app-pst-corrupt' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Restore the copy made in step one.' 'DarkGray' Write-Rule