|
|
用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
|
|