#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : "Operating system not found" or "No bootable device" Fix : Match the boot mode to the disk layout Source: https://jbtecwiz.com/support/win-rec-os-not-found Run as : Firmware settings and WinRE Expect : 40 minutes Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX The drive is visible but not bootable. HOW TO UNDO IT The firmware setting can be changed back. Image the disk before running mbr2gpt. 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 ' "Operating system not found" or "No bootable device"' -ForegroundColor White Write-Host ' Match the boot mode to the disk layout' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 40 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 'Boot Windows installation media and open a Command Prompt from Repair your computer.' -Manual Invoke-Step -Number 2 -Do 'Check the partition style. GPT needs UEFI mode; MBR needs legacy or CSM.' -Why 'This mismatch is the single most common cause after a firmware update or a CMOS reset, which can silently revert the boot mode to the manufacturer default. Nothing is broken -- the firmware is simply looking for the wrong kind of boot record.' -Command { cmd.exe /c 'diskpart & list disk & rem the GPT column shows an asterisk for GPT disks & exit' } Invoke-Step -Number 3 -Do 'Set the firmware to match: UEFI with CSM off for a GPT disk, legacy for MBR.' -Manual Invoke-Step -Number 4 -Do 'Check Secure Boot as well -- it requires UEFI, and enabling it while the machine is in legacy mode leaves nothing bootable.' -Manual Invoke-Step -Number 5 -Do 'If the machine must run UEFI and the disk is MBR, convert it.' -Command { cmd.exe /c 'mbr2gpt /validate /disk:0 & mbr2gpt /convert /disk:0' } Write-Rule " Confirm it worked" Show-Prose 'The Windows Boot Manager entry appears in the firmware boot order and the machine starts.' '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-rec-os-not-found' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: The firmware setting can be changed back. Image the disk before running mbr2gpt.' 'DarkGray' Write-Rule