通过替换第一行来实现重启还原确实能更简洁。我们可以通过修改启动菜单的第一行默认启动项来实现这个功能。
核心思路是:
每次启动时,系统都会从当前配置的默认引导项(BCD菜单的第一个条目)启动
启动后,我们自动将默认引导项设置为另一个vhdx
重启后就会自动进入另一个vhdx,实现切换
以下是完整的实现方案:
方案概述
文件结构:
win11.vhdx (父vhdx,包含基础系统) win11_1.vhdx (子vhdx1,从win11.vhdx差分) win11_2.vhdx (子vhdx2,从win11.vhdx差分) switch_boot.bat (核心切换脚本)BCD引导条目:
添加两个引导条目,分别对应win11_1.vhdx和win11_2.vhdx
设置其中一个为默认启动项
批处理脚本:每次系统启动时运行,自动切换默认启动项到另一个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.exe2. 核心切换脚本 (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秒后重启以应用还原点"
endlocal3. 创建差分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.txt4. 简化版 - 基于"替换第一行"的实现
如果您希望更简洁,可以只通过修改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. 设置开机自动运行
将切换脚本添加到开机启动中:
方法一:添加到启动文件夹
按
Win+R输入shell:startup将switch_boot.bat的快捷方式放入启动文件夹
方法二:通过任务计划程序
schtasks /create /tn "切换启动VHDX" /tr "C:\path\to\switch_boot.bat" /sc onstart /ru SYSTEM /rl HIGHEST
工作流程
系统从win11_1.vhdx启动
启动时自动运行switch_boot.bat
脚本删除win11_2.vhdx并从父vhdx重新创建
设置BCD默认启动为win11_2.vhdx
用户使用系统
用户重启
系统从win11_2.vhdx启动(干净的)
启动时运行switch_boot.bat
脚本删除win11_1.vhdx并重新创建
设置BCD默认启动为win11_1.vhdx
循环...
注意事项
权限:需要以管理员身份运行
路径:所有路径需替换为实际路径
GUID:需要替换为实际的BCD条目GUID
测试:先在虚拟机中测试,确保不会破坏原系统
备份:重要数据仍需额外备份
这个方案实现了通过切换默认启动项来控制下次启动的vhdx,通过删除重建实现还原效果!