@echo off
setlocal enabledelayedexpansion
color 1f
mode con: cols=80 lines=33
title Windows系统部署工具 - 深山红叶
:: 设置工作目录及全局变量存储文件
:: 清理可能的残留
set "WORK_DIR=%temp%\WinDeploy"
set "GLOBAL_VARS=%WORK_DIR%\global_vars.txt"
if not exist "%WORK_DIR%" mkdir "%WORK_DIR%"
del "%WORK_DIR%\*.txt" >nul 2>&1
:: 初始化全局变量存储文件
if not exist "!GLOBAL_VARS!" (echo. > "!GLOBAL_VARS!")
echo list disk > "%WORK_DIR%\list_disk.txt"
diskpart /s "%WORK_DIR%\list_disk.txt"
del "%WORK_DIR%\list_disk.txt" >nul 2>&1
echo.
echo 请根据磁盘容量信息确定要安装的目标磁盘。
echo.
echo 可用的 Windows 版本
echo ==================================================
echo.
set "inputFile=%WORK_DIR%\image_info.txt"
set "outputFile=%WORK_DIR%\out.txt"
del /q "%outputFile%" 2>nul
set "prevLine="
for /f "delims=" %%a in ("%inputFile%") do (
set "currentLine=%%a"
if "!currentLine:~0,4!"=="索引" (
set "prevLine=!currentLine!"
) else if "!currentLine:~0,5!"=="Index" (
set "prevLine=!currentLine!"
) else if "!currentLine:~0,4!"=="名称" (
:: 保留“名称”行时不修改prevLine
) else if "!currentLine:~0,4!"=="Name" (
:: 保留“Name”行时不修改prevLine
) else (
set "prevLine="
)
)
if exist "%outputFile%" (
type "%outputFile%"
) else (
echo.
echo 【错误】无法提取系统版本信息!
pause >nul
goto select_image
)
:input_index
echo.
echo ==================================================
echo.
set /p image_index=. 请选择要安装的版本索引号:
if "%image_index%"=="" goto input_index
set esp_found=0
for /f "tokens=2" %%i in ('type "%WORK_DIR%\esp_info.txt" ^| find "分区"') do (
if !esp_found! equ 0 (
set esp_partition=%%i
set esp_found=1
)
)
:: 检查系统分区变量,未定义则提示输入
if not defined GLOBAL_SYSTEM_DRIVE (
echo.
echo 【提示】未找到系统分区信息,请手动输入
set /p sys_drive=. 请输入系统分区盘符(例如X):
if "!sys_drive!"=="" (
echo.
echo 【错误】盘符不能为空!
pause >nul
exit /b 1
)
set "GLOBAL_SYSTEM_DRIVE=!sys_drive::=!" :: 移除冒号
call :save_global_vars :: 保存用户输入的盘符
)
:: 验证系统分区是否存在
set "system_drive=!GLOBAL_SYSTEM_DRIVE!"
if not exist "!system_drive!:\" (
echo.
echo 【错误】系统分区 !system_drive!: 不存在!
pause >nul
exit /b 1
)
:: 定义无人值守文件路径(关键:确保路径正确)
set "TARGET_DIR=!system_drive!:\Windows\Panther"
set "TARGET_FILE=!TARGET_DIR!\unattend.xml"
set "SOURCE_FILE=%WORK_DIR%\unattend.xml"
:: 检查并加载系统分区信息
if not defined GLOBAL_SYSTEM_DRIVE (
set /p system_drive=. 请输入系统分区盘符(例如X):
if "!system_drive!"=="" (
echo.
echo 【错误】盘符不能为空!
pause >nul
exit /b 1
)
set "GLOBAL_SYSTEM_DRIVE=!system_drive::=!"
call :save_global_vars
)
:: 检查并加载目标磁盘信息
if not defined GLOBAL_TARGET_DISK (
echo list disk > "%WORK_DIR%\listdisk.txt"
diskpart /s "%WORK_DIR%\listdisk.txt"
echo.
set /p uefi_disk=. 请输入目标硬盘编号(例如0):
if "!uefi_disk!"=="" (
echo.
echo 【错误】磁盘编号不能为空!
pause >nul
exit /b 1
)
set "GLOBAL_TARGET_DISK=!uefi_disk!"
call :save_global_vars
)
:: 调用修复引导核心逻辑
call :repair_boot
exit /b 0
:: 工具函数:保存全局变量到文件(解决变量继承问题)
:save_global_vars
(
echo set "GLOBAL_SOURCE_PATH=%GLOBAL_SOURCE_PATH%"
echo set "GLOBAL_TARGET_DRIVE=%GLOBAL_TARGET_DRIVE%"
echo set "GLOBAL_TARGET_DISK=%GLOBAL_TARGET_DISK%"
echo set "GLOBAL_TARGET_PARTITION=%GLOBAL_TARGET_PARTITION%"
echo set "GLOBAL_IMAGE_INDEX=%GLOBAL_IMAGE_INDEX%"
echo set "GLOBAL_SYSTEM_DRIVE=%GLOBAL_SYSTEM_DRIVE%"
echo set "GLOBAL_ESP_DRIVE=%GLOBAL_ESP_DRIVE%"
echo set "GLOBAL_ESP_PARTITION=%GLOBAL_ESP_PARTITION%"
) > "!GLOBAL_VARS!"
exit /b 0
:: 工具函数:加载全局变量(从文件读取)
:load_global_vars
if exist "!GLOBAL_VARS!" (
for /f "delims=" %%i in ('type "!GLOBAL_VARS!"') do (
%%i
)
)
exit /b 0