#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Office will not install or repair -- 30015, 30088, 30183, 30029-4, 1058-13 Fix : Resolve a 32-bit / 64-bit conflict Source: https://jbtecwiz.com/support/win-office-install-fail Run as : PowerShell as administrator Expect : 1 hour Risk : medium Reversible : NO -- read the undo note below before running WHEN THIS IS THE RIGHT FIX 30029-4, or setup says it cannot install this version because another is present. HOW TO UNDO IT None -- the old installation is removed. Check any critical add-in supports the architecture you are moving to before you start, because that is not reversible without another full cycle. 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 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 ' Office will not install or repair -- 30015, 30088, 30183, 30029-4, 1058-13' -ForegroundColor White Write-Host ' Resolve a 32-bit / 64-bit conflict' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium NOT REVERSIBLE 1 hour' -ForegroundColor Yellow Write-Host '' Show-Prose 'Undo: None -- the old installation is removed. Check any critical add-in supports the architecture you are moving to before you start, because that is not reversible without another full cycle.' 'Yellow' 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 'Find out which architecture is installed.' -Command { Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' | Select-Object Platform } Invoke-Step -Number 2 -Do 'Check for standalone Office products that install separately and pin the architecture -- Project, Visio and the Access Runtime are the usual ones.' -Why 'Every Click-to-Run product on a machine must be the same bit-ness. A 32-bit Visio installed years ago will block a 64-bit Office and the error names neither of them.' -Command { Get-Package -Provider Programs -ErrorAction SilentlyContinue | Where-Object Name -match 'Microsoft (Office|365|Project|Visio|Access)' | Select-Object Name, Version } Invoke-Step -Number 3 -Do 'Decide which architecture you actually want. 64-bit is the right default now; keep 32-bit only if a required add-in or an Access database with 32-bit ODBC dependencies forces it.' -Manual Invoke-Step -Number 4 -Do 'Remove everything Click-to-Run with the SaRA tool, then install every product again at the chosen architecture in one pass.' -Command { Start-Process 'https://aka.ms/SaRA-officeUninstallFromPC' } Write-Rule " Confirm it worked" Show-Prose 'Every Office product opens and reports the same architecture.' 'White' Write-Host '' if (-not $DryRun) { Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' | Select-Object Platform, ProductReleaseIds } 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-install-fail' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: None -- the old installation is removed. Check any critical add-in supports the architecture you are moving to before you start, because that is not reversible without another full cycle.' 'DarkGray' Write-Rule