Administrator
发布于 2026-03-08 / 37 阅读
0

通过删除重建VHDX差分实现系统还原效果

通过替换第一行来实现重启还原确实能更简洁。我们可以通过修改启动菜单的第一行默认启动项来实现这个功能。

核心思路是:

  1. 每次启动时,系统都会从当前配置的默认引导项(BCD菜单的第一个条目)启动

  2. 启动后,我们自动将默认引导项设置为另一个vhdx

  3. 重启后就会自动进入另一个vhdx,实现切换

以下是完整的实现方案:

方案概述

  1. 文件结构

    win11.vhdx          (父vhdx,包含基础系统)
    win11_1.vhdx        (子vhdx1,从win11.vhdx差分)
    win11_2.vhdx        (子vhdx2,从win11.vhdx差分)
    switch_boot.bat     (核心切换脚本)
  2. BCD引导条目

    • 添加两个引导条目,分别对应win11_1.vhdx和win11_2.vhdx

    • 设置其中一个为默认启动项

  3. 批处理脚本:每次系统启动时运行,自动切换默认启动项到另一个vhdx

完整实现步骤

1. 创建BCD引导条目

以管理员身份运行CMD,为两个vhdx创建引导条目:

rem 为win11_1.vhdx创建引导条目
bcdedit /copy {current} /d "Windows 11 (VHDX 1)"
rem 记录返回的GUID,比如{xxxx-xxxx-xxxx-xxxx}
bcdedit /set {上面返回的GUID} device vhd=[C:]\path\to\win11_1.vhdx
bcdedit /set {GUID} osdevice vhd=[C:]\path\to\win11_1.vhdx
bcdedit /set {GUID} detecthal on
bcdedit /set {GUID} path \windows\system32\winload.exe

rem 为win11_2.vhdx创建引导条目
bcdedit /copy {current} /d "Windows 11 (VHDX 2)"
rem 记录返回的GUID
bcdedit /set {GUID} device vhd=[C:]\path\to\win11_2.vhdx
bcdedit /set {GUID} osdevice vhd=[C:]\path\to\win11_2.vhdx
bcdedit /set {GUID} detecthal on
bcdedit /set {GUID} path \windows\system32\winload.exe

2. 核心切换脚本 (switch_boot.bat)

这是一个通用脚本,可以放在两个vhdx系统中都运行:

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

rem 获取当前启动项的GUID
for /f "tokens=2 delims={}" %%a in ('bcdedit /enum ^| find "identifier" ^| find /v "{"') do (
    set "CURRENT_GUID={%%a}"
    goto :got_guid
)
:got_guid

rem 删除当前vhdx文件(如果是win11_1.vhdx,就删除并重建win11_2.vhdx,反之亦然)
if exist "C:\path\to\win11_1.vhdx" (
    set "DEL_FILE=win11_2.vhdx"
    set "NEW_DEFAULT=Windows 11 (VHDX 2)"
) else if exist "C:\path\to\win11_2.vhdx" (
    set "DEL_FILE=win11_1.vhdx"
    set "NEW_DEFAULT=Windows 11 (VHDX 1)"
) else (
    echo 错误:未找到当前vhdx文件
    pause
    exit /b 1
)

rem 删除另一个vhdx文件
echo 正在删除 %DEL_FILE%...
if exist "C:\path\to\%DEL_FILE%" (
    del /q "C:\path\to\%DEL_FILE%"
    echo 已删除 %DEL_FILE%
)

rem 重新创建差分vhdx(从父vhdx)
echo 正在重建 %DEL_FILE%...
diskpart /s "create_vhdx.txt"
echo 已重建 %DEL_FILE%

rem 查找新默认启动项的GUID
echo 正在设置默认启动项为: %NEW_DEFAULT%
for /f "tokens=2 delims={}" %%a in ('bcdedit /enum ^| find "%NEW_DEFAULT%" ^| find "identifier"') do (
    bcdedit /default {%%a}
    echo 已设置默认启动项
)

rem 创建自动关机重启任务(可选)
rem shutdown /r /t 60 /c "系统将在60秒后重启以应用还原点"
endlocal

3. 创建差分vhdx的diskpart脚本 (create_vhdx.txt)

rem 如果删除的是win11_2.vhdx,就重建win11_2.vhdx
create vdisk file="C:\path\to\win11_2.vhdx" parent="C:\path\to\win11.vhdx"

rem 如果删除的是win11_1.vhdx,就重建win11_1.vhdx
rem create vdisk file="C:\path\to\win11_1.vhdx" parent="C:\path\to\win11.vhdx"
exit

注意:create_vhdx.txt需要根据当前vhdx动态修改。可以在批处理中动态生成:

rem 动态生成diskpart脚本
if "%DEL_FILE%"=="win11_2.vhdx" (
    echo create vdisk file="C:\path\to\win11_2.vhdx" parent="C:\path\to\win11.vhdx" > create_vhdx.txt
) else (
    echo create vdisk file="C:\path\to\win11_1.vhdx" parent="C:\path\to\win11.vhdx" > create_vhdx.txt
)
echo exit >> create_vhdx.txt
diskpart /s create_vhdx.txt
del create_vhdx.txt

4. 简化版 - 基于"替换第一行"的实现

如果您希望更简洁,可以只通过修改BCD默认启动项来实现切换,而不删除重建vhdx文件:

@echo off
chcp 65001 >nul

rem 检查当前启动的系统描述
for /f "tokens=2" %%a in ('bcdedit /enum ^| find "description" ^| find /v "Windows Boot Manager"') do (
    echo 当前系统: %%a
    if "%%a"=="Windows 11 (VHDX 1)" (
        bcdedit /default {win11_2_guid}
        echo 下次将启动: Windows 11 (VHDX 2)
    ) else if "%%a"=="Windows 11 (VHDX 2)" (
        bcdedit /default {win11_1_guid}
        echo 下次将启动: Windows 11 (VHDX 1)
    )
)

5. 设置开机自动运行

将切换脚本添加到开机启动中:

  1. 方法一:添加到启动文件夹

    • Win+R输入 shell:startup

    • 将switch_boot.bat的快捷方式放入启动文件夹

  2. 方法二:通过任务计划程序

    schtasks /create /tn "切换启动VHDX" /tr "C:\path\to\switch_boot.bat" /sc onstart /ru SYSTEM /rl HIGHEST

工作流程

  1. 系统从win11_1.vhdx启动

  2. 启动时自动运行switch_boot.bat

  3. 脚本删除win11_2.vhdx并从父vhdx重新创建

  4. 设置BCD默认启动为win11_2.vhdx

  5. 用户使用系统

  6. 用户重启

  7. 系统从win11_2.vhdx启动(干净的)

  8. 启动时运行switch_boot.bat

  9. 脚本删除win11_1.vhdx并重新创建

  10. 设置BCD默认启动为win11_1.vhdx

  11. 循环...

注意事项

  1. 权限:需要以管理员身份运行

  2. 路径:所有路径需替换为实际路径

  3. GUID:需要替换为实际的BCD条目GUID

  4. 测试:先在虚拟机中测试,确保不会破坏原系统

  5. 备份:重要数据仍需额外备份

这个方案实现了通过切换默认启动项来控制下次启动的vhdx,通过删除重建实现还原效果!