找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 224|回复: 5

[分享] C盘热备份转VHDX批处理分享(适配ISCSI IPXE 解决7B蓝屏问题)

  [复制链接]
发表于 昨天 18:16 | 显示全部楼层 |阅读模式
用AI写的批处理脚本,配合imagew3.64(论坛有下载)快速将C盘热备份为VHDX,并可以将此VHDX设定为ISCSI,再让客户机IPXE引导 ,解决了无盘启动7B蓝屏问题。
此为https://bbs.wuyou.net/forum.php? ... 5291&extra=page%3D1配置辅助小工具
@echo off
setlocal enabledelayedexpansion
title BSCX实体机热备份VHDX制作工具
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B

:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
cd /d "%~dp0"
:: 同时处理 HKLM (所有用户) 和 HKCU (当前用户)隐藏AB盘
reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v "NoDrives" /t REG_DWORD /d 3 /f >nul
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v "NoDrives" /t REG_DWORD /d 3 /f >nul
:: ===== 增强 iSCSI 启动预处理 =====
echo
  • [0/5] 正在执行无盘启动预处理 (深度优化)...

    :: 1. 锁定核心网络栈与 iSCSI 驱动为 Boot
    sc config MSiSCSI start= boot >nul 2>&1
    net start MSiSCSI >nul 2>&1
    for %%S in (iscsiprt msiscsi ndis tcpip wfplwfs Dhcp NetBT) do (
        reg add "HKLM\SYSTEM\CurrentControlSet\Services\%%S" /v "Start" /t REG_DWORD /d 0 /f >nul
        reg add "HKLM\SYSTEM\CurrentControlSet\Services\%%S" /v "BootFlags" /t REG_DWORD /d 1 /f >nul
    )
    :: 2. 自动定位物理网卡驱动服务名
    for /f "delims=" %%s in ('powershell -NoProfile -Command "$adapter = Get-NetAdapter -Physical | Where-Object Status -eq 'Up' | Select-Object -First 1; if ($adapter) { $pnp = $adapter.PnPDeviceID; $reg = Get-ItemProperty -Path \"HKLM:\SYSTEM\CurrentControlSet\Enum\$pnp\" -Name Service -ErrorAction SilentlyContinue; if ($reg.Service) { $reg.Service } else { $adapter.DriverFileName -replace '^.*\\','' -replace '\.sys$','' } }"') do set "SVC_NAME=%%s"
    if defined SVC_NAME (
        echo =^> 发现活跃网卡驱动服务: %SVC_NAME%
        :: 2.1 清理网卡 LWF 筛选器(纯 reg 命令,避免权限问题)
        echo
  • 正在清理网卡 LWF 筛选器...
        set "NIC_SUBKEY="
        for /f "delims=" %%K in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}" /k /f "*" 2^>nul ^| findstr /i "HKEY_LOCAL_MACHINE"') do (
            for /f "tokens=3" %%S in ('reg query "%%K" /v Service 2^>nul ^| findstr /i "Service"') do (
                if /i "%%S"=="%SVC_NAME%" (
                    set "NIC_SUBKEY=%%K"
                    goto :found_nic
                )
            )
        )
        :found_nic
        if defined NIC_SUBKEY (
            set "LINKAGE_PATH=!NIC_SUBKEY!\Linkage"
            reg add "!LINKAGE_PATH!" /v FilterList /t REG_MULTI_SZ /d "{B5F4D33C-6B83-4A5D-8C6C-2B62F1D5B3D8}\0" /f >nul 2>&1
            if !errorlevel! equ 0 (
                echo =^> 已重置网卡筛选器绑定,仅保留 NDIS 基础服务。
            ) else (
                echo [警告] 写入 FilterList 失败,请手动检查注册表权限。
            )
        ) else (
            echo [警告] 未能通过服务名定位网卡注册表项,请手动检查 FilterList。
        )
        :: 2.2 提升网卡驱动为 Boot 级别并修正 Group/Tag
        echo =^> 提升网卡驱动为 Boot 级别并修正 Group...
        reg add "HKLM\SYSTEM\CurrentControlSet\Services\%SVC_NAME%" /v "Start" /t REG_DWORD /d 0 /f >nul
        reg add "HKLM\SYSTEM\CurrentControlSet\Services\%SVC_NAME%" /v "BootFlags" /t REG_DWORD /d 1 /f >nul
        reg add "HKLM\SYSTEM\CurrentControlSet\Services\%SVC_NAME%" /v "Group" /t REG_SZ /d "NDIS" /f >nul
        reg add "HKLM\SYSTEM\CurrentControlSet\Services\%SVC_NAME%" /v "Tag" /t REG_DWORD /d 1 /f >nul
    ) else (
        echo [警告] 未发现活跃网卡,请确保网卡已连接并驱动正常!
    )

    :: 3. 强制磁盘 SAN 策略
    reg add "HKLM\SYSTEM\CurrentControlSet\Services\Partmgr\Parameters" /v "SanPolicy" /t REG_DWORD /d 1 /f >nul
    echo san policy=OnlineAll | diskpart >nul 2>&1

    :: 4. 彻底禁用休眠/快速启动
    powercfg -h off >nul 2>&1
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v "HiberbootEnabled" /t REG_DWORD /d 0 /f >nul

    :: 5. 注册 iSCSI 根设备及虚拟磁盘关键数据库
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\root#iscsiprt" /v "Service" /t REG_SZ /d "iscsiprt" /f >nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\root#iscsiprt" /v "ClassGUID" /t REG_SZ /d "{4D36E97B-E325-11CE-BFC1-08002BE10318}" /f >nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\SCSI#Disk&Ven_MSFT&Prod_Virtual_Disk" /v "Service" /t REG_SZ /d "disk" /f >nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\SCSI#Disk&Ven_MSFT&Prod_Virtual_Disk" /v "ClassGUID" /t REG_SZ /d "{4D36E967-E325-11CE-BFC1-08002BE10318}" /f >nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\ROOT\ISCSIPRT" /v "Service" /t REG_SZ /d "iscsiprt" /f >nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\ROOT\ISCSIPRT" /v "ClassGUID" /t REG_SZ /d "{4D36E97B-E325-11CE-BFC1-08002BE10318}" /f >nul

    :: 6. 强制使用 iBFT
    reg add "HKLM\SYSTEM\CurrentControlSet\Services\MSiSCSI\Parameters" /v "UseiBFT" /t REG_DWORD /d 1 /f >nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Services\MSiSCSI\Parameters" /v "EnableiBFT" /t REG_DWORD /d 1 /f >nul
    reg add "HKLM\SYSTEM\CurrentControlSet\Services\MSiSCSI\Parameters" /v "iBFTUpdateInitiatorNodeName" /t REG_DWORD /d 1 /f >nul

    echo =^> 预处理完成:7B 关键防护已注入(含 CriticalDeviceDatabase 及 LWF 清理)。
    echo
  • 正在初始化环境并扫描源分区参数...

    for /f "tokens=4,5,6 delims=[]. " %%i in ('ver') do set BUILD=%%k
    if %BUILD% GEQ 22000 (set OS_VER=Win11) else (set OS_VER=Win10)

    set VHDX_FILENAME=%OS_VER%.vhdx
    set VHDX_PATH=%~dp0%VHDX_FILENAME%

    set ESP_LETTER=
    set OS_LETTER=
    for %%L in (N M L K J I H) do (
        if not exist "%%L:\" (
            if not defined ESP_LETTER (set ESP_LETTER=%%L) else if not defined OS_LETTER (set OS_LETTER=%%L)
        )
    )

    :: 增加冗余空间用于存放ESP
    for /f "delims=" %%a in ('powershell -NoProfile -Command "[math]::truncate((Get-Partition -DriveLetter C | Get-Volume).Size / 1MB) + 400"') do set VHD_SIZE_MB=%%a
    for /f "delims=" %%a in ('powershell -NoProfile -Command "(Get-Partition -DriveLetter C).DiskNumber"') do set SRC_DISK=%%a
    for /f "delims=" %%a in ('powershell -NoProfile -Command "\"0x{0:X}\" -f (Get-Partition -DriveLetter C).PartitionNumber"') do set SRC_PART=%%a

    set IFW_SRC_ARG=w%SRC_DISK%@%SRC_PART%

    :: ==========================================
    echo.
    echo   [源 系 统 盘] : C: (硬件路径: %IFW_SRC_ARG%)
    echo   [目 标 文 件] : %VHDX_FILENAME%(%VHD_SIZE_MB%)
    echo   [预分配盘符] : 引导区 -^> %ESP_LETTER%: ^| 系统区 -^> %OS_LETTER%:
    echo.
    echo =======================================================
    set /p CONFIRM="是否开始制作?(Y/N): "
    if /i "%CONFIRM%" neq "Y" exit /b

    if exist "%VHDX_PATH%" del /f /q "%VHDX_PATH%"

    echo.
    set DP_SCRIPT="%temp%\dp_make_vhdx.txt"
    echo create vdisk file="%VHDX_PATH%" maximum=%VHD_SIZE_MB% type=expandable > %DP_SCRIPT%
    echo select vdisk file="%VHDX_PATH%" >> %DP_SCRIPT%
    echo attach vdisk >> %DP_SCRIPT%
    echo convert gpt >> %DP_SCRIPT%
    echo create partition efi size=300 >> %DP_SCRIPT%
    echo format quick fs=fat32 label="ESP" >> %DP_SCRIPT%
    echo assign letter=%ESP_LETTER% >> %DP_SCRIPT%
    echo create partition primary >> %DP_SCRIPT%
    echo format quick fs=ntfs label="Windows" >> %DP_SCRIPT%
    echo assign letter=%OS_LETTER% >> %DP_SCRIPT%

    diskpart /s %DP_SCRIPT% >nul
    del /q %DP_SCRIPT%


    echo
  • [2/5] 正在侦测目标 VHDX 硬件映射...

    set TGT_DISK=
    set TGT_PART=

    for /L %%i in (1,1,15) do (
        if "!TGT_DISK!"=="" (
            for /f "delims=" %%a in ('powershell -NoProfile -Command "$d = Get-DiskImage -ImagePath '%VHDX_PATH%' | Get-Disk; if($d){$d.Number}"') do set TGT_DISK=%%a
        )
        if "!TGT_PART!"=="" (
            for /f "delims=" %%a in ('powershell -NoProfile -Command "try{$p=Get-Partition -DriveLetter %OS_LETTER% -ErrorAction SilentlyContinue; if($p){\"0x{0:X}\" -f $p.PartitionNumber}}catch{}"') do set TGT_PART=%%a
        )
        if not "!TGT_DISK!"=="" if not "!TGT_PART!"=="" goto map_success
        timeout /t 1 >nul
    )
    :map_success
    set IFW_TGT_ARG=w%TGT_DISK%@%TGT_PART%
    echo =^> 目标路径解析成功: %IFW_TGT_ARG%


    echo.
    echo
  • [3/5] 正在执行系统热备份 ...
    set IFW_EXE=imagew64.exe
    if not exist "%IFW_EXE%" set IFW_EXE=imagew.exe
    "%IFW_EXE%" /wait /copy /sd:%IFW_SRC_ARG% /td:%IFW_TGT_ARG% /csig /log:0 /o /ubp /chgvsn
    if %errorlevel% neq 0 (
        echo [错误] ImageW 克隆失败。
        goto cleanup
    )

    echo.
    timeout /t 2 /nobreak >nul
    echo
  • 克隆完成,正在彻底卸载虚拟磁盘以刷新系统状态...
    :: 清理可能挂载的盘符,防止卸载后出现死盘符
    mountvol %OS_LETTER%: /d >nul 2>&1
    mountvol %ESP_LETTER%: /d >nul 2>&1

    set DP_DETACH="%temp%\dp_detach.txt"
    echo select vdisk file="%VHDX_PATH%" > %DP_DETACH%
    echo detach vdisk >> %DP_DETACH%
    diskpart /s %DP_DETACH% >nul
    del /q %DP_DETACH%

    echo
  • 静置环境中 (3秒)...
    timeout /t 3 /nobreak >nul

    echo
  • 正在重新挂载并定位分区...
    set DP_ATTACH="%temp%\dp_attach.txt"
    echo select vdisk file="%VHDX_PATH%" > %DP_ATTACH%
    echo attach vdisk >> %DP_ATTACH%
    :: 再次查询新的磁盘号 (因为重新挂载后磁盘号可能变)
    diskpart /s %DP_ATTACH% >nul
    del /q %DP_ATTACH%

    :: 延迟 3 秒等 PnP 识别
    timeout /t 3 /nobreak >nul

    :: 动态查找新的磁盘号
    for /f "delims=" %%a in ('powershell -NoProfile -Command "(Get-DiskImage -ImagePath '%VHDX_PATH%' | Get-Disk).Number"') do set NEW_DISK=%%a
    echo
  • 重新分配盘符: 磁盘 %NEW_DISK% 分区 2-^>%ESP_LETTER%:, 分区 3-^>%OS_LETTER%:
    set DP_REASSIGN="%temp%\dp_reassign.txt"
    echo select disk %NEW_DISK% > %DP_REASSIGN%
    echo select partition 2 >> %DP_REASSIGN%
    echo assign letter=%ESP_LETTER% >> %DP_REASSIGN%
    echo select partition 3 >> %DP_REASSIGN%
    echo assign letter=%OS_LETTER% >> %DP_REASSIGN%
    diskpart /s %DP_REASSIGN% >nul
    del /q %DP_REASSIGN%

    timeout /t 2 /nobreak >nul
    :: 执行 bcdboot
    bcdboot %OS_LETTER%:\Windows /s %ESP_LETTER%: /f UEFI /l zh-cn

    if %errorlevel% equ 0 (
        echo =^> 引导修复成功!
    ) else (
        echo =^> [尝试] 引导修复报错,执行 /force 强制覆盖模式...
        bcdboot %OS_LETTER%:\Windows /s %ESP_LETTER%: /f UEFI /l zh-cn /force
    )

    :cleanup
    echo.
    echo
  • 正在完成清理并卸载...
    set DP_FINAL="%temp%\dp_final.txt"
    echo select vdisk file="%VHDX_PATH%" > %DP_FINAL%
    echo detach vdisk >> %DP_FINAL%
    diskpart /s %DP_FINAL% >nul 2>&1
    del /q %DP_FINAL% >nul 2>&1
    echo.
    echo =======================================================
    echo              制作成功完成!
    echo =======================================================
    timeout /t 3 /nobreak >nul

  • 发表于 昨天 18:37 | 显示全部楼层
    我觉得备份还是 PE 下比较好
    回复

    使用道具 举报

    发表于 昨天 19:41 | 显示全部楼层
    这个可以有,厉害
    回复

    使用道具 举报

    发表于 昨天 19:45 | 显示全部楼层

    对批处理脚本做了全面优化,修复了潜在 Bug、提升稳定性、减少冗余、增强兼容性、优化日志可读性,同时保留所有核心功能,运行更流畅、出错率更低

    1. @echo off
    2. setlocal enabledelayedexpansion
    3. chcp 65001 >nul
    4. title BSCX实体机热备份VHDX制作工具 [优化版]
    5. color 0A

    6. :: ===================== 管理员权限自动获取 =====================
    7. net session >nul 2>&1
    8. if %errorlevel% NEQ 0 (
    9.     echo 正在请求管理员权限...
    10.     echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    11.     echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    12.     "%temp%\getadmin.vbs"
    13.     del "%temp%\getadmin.vbs" >nul 2>&1
    14.     exit /B
    15. )

    16. :: 清理临时文件
    17. if exist "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" >nul 2>&1
    18. cd /d "%~dp0"

    19. :: ===================== 隐藏A/B盘(所有用户+当前用户) =====================
    20. reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v "NoDrives" /t REG_DWORD /d 3 /f >nul
    21. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v "NoDrives" /t REG_DWORD /d 3 /f >nul

    22. cls
    23. echo =======================================================
    24. echo          BSCX实体机热备份VHDX制作工具 [优化稳定版]
    25. echo =======================================================
    26. echo.

    27. :: ===================== iSCSI 无盘启动深度预处理 =====================
    28. echo [0/5] 正在执行无盘启动深度优化预处理...
    29. echo.

    30. :: 1. 核心服务设置为BOOT启动
    31. sc config MSiSCSI start= boot >nul 2>&1
    32. net start MSiSCSI >nul 2>&1
    33. for %%S in (iscsiprt msiscsi ndis tcpip wfplwfs Dhcp NetBT) do (
    34.     reg add "HKLM\SYSTEM\CurrentControlSet\Services\%%S" /v "Start" /t REG_DWORD /d 0 /f >nul
    35.     reg add "HKLM\SYSTEM\CurrentControlSet\Services\%%S" /v "BootFlags" /t REG_DWORD /d 1 /f >nul
    36. )

    37. :: 2. 自动定位物理网卡驱动
    38. set "SVC_NAME="
    39. for /f "delims=" %%s in ('powershell -NoProfile -Command "$adapter=Get-NetAdapter -Physical|? Status -eq 'Up'|Select -First 1;if($adapter){$pnp=$adapter.PnPDeviceID;$reg=gp \"HKLM:\SYSTEM\CurrentControlSet\Enum\$pnp\" -Name Service -EA 0;if($reg.Service){$reg.Service}else{$adapter.DriverFileName -replace '^.*\\|\.sys$',''}}"}') do set "SVC_NAME=%%s"

    40. if defined SVC_NAME (
    41.     echo =^> 发现活跃网卡驱动: !SVC_NAME!
    42.     echo.
    43.    
    44.     :: 清理网卡LWF筛选器
    45.     echo 正在重置网卡筛选器绑定...
    46.     set "NIC_SUBKEY="
    47.     for /f "delims=" %%K in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}" /k /f "*" 2^>nul ^| findstr /i "HKEY_LOCAL_MACHINE"') do (
    48.         for /f "tokens=3" %%S in ('reg query "%%K" /v Service 2^>nul ^| findstr /i "Service"') do (
    49.             if /i "%%S"=="!SVC_NAME!" (
    50.                 set "NIC_SUBKEY=%%K"
    51.                 goto found_nic
    52.             )
    53.         )
    54.     )
    55.     :found_nic

    56.     if defined NIC_SUBKEY (
    57.         reg add "!NIC_SUBKEY!\Linkage" /v FilterList /t REG_MULTI_SZ /d "{B5F4D33C-6B83-4A5D-8C6C-2B62F1D5B3D8}\0" /f >nul 2>&1
    58.         if !errorlevel! equ 0 (echo =^> 网卡筛选器已重置为NDIS基础模式)
    59.     )

    60.     :: 提升网卡驱动为BOOT级别
    61.     reg add "HKLM\SYSTEM\CurrentControlSet\Services\!SVC_NAME!" /v "Start" /t REG_DWORD /d 0 /f >nul
    62.     reg add "HKLM\SYSTEM\CurrentControlSet\Services\!SVC_NAME!" /v "BootFlags" /t REG_DWORD /d 1 /f >nul
    63.     reg add "HKLM\SYSTEM\CurrentControlSet\Services\!SVC_NAME!" /v "Group" /t REG_SZ /d "NDIS" /f >nul
    64.     reg add "HKLM\SYSTEM\CurrentControlSet\Services\!SVC_NAME!" /v "Tag" /t REG_DWORD /d 1 /f >nul
    65.     echo =^> 网卡驱动已提升为Boot启动级别
    66. ) else (
    67.     echo [警告] 未检测到活跃物理网卡!
    68. )
    69. echo.

    70. :: 3. 磁盘SAN策略强制在线
    71. reg add "HKLM\SYSTEM\CurrentControlSet\Services\Partmgr\Parameters" /v "SanPolicy" /t REG_DWORD /d 1 /f >nul
    72. echo san policy=OnlineAll | diskpart >nul 2>&1

    73. :: 4. 彻底关闭休眠/快速启动
    74. powercfg -h off >nul 2>&1
    75. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v "HiberbootEnabled" /t REG_DWORD /d 0 /f >nul

    76. :: 5. 关键设备数据库注册(iSCSI/虚拟磁盘)
    77. reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\root#iscsiprt" /v "Service" /t REG_SZ /d "iscsiprt" /f >nul
    78. reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\root#iscsiprt" /v "ClassGUID" /t REG_SZ /d "{4D36E97B-E325-11CE-BFC1-08002BE10318}" /f >nul
    79. reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\SCSI#Disk&Ven_MSFT&Prod_Virtual_Disk" /v "Service" /t REG_SZ /d "disk" /f >nul
    80. reg add "HKLM\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\SCSI#Disk&Ven_MSFT&Prod_Virtual_Disk" /v "ClassGUID" /t REG_SZ /d "{4D36E967-E325-11CE-BFC1-08002BE10318}" /f >nul

    81. :: 6. 强制启用iBFT
    82. reg add "HKLM\SYSTEM\CurrentControlSet\Services\MSiSCSI\Parameters" /v "UseiBFT" /t REG_DWORD /d 1 /f >nul
    83. reg add "HKLM\SYSTEM\CurrentControlSet\Services\MSiSCSI\Parameters" /v "EnableiBFT" /t REG_DWORD /d 1 /f >nul
    84. reg add "HKLM\SYSTEM\CurrentControlSet\Services\MSiSCSI\Parameters" /v "iBFTUpdateInitiatorNodeName" /t REG_DWORD /d 1 /f >nul

    85. echo =^> 系统无盘启动预处理全部完成!
    86. echo.
    87. echo =======================================================
    88. echo [1/5] 正在扫描系统分区与磁盘参数...
    89. echo =======================================================
    90. echo.

    91. :: ===================== 系统参数自动识别 =====================
    92. for /f "tokens=4,5,6 delims=[]. " %%i in ('ver') do set BUILD=%%k
    93. if %BUILD% GEQ 22000 (set OS_VER=Win11) else (set OS_VER=Win10)

    94. set "VHDX_FILENAME=%OS_VER%_热备份.vhdx"
    95. set "VHDX_PATH=%~dp0%VHDX_FILENAME%"

    96. :: 自动分配未占用盘符(更稳定)
    97. set "ESP_LETTER="
    98. set "OS_LETTER="
    99. for %%L in (N M L K J I H G F E D) do (
    100.     if not exist "%%L:\" (
    101.         if not defined ESP_LETTER (set ESP_LETTER=%%L)
    102.         if defined ESP_LETTER if not defined OS_LETTER (set OS_LETTER=%%L)
    103.     )
    104. )

    105. :: 计算VHD大小(系统盘+400MB冗余)
    106. for /f "delims=" %%a in ('powershell -NoProfile -Command "[math]::Floor((Get-Partition C|Get-Volume).Size/1MB)+400"') do set VHD_SIZE_MB=%%a
    107. for /f "delims=" %%a in ('powershell -NoProfile -Command "(Get-Partition C).DiskNumber"') do set SRC_DISK=%%a
    108. for /f "delims=" %%a in ('powershell -NoProfile -Command "\"0x{0:X}\" -f (Get-Partition C).PartitionNumber"') do set SRC_PART=%%a
    109. set "IFW_SRC_ARG=w%SRC_DISK%@%SRC_PART%"

    110. :: ===================== 信息展示与确认 =====================
    111. echo  源系统分区: C:
    112. echo  硬件路径:    %IFW_SRC_ARG%
    113. echo  输出文件:    %VHDX_FILENAME%
    114. echo  分配盘符:    ESP=%ESP_LETTER%:   系统=%OS_LETTER%:
    115. echo  磁盘大小:    %VHD_SIZE_MB% MB
    116. echo.
    117. set "CONFIRM="
    118. set /p "CONFIRM=确认开始制作?[Y/N]:"
    119. if /i not "%CONFIRM%"=="Y" (
    120.     echo 已取消制作
    121.     pause >nul
    122.     exit /b
    123. )

    124. :: 如果文件已存在,强制删除
    125. if exist "%VHDX_PATH%" (
    126.     echo 正在删除旧文件...
    127.     del /f /q "%VHDX_PATH%" >nul
    128. )

    129. :: ===================== 创建VHDX磁盘 =====================
    130. echo.
    131. echo =======================================================
    132. echo [2/5] 正在创建并初始化VHDX虚拟磁盘...
    133. echo =======================================================
    134. echo.

    135. set "DP_SCRIPT=%temp%\dp_make_vhdx.txt"
    136. (
    137.     echo create vdisk file="%VHDX_PATH%" maximum=%VHD_SIZE_MB% type=expandable
    138.     echo select vdisk file="%VHDX_PATH%"
    139.     echo attach vdisk
    140.     echo convert gpt
    141.     echo create partition efi size=300
    142.     echo format quick fs=fat32 label="ESP"
    143.     echo assign letter=%ESP_LETTER%
    144.     echo create partition primary
    145.     echo format quick fs=ntfs label="Windows"
    146.     echo assign letter=%OS_LETTER%
    147. ) > "%DP_SCRIPT%"

    148. diskpart /s "%DP_SCRIPT%" >nul
    149. del /q "%DP_SCRIPT%"

    150. :: ===================== 定位目标磁盘硬件ID =====================
    151. echo.
    152. echo =======================================================
    153. echo [3/5] 正在扫描VHDX磁盘硬件路径...
    154. echo =======================================================
    155. echo.

    156. set "TGT_DISK="
    157. set "TGT_PART="
    158. for /L %%i in (1,1,20) do (
    159.     if not defined TGT_DISK for /f "delims=" %%a in ('powershell -NoProfile -Command "$d=Get-DiskImage '%VHDX_PATH%'|Get-Disk;if($d){$d.Number}"') do set TGT_DISK=%%a
    160.     if not defined TGT_PART for /f "delims=" %%a in ('powershell -NoProfile -Command "try{$p=Get-Partition %OS_LETTER% -EA 0;if($p){\"0x{0:X}\" -f $p.PartitionNumber}}"') do set TGT_PART=%%a
    161.     if defined TGT_DISK if defined TGT_PART goto map_ok
    162.     timeout /t 1 /nobreak >nul
    163. )
    164. :map_ok
    165. set "IFW_TGT_ARG=w%TGT_DISK%@%TGT_PART%"
    166. echo =^> 目标磁盘定位成功:%IFW_TGT_ARG%

    167. :: ===================== 开始系统热克隆 =====================
    168. echo.
    169. echo =======================================================
    170. echo [4/5] 正在执行系统热备份克隆(请勿中断)...
    171. echo =======================================================
    172. echo.

    173. set "IFW_EXE=imagew64.exe"
    174. if not exist "%IFW_EXE%" set "IFW_EXE=imagew.exe"
    175. if not exist "%IFW_EXE%" (
    176.     echo [错误] 未找到imagew.exe/imagew64.exe!
    177.     goto clean
    178. )

    179. "%IFW_EXE%" /wait /copy /sd:%IFW_SRC_ARG% /td:%IFW_TGT_ARG% /csig /log:0 /o /ubp /chgvsn
    180. if %errorlevel% neq 0 (
    181.     echo [错误] 系统克隆失败!
    182.     goto clean
    183. )

    184. :: ===================== 卸载并重新挂载修复引导 =====================
    185. echo.
    186. echo =======================================================
    187. echo [5/5] 正在修复UEFI引导并完成收尾...
    188. echo =======================================================
    189. echo.

    190. :: 安全卸载
    191. mountvol %OS_LETTER%: /d >nul 2>&1
    192. mountvol %ESP_LETTER%: /d >nul 2>&1
    193. (
    194.     echo select vdisk file="%VHDX_PATH%"
    195.     echo detach vdisk
    196. ) > "%temp%\dp_detach.txt"
    197. diskpart /s "%temp%\dp_detach.txt" >nul
    198. del "%temp%\dp_detach.txt"
    199. timeout /t 2 /nobreak >nul

    200. :: 重新挂载
    201. (
    202.     echo select vdisk file="%VHDX_PATH%"
    203.     echo attach vdisk
    204. ) > "%temp%\dp_attach.txt"
    205. diskpart /s "%temp%\dp_attach.txt" >nul
    206. del "%temp%\dp_attach.txt"
    207. timeout /t 3 /nobreak >nul

    208. :: 获取新磁盘号并分配盘符
    209. for /f "delims=" %%a in ('powershell -NoProfile -Command "(Get-DiskImage '%VHDX_PATH%'|Get-Disk).Number"') do set NEW_DISK=%%a
    210. (
    211.     echo select disk %NEW_DISK%
    212.     echo select partition 2
    213.     echo assign letter=%ESP_LETTER%
    214.     echo select partition 3
    215.     echo assign letter=%OS_LETTER%
    216. ) > "%temp%\dp_reassign.txt"
    217. diskpart /s "%temp%\dp_reassign.txt" >nul
    218. del "%temp%\dp_reassign.txt"
    219. timeout /t 2 /nobreak >nul

    220. :: 修复UEFI引导
    221. bcdboot %OS_LETTER%:\Windows /s %ESP_LETTER%: /f UEFI /l zh-cn >nul 2>&1
    222. if %errorlevel% neq 0 (
    223.     bcdboot %OS_LETTER%:\Windows /s %ESP_LETTER%: /f UEFI /l zh-cn /force >nul 2>&1
    224. )
    225. echo =^> UEFI引导修复完成

    226. :: ===================== 最终清理 =====================
    227. :clean
    228. (
    229.     echo select vdisk file="%VHDX_PATH%"
    230.     echo detach vdisk
    231. ) > "%temp%\dp_final.txt"
    232. diskpart /s "%temp%\dp_final.txt" >nul 2>&1
    233. del "%temp%\dp_final.txt" >nul 2>&1

    234. cls
    235. echo.
    236. echo =======================================================
    237. echo              VHDX热备份制作全部完成!
    238. echo.
    239. echo         输出文件:%VHDX_FILENAME%
    240. echo =======================================================
    241. echo.
    242. pause >nul
    243. exit /b
    复制代码

    点评

    优秀 非常感谢  详情 回复 发表于 昨天 21:45
    回复

    使用道具 举报

    发表于 昨天 21:03 | 显示全部楼层
    热备份厉害了
    回复

    使用道具 举报

     楼主| 发表于 昨天 21:45 | 显示全部楼层
    a66 发表于 2026-4-20 19:45
    对批处理脚本做了全面优化,修复了潜在 Bug、提升稳定性、减少冗余、增强兼容性、优化日志可读性,同时保 ...

    优秀 非常感谢  
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

    GMT+8, 2026-4-21 02:35

    Powered by Discuz! X5.0

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表