|
本帖最后由 D_M_GuYing 于 2025-10-11 20:55 编辑
调整了操作顺序:先完成差分文件的创建,确认成功后再修改启动引导配置。这样可以避免在差分文件创建失败的情况下错误修改引导配置
链接: https://yun.139.com/shareweb/#/w/i/2qidDZNHuCya1
提取码:w3kj
前题:你要做好了VHD系统到最佳状态,到PE创建了差分,修改启动项用差分启动系统。例如:
父文件:D:\SYS\25H2.VHDX
差分文件:D:\SYS\A.VHDX
执行后,会自动搜索.CMD文件夹下A.VHDX和B.VHDX执行删除操作,如果你的启动项是A.VHDX,因为正在使用中,所以是删除不掉的。然后.CMD建立一个新的差分文件B.VHDX,修改启动项的设备文件为B.VHDX,反之亦然。
就这吗简单!
复制代码,另存为.CMD,放到你的VHDX所在文件夹,修改你的变量
:: 差分子文件变量
set "VHD1=A.vhdx"
set "VHD2=B.vhdx"
:: 父文件变量
set "BASE_VHD=25H2.VHDX"
可删除最后的那个暂停代码pause,创建计划任务,每次系统启动时,执行.cmd。这样就不会每次手动了。--------------------------------------------------------------------------------------------------------------------------------------
@echo off
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion
cls
:: 差分子文件变量
set "VHD1=A.vhdx"
set "VHD2=B.vhdx"
:: 父文件变量
set "BASE_VHD=25H2.VHDX"
:: 强制删除A.vhdx和B.vhdx(无论是否存在)
echo 正在清理旧文件...
if exist "!VHD1!" (
del /f /q "!VHD1!" >nul 2>&1
if not exist "!VHD1!" (echo ✅ 已删除 !VHD1!) else (echo ⚠️ 无法删除 !VHD1!,可能被占用)
)
if exist "!VHD2!" (
del /f /q "!VHD2!" >nul 2>&1
if not exist "!VHD2!" (echo ✅ 已删除 !VHD2!) else (echo ⚠️ 无法删除 !VHD2!,可能被占用)
)
echo.
:: 1. 获取当前目录
pushd %~dp0 & cd /d "%~dp0"
set "CUR_DIR=%cd%"
echo Current folder: %CUR_DIR%
echo VHD files to switch: %VHD1% ↔ %VHD2%
:: 2. 提取盘符和路径
set "DRIVE=%CUR_DIR:~0,2%"
set "REL_PATH=%CUR_DIR:~2%"
:: 3. 自动搜索VHD启动项ID
echo.
echo 正在自动搜索VHD启动项ID...
set "VHDX_ID="
set "in_vhd_entry=0"
:: 遍历bcdedit输出,提取包含"vhd"的启动项ID
for /f "tokens=1,* delims=:" %%a in ('bcdedit /enum /v 2^>nul') do (
:: 清理行首空格和特殊字符
set "line=%%a%%b"
set "line=!line: =!"
:: 检测到标识符行,提取ID
if "!line:~0,10!"=="identifier" (
set "current_id=!line:identifier=!"
set "current_id=!current_id:{=!" :: 移除左大括号
set "current_id=!current_id:}=!" :: 移除右大括号
set "current_id=!current_id:"=!" :: 移除引号
set "in_vhd_entry=0" :: 重置标记
)
:: 检测到包含"vhd"的行,标记为VHD启动项
echo "!line!" | findstr /i "vhd" >nul 2>&1
if !errorlevel! equ 0 (
set "in_vhd_entry=1"
)
:: 若在VHD启动项中且已获取ID,则确定为目标ID
if !in_vhd_entry! equ 1 if defined current_id (
set "VHDX_ID={!current_id!}"
goto :found_vhd_id :: 找到后退出循环
)
)
:found_vhd_id
:: 验证ID是否存在
if "!VHDX_ID!"=="" (
echo ❌ 错误:未找到VHD类型的启动项,请检查系统配置
pause
exit /b 1
)
echo ✅ 找到VHD启动项ID:!VHDX_ID!
:: 4. 构建路径
set "SUFFIX_DEVICE=,locate=custom:12000002"
set "SUFFIX_OSDEVICE=,locate=custom:22000002"
set "VHD1_DEV=vhd=[%DRIVE%]%REL_PATH%\%VHD1%%SUFFIX_DEVICE%"
set "VHD1_OS=vhd=[%DRIVE%]%REL_PATH%\%VHD1%%SUFFIX_OSDEVICE%"
set "VHD2_DEV=vhd=[%DRIVE%]%REL_PATH%\%VHD2%%SUFFIX_DEVICE%"
set "VHD2_OS=vhd=[%DRIVE%]%REL_PATH%\%VHD2%%SUFFIX_OSDEVICE%"
:: 5. 检测文件存在性(清理后应该都不存在)
set "VHD1_EXIST=0"
set "VHD2_EXIST=0"
if exist "%CUR_DIR%\%VHD1%" set "VHD1_EXIST=1"
if exist "%CUR_DIR%\%VHD2%" set "VHD2_EXIST=1"
:: 6. 显示检测结果
echo.
echo ==============================================
echo File Detection:
if %VHD1_EXIST% equ 1 (echo ✅ %VHD1% exists) else (echo ❌ %VHD1% not found)
if %VHD2_EXIST% equ 1 (echo ✅ %VHD2% exists) else (echo ❌ %VHD2% not found)
echo ==============================================
:: 7. 确定目标差分文件
set "TARGET="
set "NEW_DEV="
set "NEW_OS="
if %VHD1_EXIST% equ 1 (
set "TARGET=%VHD2%"
set "NEW_DEV=%VHD2_DEV%"
set "NEW_OS=%VHD2_OS%"
) else if %VHD2_EXIST% equ 1 (
set "TARGET=%VHD1%"
set "NEW_DEV=%VHD1_DEV%"
set "NEW_OS=%VHD1_OS%"
) else (
:: 当A和B都不存在时,默认使用A.vhdx
set "TARGET=%VHD1%"
set "NEW_DEV=%VHD1_DEV%"
set "NEW_OS=%VHD1_OS%"
echo 提示:所有文件均不存在,默认切换目标为 %TARGET%
)
:: 8. 先执行差分文件创建任务
echo.
echo ==============================================
echo 子文件创建任务:
echo 母文件:%BASE_VHD%
echo 子文件:%TARGET%(与启动目标一致)
echo 目标路径:%CUR_DIR%
echo ==============================================
set "CREATE_SUCCESS=0"
:: 检查母文件是否存在
if not exist "%CUR_DIR%\%BASE_VHD%" (
echo ❌ 错误:母文件 %BASE_VHD% 未在 %CUR_DIR% 找到,无法创建子文件
) else (
echo ⚠️ 正在创建差分文件(需管理员权限)...
(
echo create vdisk file="%CUR_DIR%\%TARGET%" parent="%CUR_DIR%\%BASE_VHD%"
echo exit
) | diskpart
:: 验证差分文件创建结果
if exist "%CUR_DIR%\%TARGET%" (
echo ✅ 成功:差分文件 %TARGET% 已创建 → %CUR_DIR%\%TARGET%
set "CREATE_SUCCESS=1"
) else (
echo ❌ 失败:差分文件未创建,请检查权限和母文件完整性
)
)
echo ==============================================
:: 9. 只有差分文件创建成功后,才执行引导切换
if %CREATE_SUCCESS% equ 1 (
echo.
echo Auto-switching to %TARGET%...
bcdedit /enum %VHDX_ID% >nul 2>&1
timeout /t 1 /nobreak >nul
bcdedit /set %VHDX_ID% device "%NEW_DEV%" >nul
bcdedit /set %VHDX_ID% osdevice "%NEW_OS%" >nul
bcdedit /enum %VHDX_ID% >nul 2>&1
timeout /t 1 /nobreak >nul
:: 验证引导切换结果
set "FINAL_DEV="
for /f "tokens=2,*" %%a in ('bcdedit /enum %VHDX_ID% /v ^| findstr /i "device "') do set "FINAL_DEV=%%b"
echo.
echo ==============================================
echo Switch Completed! Target: %CUR_DIR%\%TARGET%
echo Final Path: %FINAL_DEV%
echo ==============================================
if "%FINAL_DEV%"=="%NEW_DEV%" (
echo ✅ Success: Path is correct
) else (
echo ⚠️ Success: Actual path set to %NEW_DEV%
)
) else (
echo.
echo ⚠️ 差分文件创建失败,未修改启动引导配置
)
echo.
echo 按任意键退出...
set /p=
endlocal
|
评分
-
查看全部评分
|