Add an update to Windows RE (2024)

  • Article

You can apply an update, either an LCU or Safe OS Dynamic Update (DU) to a Windows RE image. The steps to update a Windows RE image are different depending on whether you're updating an offline image, or an image on a running system.

  • When adding an LCU: Both prior to adding an update, and also after you've added an update, check the WinRE version number to make sure that the update was applied properly.
  • When adding a DU package: After you've added the package, check the list of packages in the image to ensure the package was successfully added to the image.

Update an offline image

The steps below cover how to add an updated package to an offline Windows RE image.

Mount your Windows image

The Windows RE image (winre.wim) is included inside the Windows image (install.wim) and is eventually copied to the Windows RE tools partition on the destination PC or device. To modify the WinRE image, you have to first mount the Windows image, then mount the Windows RE image. After both images are mounted, you can make your changes, unmount the WinRE image, then unmount the Windows image.

  • Create a mount directory and mount install.wim:

    md C:\mount\windowsDism /Mount-Wim /WimFile:C:\images\install.wim /index:1 /MountDir:C:\mount\windows 

Mount your WinRE image

  • Mount the Windows RE Image file from your mounted image.

    Md c:\mount\winre Dism /Mount-Wim /WimFile:C:\mount\windows\Windows\System32\Recovery\winre.wim /index:1 /MountDir:C:\mount\winre 

    Tip

    If winre.wim cannot be seen under the specified directory, use the following command to set the file visible:

    attrib -h -a -s C:\mount\windows\Windows\System32\Recovery\winre.wim

Add Update package to WinRE

With your recovery image mounted, you can add the update to fix the issue.

  1. Download the required update package and add it to your recovery image.

    Dism /Add-Package /Image:C:\mount\winre /PackagePath:"c:\downloadedupdate\update.msu" 

    or

    Dism /Add-Package /Image:C:\mount\ /PackagePath:"c:\downloadedupdate\dynamicupdate.cab" 
  2. If you added a Dynamic Update package, validate that the package you added is in your image:

     Dism /Image:C:\mount\ /Get-Packages

    Check the list for the update package you just added. The package should include the KB number, and will show the State as Installed if it's been successfully added:

    Package Identity : Package_for_KB5021041~31bf3856ad364e35~amd64~~22621.815.1.0State : InstalledRelease Type : Update
  3. Clean up your recovery image and reset the base of any superseded components:

    dism /image:C:\mount /cleanup-image /StartComponentCleanup /ResetBase 

Unmount your images

  1. Close all applications that might be accessing files from the image, including File Explorer.

  2. Commit the changes and unmount the Windows RE image:

    Dism /Unmount-Image /MountDir:"C:\mount\winre" /Commit 

    This process can take a few minutes.

  3. Commit the changes and unmount the Windows image:

    Dism /Unmount-Image /MountDir:"C:\mount\windows" /Commit 

    Where C is the drive letter of the drive that contains the image. This process may take several minutes.

The Windows RE image is now updated and part of the larger Windows image.

Apply the update to a running PC

You can apply the fix to the Windows Recovery image on a running PC. The following steps walk you through mounting a Windows Recovery image, applying an update to it, and then saving the changes:

  1. Open a Command Prompt as administrator.

  2. Create a directory where you can mount the recovery image to make changes to it.

    md c:\mount 
  3. Mount your recovery image with REAgentC:

    ReAgentC.exe /mountre /path c:\mount 
  4. With your recovery image mounted, you can download and add the update package to the Windows RE image.

    Dism /Add-Package /Image:C:\mount\ /PackagePath:"c:\downloadedupdate\update.msu" 

    or

    Dism /Add-Package /Image:C:\mount\ /PackagePath:"c:\downloadedupdate\dynamicupdate.cab" 
  5. If you added a Dynamic Update package, validate that the package you added is in your image:

     Dism /Image:C:\mount\ /Get-Packages

    Check the list for the update package you just added. The package should include the KB number, and will show the State as Installed if it's been successfully added:

    Package Identity : Package_for_KB5021041~31bf3856ad364e35~amd64~~22621.815.1.0State : InstalledRelease Type : Update
  6. Clean up your recovery image and reset the base of any superseded components:

    dism /image:C:\mount /cleanup-image /StartComponentCleanup /ResetBase 
  7. Unmount the Windows recovery image:

    ReAgentC.exe /unmountre /path c:\mount /commit 
  8. If the PC's disk is protected by BitLocker or Device Encryption: Use ReagentC to disable and then re-enable Windows RE. This ensures that the updated Windows RE image is turned on and correctly configured for your Windows installation:

    reagentc /disablereagentc /enable 

The Windows RE image on the running PC is now updated.

Check the WinRE image version

You can check the WinRE image's version number on both online and offline Windows installations. This can be helpful for checking the WinRE version prior to adding an update, and then after applying an update to verify that the update was successfully added.

Note

The WinRE version number will only change after you add an LCU. If you add a DU package, use DISM /get-packages as described in the steps above to ensure that the package has been added to the image.

Validate the Windows RE version in an Online Windows OS

  1. Use ReagentC to find the location of the installed WinRE image by running the following command:

    reagentc /info

    This command returns the Windows RE location that resembles the following example:

    \\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE
  2. Use DISM to get version information about the winre.wim image located in the path returned by ReagentC in the previous step. Make sure to add the WinRE image name and image index number to the path when you run the command:

    Dism /Get-ImageInfo /ImageFile:\\?\GLOBALROOT\device\harddisk0\partition4\Recovery\WindowsRE\winre.wim /index:1

    Notice the reported version. For example:

    Version : 10.0.22621ServicePack Build : 1ServicePack Level : 0

    Make sure that the ServicePackBuild is greater than or equal to the UBR for the update that you added. For example, for Windows 11, version 22H2, the November security update would show 819 as the SerivcePack Build, since full version number for that update is 22621.819.

    • If the version reported is an earlier version, this indicates the Windows RE image is not up to date.
    • If the reported version is the same or a later version, no action is needed.

Validate the Windows RE version in an Offline Windows OS

  1. Mount the Windows image to a local folder, for example C:\mount\windows:

    mkdir C:\mount\windowsDism /Mount-Image /ImageFile:C:\mount\install.wim /Index:1 /MountDir:C:\mount\windows
  2. Use DISM to get version information about the winre.wim image located in the Windows\system32\recovery folder. Make sure to specify the image's index number when you run the command:

    Dism /Get-ImageInfo /ImageFile:c:\mount\windows\windows\system32\recovery\winre.wim /index:1

    Notice the reported version. For example:

    Version : 10.0.22621ServicePack Build : 1ServicePack Level : 0

    Make sure that the ServicePackBuild is greater than or equal to the UBR for the update that you added. For example, for Windows 11, version 22H2, the November security update would show 819 as the SerivcePack Build, since full version number for that update is 22621.819.

    • If the reported version is an earlier version, this indicates the Windows RE image is not up to date.
    • If the reported version is the same or a later version, no action is needed.

Extend the Windows RE Partition

The sample script below can be used to increase the size of recovery partition to successfully update Windows Recovery Environment (WinRE). It is recommended to have 250MB of free space in the recovery partition for WinRE updates to install successfully. On devices that may not have adequate free space in the recovery partition, the sample script below can be used to extend the recovery partition by 250 MB.

Reboot your machine before you run the script. This is critical as there may be pending partition operations staged on your machine that will need to be finalized before the script can safely increase the WinRE partition size. After your machine reboots open Powershell as admin and run mkdir <path to new backup directory> to create a backup directory that the script may use in case of failure to restore the original partition. Note the location of this backup directory as the script will ask for your backup path.If you are deploying this at scale, you can bypass the script prompting by using the parameters

" -SkipConfirmation $true -BackupFolder "

For example,

Resize_script.ps1 -SkipConfirmation $true -BackupFolder c:\winre_backup

Param ([Parameter(Mandatory=$false,HelpMessage="Skip confirmation")][bool]$SkipConfirmation=$false,[Parameter(Mandatory=$true,HelpMessage="Path to backup old WinRE partition content to")][string]$BackupFolder)# ------------------------------------# Helper functions# ------------------------------------# Log messagefunction LogMessage([string]$message){$message = "$message"Write-Host $message}# Extract numbers from stringfunction ExtractNumbers([string]$str){$cleanString = $str -replace "[^0-9]"return [long]$cleanString}# Display partition info using fsutil# Return an array, the first value is total size and the second value is free spacefunction DisplayPartitionInfo([string[]]$partitionPath){$volume = Get-WmiObject -Class Win32_Volume | Where-Object { $partitionPath -contains $_.DeviceID }LogMessage(" Partition capacity: " + $volume.Capacity)LogMessage(" Partition free space: " + $volume.FreeSpace)return $volume.Capacity, $volume.FreeSpace} # Display WinRE statusfunction DisplayWinREStatus(){# Get WinRE partition info$WinREInfo = Reagentc /infoforeach ($line in $WinREInfo){$params = $line.Split(':')if ($params.Count -lt 2){continue}if (($params[1].Trim() -ieq "Enabled") -Or (($params[1].Trim() -ieq "Disabled"))){$Status = $params[1].Trim() -ieq "Enabled"LogMessage($line.Trim())}if ($params[1].Trim() -like "\\?\GLOBALROOT*"){$Location = $params[1].Trim()LogMessage($line.Trim())}}return $Status, $Location}# ------------------------------------# Main execution# ------------------------------------# Clear the error$Error.Clear()# ------------------------------------# Examining the system to collect required info # for the execution# Need to check WinRE status, collect OS and WinRE# partition info# ------------------------------------LogMessage("Start time: $([DateTime]::Now)")LogMessage("Examining the system...")$NeedShrink = $true$NeedCreateNew = $false$NeedBackup = $false# Get WinRE partition info$InitialWinREStatus = DisplayWinREStatus$WinREStatus = $InitialWinREStatus[0]$WinRELocation = $InitialWinREStatus[1]if (!$WinREStatus){LogMessage("Error: WinRE Disabled")exit 1}# Get System directory and ReAgent xml file$system32Path = [System.Environment]::SystemDirectoryLogMessage("System directory: " + $system32Path)$ReAgentXmlPath = Join-Path -Path $system32Path -ChildPath "\Recovery\ReAgent.xml"LogMessage("ReAgent xml: " + $ReAgentXmlPath)if (!(Test-Path $ReAgentXmlPath)){LogMessage("Error: ReAgent.xml cannot be found")exit 1}# Get OS partitionLogMessage("")LogMessage("Collecting OS and WinRE partition info...")$OSDrive = $system32Path.Substring(0,1)$OSPartition = Get-Partition -DriveLetter $OSDrive# Get WinRE partition$WinRELocationItems = $WinRELocation.Split('\\')foreach ($item in $WinRELocationItems){ if ($item -like "harddisk*"){$OSDiskIndex = ExtractNumbers($item)}if ($item -like "partition*"){$WinREPartitionIndex = ExtractNumbers($item)}}LogMessage("OS Disk: " + $OSDiskIndex)LogMessage("OS Partition: " + $OSPartition.PartitionNumber)LogMessage("WinRE Partition: " + $WinREPartitionIndex)$WinREPartition = Get-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex$diskInfo = Get-Disk -number $OSDiskIndex$diskType = $diskInfo.PartitionStyleLogMessage("Disk PartitionStyle: " + $diskType)# Display WinRE partition size infoLogMessage("WinRE partition size info")$WinREPartitionSizeInfo = DisplayPartitionInfo($WinREPartition.AccessPaths)LogMessage("WinRE Partition Offset: " + $WinREPartition.Offset)LogMessage("WinRE Partition Type: " + $WinREPartition.Type)LogMessage("OS partition size: " + $OSPartition.Size)LogMessage("OS partition Offset: " + $OSPartition.Offset)$OSPartitionEnds = $OSPartition.Offset + $OSPartition.SizeLogMessage("OS partition ends at: " + $OSPartitionEnds)LogMessage("WinRE partition starts at: " + $WinREPartition.Offset)$WinREIsOnSystemPartition = $falseif ($diskType -ieq "MBR"){if ($WinREPartition.IsActive){LogMessage("WinRE is on System partition")$WinREIsOnSystemPartition = $true}}if ($diskType -ieq "GPT"){if ($WinREPartition.Type -ieq "System"){LogMessage("WinRE is on System partition")$WinREIsOnSystemPartition = $true}}# Checking the BackupFolder parameterif ($PSBoundParameters.ContainsKey('BackupFolder')){LogMessage("")LogMessage("Backup Directory: [" + $BackupFolder + "]")$Needbackup = $trueif ($WinREIsOnSystemPartition){$Needbackup = $falseLogMessage("WinRE is on System partition which will be preserved. No need to backup content")}else{if (Test-path $BackupFolder){$items = Get-ChildItem -Path $BackupFolderif ($items){LogMessage("Error: Existing backup directory is not empty")exit 1}}else{LogMessage("Creating backup directory...")try {$item = New-Item -Path $BackupFolder -ItemType Directory -ErrorAction Stopif ($item){LogMessage("Backup directory created")}else{LogMessage("Error: Failed to create backup directory [" + $BackupFolder + "]")exit 1}} catch {LogMessage("Error: An error occurred: $_")exit 1}}}}# ------------------------------------# Verify whether we meet requirements of execution# - WinRE cannot be on OS partition for the extension# - WinRE partition must be the next partition after OS partition# - If WinRE partition already have >=250MB free space, no need to do repartition# - If there is enough unallocated space to grow the WinRE partition size, skip shrinking OS# # However, if the WinRE partition is before the OS partition, there is no chance to extend it# As a result, it's better to create a new WinRE partition after the OS partition# ------------------------------------# Perform a few checksLogMessage("")LogMessage("Verifying if the WinRE partition needs to be extended or not...")if (!(($diskType -ieq "MBR") -Or ($diskType -ieq "GPT"))){LogMessage("Error: Got an unexpected disk partition style: " +$diskType)exit 1}# WinRE partition must be after OS partition for the repartitionif ($WinREPartitionIndex -eq $OSPartition.PartitionNumber){LogMessage("WinRE and OS are on the same partition, should not perform extension")exit 0}$supportedSize = Get-PartitionSupportedSize -DriveLetter $OSDrive# if there is enough free space, skip extensionif ($WinREPartitionSizeInfo[1] -ge 250MB){LogMessage("More than 250 MB of free space was detected in the WinRE partition, there is no need to extend the partition")exit 0}if ($WinREPartition.Offset -lt $OSPartitionEnds){LogMessage("WinRE partition is not after OS partition, cannot perform extension")LogMessage("Need to create a new WinRE partition after OS partition")$NeedCreateNew = $true$NeedShrink = $true# Calculate the size of repartition# Will create a new WinRE partition with current WinRE partition size + 250 MB# The OS partition size will be shrunk by the new WinRE partition size$targetWinREPartitionSize = $WinREPartitionSizeInfo[0] + 250MB$shrinkSize = [Math]::Ceiling($targetWinREPartitionSize / 1MB) * 1MB$targetOSPartitionSize = $OSPartition.Size - $shrinkSizeif ($targetOSPartitionSize -lt $supportedSize.SizeMin){LogMessage("Error: The target OS partition size after shrinking is smaller than the supported minimum size, cannot perform the repartition")exit 1}}else{if ($WinREIsOnSystemPartition){LogMessage("WinRE parititon is after the OS partition and it's also System partition")LogMessage("Error: Got unexpected disk layout, cannot proceed")exit 1}if (!($WinREPartitionIndex -eq ($OSPartition.PartitionNumber + 1))){LogMessage("Error: WinRE partition is not right after the OS partition, cannot extend WinRE partition")exit 1}# Calculate the size of repartition# Will shrink OS partitition by 250 MB$shrinkSize = 250MB$targetOSPartitionSize = $OSPartition.Size - $shrinkSize$targetWinREPartitionSize = $WinREPartitionSizeInfo[0] + 250MB$UnallocatedSpace = $WinREPartition.Offset - $OSPartitionEnds;# If there is unallocated space, consider using itif ($UnallocatedSpace -ge 250MB){$UnallocatedSpace = $WinREPartition.Offset - $OSPartitionEnds;LogMessage("Found unallocated space between OS and WinRE partition: " + $UnallocatedSpace)LogMessage("There is already enough space to extend WinRE partition without shrinking the OS partition")$NeedShrink = $false$targetOSPartitionSize = 0}else{$shrinkSize = [Math]::Ceiling((250MB - $UnallocatedSpace)/ 1MB) * 1MBif ($shrinkSize > 250MB){$shrinkSize = 250MB}$targetOSPartitionSize = $OSPartition.Size - $shrinkSizeif ($targetOSPartitionSize -lt $supportedSize.SizeMin){LogMessage("Error: The target OS partition size after shrinking is smaller than the supported minimum size, cannot perform the repartition")exit 1}}}# ------------------------------------# Report execution plan and ask for user confirmation to continue# ------------------------------------# Report the changes planned to be executed, waiting for user confirmationLogMessage("")LogMessage("Summary of proposed changes")if ($NeedCreateNew){LogMessage("Note: WinRE partition is before OS partition, need to create a new WinRE partition after OS partition")LogMessage("Will shrink OS partition by " + $shrinkSize)LogMessage(" Current OS partition size: " + $OSPartition.Size)LogMessage(" Target OS partition size after shrinking: " + $targetOSPartitionSize)LogMessage("New WinRE partition will be created with size: ", $targetWinREPartitionSize)if ($WinREIsOnSystemPartition){LogMessage("Existing WinRE partition is also system partition, it will be preserved")}else{LogMessage("Existing WinRE partition will be deleted")LogMessage(" WinRE partition: Disk [" + $OSDiskIndex + "] Partition [" + $WinREPartitionIndex + "]")LogMessage(" Current WinRE partition size: " + $WinREPartitionSizeInfo[0])}}else{if ($NeedShrink){LogMessage("Will shrink OS partition by " + $shrinkSize)LogMessage(" Current OS partition size: " + $OSPartition.Size)LogMessage(" Target OS partition size after shrinking: " + $targetOSPartitionSize)if ($UnallocatedSpace -ge 0){LogMessage("Unallocated space between OS and WinRE partition that will be used towards the new WinRE partition: " + $UnallocatedSpace)}}else{LogMessage("Will use 250MB from unallocated space between OS and WinRE partition")}LogMessage("Will extend WinRE partition size by 250MB")LogMessage(" WinRE partition: Disk [" + $OSDiskIndex + "] Partition [" + $WinREPartitionIndex + "]")LogMessage(" Current WinRE partition size: " + $WinREPartitionSizeInfo[0])LogMessage(" New WinRE partition size: " + $targetWinREPartitionSize)LogMessage("WinRE will be temporarily disabled before extending the WinRE partition and enabled automatically in the end")if ($UnallocatedSpace -ge 100MB){LogMessage("Warning: More than 100MB of unallocated space was detected between the OS and WinRE partitions")LogMessage("Would you like to proceed by using the unallocated space between the OS and the WinRE partitions?")}}if ($Needbackup){LogMessage("")LogMessage("The contents of the old WinRE partition will be backed up to [" + $BackupFolder + "]")}LogMessage("")LogMessage("Please reboot the device before running this script to ensure any pending partition actions are finalized")LogMessage("")if ($SkipConfirmation){LogMessage("User chose to skip confirmation")LogMessage("Proceeding with changes...")}else{$userInput = Read-Host -Prompt "Would you like to proceed? Y for Yes and N for No"if ($userInput -ieq "Y"){LogMessage("Proceeding with changes...")}elseif ($userInput -ieq "N"){LogMessage("Canceling based on user request, no changes were made to the system")exit 0}else{LogMessage("Error: Unexpected user input: [" + $userInput + "]") exit 0}}LogMessage("")LogMessage("Note: To prevent unexpected results, please do not interrupt the execution or restart your system")# ------------------------------------# Do the actual execution# The main flow is:# 1. Check whether ReAgent.xml has stage location and clear it for repartiion# 2. Disable WinRE as WinRE partition will be deleted# 3. Perform the repartition to create a larger WinRE partition# 4. Re-enable WinRE# ------------------------------------LogMessage("")# Load ReAgent.xml to clear Stage locationLogMessage("Loading [" + $ReAgentXmlPath + "] ...")$xml = [xml](Get-Content -Path $ReAgentXmlPath)$node = $xml.WindowsRE.ImageLocationif (($node.path -eq "") -And ($node.guid -eq "{00000000-0000-0000-0000-000000000000}") -And ($node.offset -eq "0") -And ($node.id -eq "0")){LogMessage("Stage location info is empty")}else{LogMessage("Clearing stage location info...")$node.path = ""$node.offset = "0"$node.guid= "{00000000-0000-0000-0000-000000000000}"$node.id="0"# Save the changeLogMessage("Saving changes to [" + $ReAgentXmlPath + "]...")$xml.Save($ReAgentXmlPath)}# Disable WinRELogMessage("Disabling WinRE...")reagentc /disableif (!($LASTEXITCODE -eq 0)){LogMessage("Warning: encountered an error when disabling WinRE: " + $LASTEXITCODE)exit $LASTEXITCODE}# Verify WinRE is under C:\Windows\System32\Recovery\WinRE.wim$disableWinREPath = Join-Path -Path $system32Path -ChildPath "\Recovery\WinRE.wim"LogMessage("Verifying that WinRE wim exists in downlevel at default location")if (!(Test-Path $disableWinREPath)){LogMessage("Error: Cannot find " + $disableWinREPath)# Re-enable WinRELogMessage("Re-enabling WinRE on error...")reagentc /enableif (!($LASTEXITCODE -eq 0)){LogMessage("Warning: encountered an error when enabling WinRE: " + $LASTEXITCODE)}exit 1}# ------------------------------------# Perform the repartition# 1. Resize the OS partition# 2. Delete the WinRE partition# 3. Create a new WinRE partition# ------------------------------------LogMessage("Performing repartition to extend the WinRE partition ...")# 1. Resize the OS partitionif ($NeedShrink){LogMessage("Shrinking the OS partition to create a larger WinRE partition")LogMessage("Resizing the OS partition to: [" + $targetOSPartitionSize + "]...")Resize-Partition -DriveLetter $OSDrive -Size $targetOSPartitionSizeif ($Error.Count -gt 0) {LogMessage("Error: Resize-Partition encountered errors: " + $Error[0].Exception.Message)# Re-enable WinRELogMessage("Re-enabling WinRE on error...")reagentc /enableif (!($LASTEXITCODE -eq 0)){LogMessage("Warning: encountered an error when enabling WinRE: " + $LASTEXITCODE)}exit 1}$OSPartitionAfterShrink = Get-Partition -DriveLetter $OSDriveLogMessage("Target partition size: " + $targetOSPartitionSize)LogMessage("Size of OS partition after shrinking: " + $OSPartitionAfterShrink.Size)}# 2. Delete the WinRE partitionLogMessage("")if ($WinREIsOnSystemPartition){LogMessage("Existing WinRE partition is System partition, skipping deletion")}else{# If requested by user, backup rest of the content on WinRE partition to backup directoryif ($Needbackup){$sourcePath = $WinREPartition.AccessPaths[0] LogMessage("Copying content on WinRE partition from [" + $sourcePath + "] to [" + $BackupFolder + "]...")# Copy-Item may have access issue with certain system folders, enumerate the children items and exlcude them$items = Get-ChildItem -LiteralPath $sourcePath -Forceforeach ($item in $items){if ($item.Name -ieq "System Volume Information"){continue}$sourceItemPath = Join-Path -Path $sourcePath -ChildPath $item.Name$destItemPath = Join-Path -Path $BackupFolder -ChildPath $item.Nametry {LogMessage("Copying [" + $sourceItemPath + "] to [" + $destItemPath + "]...")Copy-Item -LiteralPath $sourceItemPath -Destination $destItemPath -Recurse -Force} catch {LogMessage("Error: An error occurred during copy: $_")exit 1}}LogMessage("Backup completed")LogMessage("")}LogMessage("Deleting WinRE partition: Disk [" + $OSDiskIndex + "] Partition [" + $WinREPartitionIndex + "]...")Remove-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex -Confirm:$falseif ($Error.Count -gt 0) {LogMessage("Error: Remove-Partition encountered errors: " + $Error[0].Exception.Message)exit 1}}# A short sleep for the partition changeSleep 5# 3. Create a new WinRE partitionLogMessage("")LogMessage("Creating new WinRE partition...")LogMessage("Target size: " + $targetWinREPartitionSize)if ($diskType -ieq "GPT"){$partition = New-Partition -DiskNumber $OSDiskIndex -Size $targetWinREPartitionSize -GptType "{de94bba4-06d1-4d40-a16a-bfd50179d6ac}"$newPartitionIndex = $partition.PartitionNumber# A short sleep to make sure the partition is ready for formattingSleep 2LogMessage("Formating the partition...")$result = Format-Volume -Partition $partition -FileSystem NTFS -Confirm:$falseif ($Error.Count -gt 0) {LogMessage("Error: Format-Volume encountered errors: " + $Error[0].Exception.Message)exit 1}}else{#$partition = New-Partition -DiskNumber $OSDiskIndex -Size $targetWinREPartitionSize -MbrType 0x27$targetWinREPartitionSizeInMb = [int]($targetWinREPartitionSize/1MB)$diskpartScript = @"select disk $OSDiskIndexcreate partition primary size=$targetWinREPartitionSizeInMb id=27format quick fs=ntfs label="Recovery"set id=27"@$TempPath = $env:Temp$diskpartSciptFile = Join-Path -Path $TempPath -ChildPath "\ExtendWinRE_MBR_PowershellScript.txt"LogMessage("Creating temporary diskpart script to create Recovery partition on MBR disk...")LogMessage("Temporary diskpart script file: " + $diskpartSciptFile)$diskpartScript | Out-File -FilePath $diskpartSciptFile -Encoding asciiLogMessage("Executing diskpart script...")try {$diskpartOutput = diskpart /s $diskpartSciptFileif ($diskpartOutput -match "DiskPart successfully") {LogMessage("Diskpart script executed successfully")}else{LogMessage("Error executing diskpart script:" + $diskpartOutput)exit 1}LogMessage("Deleting temporary diskpart script file...")Remove-Item $diskpartSciptFile}catch {LogMessage("Error executing diskpart script: $_")exit 1}$vol = Get-Volume -FileSystemLabel "Recovery"$newPartitionIndex = (Get-Partition | Where-Object { $_.AccessPaths -contains $vol.Path } ).PartitionNumber}if ($Error.Count -gt 0) {LogMessage("Error: New-Partition encountered errors: " + $Error[0].Exception.Message)exit 1}LogMessage("New Partition index: " + $newPartitionIndex)# Re-enable WinRELogMessage("Re-enabling WinRE...")reagentc /enableif (!($LASTEXITCODE -eq 0)){LogMessage("Warning: encountered an error when enabling WinRE: " + $LASTEXITCODE)exit $LASTEXITCODE}# In the end, Display WinRE status to verify WinRE is enabled correctlyLogMessage("")LogMessage("WinRE Information:")$FinalWinREStatus = DisplayWinREStatus$WinREStatus = $FinalWinREStatus[0]$WinRELocation = $FinalWinREStatus[1]if (!$WinREStatus){LogMessage("Warning: WinRE Disabled")}$WinRELocationItems = $WinRELocation.Split('\\')foreach ($item in $WinRELocationItems){if ($item -like "partition*"){$WinREPartitionIndex = ExtractNumbers($item)}}LogMessage("WinRE Partition Index: " + $WinREPartitionIndex)$WinREPartition = Get-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex$WinREPartitionSizeInfoAfter = DisplayPartitionInfo($WinREPartition.AccessPaths)LogMessage("")LogMessage("OS Information:")$OSPartition = Get-Partition -DriveLetter $OSDriveLogMessage("OS partition size: " + $OSPartition.Size)LogMessage("OS partition Offset: " + $OSPartition.Offset)if (!($WinREPartitionIndex -eq $newPartitionIndex)){LogMessage("Warning: WinRE is installed to partition [" + $WinREPartitionIndex +"], but the newly created Recovery partition is [" + $newPartitionIndex + "]")}LogMessage("End time: $([DateTime]::Now)")if ($NeedBackup){LogMessage("")LogMessage("The contents of the old WinRE partition has been backed up to [" + $BackupFolder + "]")}LogMessage("")LogMessage("Successfully completed the operation")
Add an update to Windows RE (2024)

References

Top Articles
Latest Posts
Article information

Author: Annamae Dooley

Last Updated:

Views: 5948

Rating: 4.4 / 5 (65 voted)

Reviews: 80% of readers found this page helpful

Author information

Name: Annamae Dooley

Birthday: 2001-07-26

Address: 9687 Tambra Meadow, Bradleyhaven, TN 53219

Phone: +9316045904039

Job: Future Coordinator

Hobby: Archery, Couponing, Poi, Kite flying, Knitting, Rappelling, Baseball

Introduction: My name is Annamae Dooley, I am a witty, quaint, lovely, clever, rich, sparkling, powerful person who loves writing and wants to share my knowledge and understanding with you.