|
本帖最后由 WitQQ 于 2025-9-29 17:01 编辑
尝试做了个PE安装管理.bat- @ECHO OFF
- setlocal EnableDelayedExpansion
- :: 默认配置
- set "DEFAULT_SCRIPT_NAME=PE维护系统安装工具"
- set "DEFAULT_SCRIPT_VERSION=3.2"
- set "DEFAULT_PE_NAME=本地PE维护系统"
- set "DEFAULT_PE_GUID={e13345e4-953c-11e6-b520-000c29bce8a5}"
- set "DEFAULT_TIMEOUT=5"
- set "DEFAULT_INSTALL_DRIVE=%systemdrive%"
- :: 解析命令行参数
- set "CUSTOM_SCRIPT_NAME="
- set "CUSTOM_TIMEOUT="
- set "CUSTOM_INSTALL_DRIVE="
- set "SHOW_HELP=0"
- set "SKIP_CONFIG=0"
- set "NO_LOG=0" :: 新增:日志开关,0=关闭日志(默认),1=开启日志
- :PARSE_ARGS
- if "%~1"=="" goto END_PARSE
- if "%~1"=="-name" (
- set "CUSTOM_SCRIPT_NAME=%~2"
- set "SKIP_CONFIG=1"
- shift
- shift
- goto PARSE_ARGS
- )
- if "%~1"=="-timeout" (
- set "CUSTOM_TIMEOUT=%~2"
- set "SKIP_CONFIG=1"
- shift
- shift
- goto PARSE_ARGS
- )
- if "%~1"=="-drive" (
- set "CUSTOM_INSTALL_DRIVE=%~2"
- set "SKIP_CONFIG=1"
- shift
- shift
- goto PARSE_ARGS
- )
- if "%~1"=="-?" (
- set "SHOW_HELP=1"
- shift
- goto PARSE_ARGS
- )
- if "%~1"=="-help" (
- set "SHOW_HELP=1"
- shift
- goto PARSE_ARGS
- )
- if "%~1"=="-skipconfig" (
- set "SKIP_CONFIG=1"
- shift
- goto PARSE_ARGS
- )
- shift
- goto PARSE_ARGS
- :END_PARSE
- :: 显示帮助信息
- if %SHOW_HELP% equ 1 (
- echo.
- echo ========================================
- echo PE系统安装工具使用说明
- echo ========================================
- echo.
- echo 使用方法: %~nx0 [参数]
- echo.
- echo 参数说明:
- echo -name "名称" 设置PE系统显示名称
- echo -timeout 秒数 设置启动菜单超时时间(默认5秒)
- echo -drive 盘符 设置安装目标盘符(默认系统盘)
- echo -skipconfig 跳过配置界面直接安装
- echo -help 或 -? 显示此帮助信息
- echo.
- echo 示例:
- echo %~nx0 -name "我的PE系统" -timeout 10 -drive D:
- echo %~nx0 -timeout 3 -skipconfig
- echo %~nx0 -drive E: -name "紧急救援系统"
- echo.
- pause
- exit /b 0
- )
- :: 应用自定义配置
- if defined CUSTOM_SCRIPT_NAME (
- set "SCRIPT_NAME=!CUSTOM_SCRIPT_NAME!"
- ) else (
- set "SCRIPT_NAME=!DEFAULT_SCRIPT_NAME!"
- )
- if defined CUSTOM_TIMEOUT (
- set "TIMEOUT=!CUSTOM_TIMEOUT!"
- ) else (
- set "TIMEOUT=!DEFAULT_TIMEOUT!"
- )
- if defined CUSTOM_INSTALL_DRIVE (
- call :VALIDATE_DRIVE "!CUSTOM_INSTALL_DRIVE!"
- if errorlevel 1 (
- echo [错误] 指定的盘符 !CUSTOM_INSTALL_DRIVE! 无效或不可用
- pause
- exit /b 1
- )
- set "INSTALL_DRIVE=!CUSTOM_INSTALL_DRIVE!"
- ) else (
- set "INSTALL_DRIVE=!DEFAULT_INSTALL_DRIVE!"
- )
- :: 设置其他变量
- set "SCRIPT_VERSION=!DEFAULT_SCRIPT_VERSION!"
- set "PE_NAME=!DEFAULT_PE_NAME!"
- set "PE_GUID=!DEFAULT_PE_GUID!"
- :: 初始化变量
- :: 日志文件名 - 使用动态时间
- if !NO_LOG! equ 1 (
- :: 开启日志时初始化日志文件
- for /f "tokens=1-3 delims=/ " %%a in ('date /t') do set "LOG_DATE=%%c%%a%%b"
- for /f "tokens=1-2 delims=: " %%a in ('time /t') do set "LOG_TIME=%%a%%b"
- set "LOG_FILE=%~dp0PE安装管理器_!LOG_DATE!_!LOG_TIME!.log"
- ) else (
- :: 关闭日志时,设置日志文件为空
- set "LOG_FILE="
- )
- set "SUCCESS=0"
- set "ERROR_MSG="
- set "WIM_SIZE=0"
- set "WIM_SIZE_CHECKED=0"
- set "CONFIG_MODIFIED=0"
- set "EXISTING_INSTALL=0"
- :: 设置控制台
- title !SCRIPT_NAME! v!SCRIPT_VERSION!
- mode con cols=85 lines=30
- color 0A
- :: 显示欢迎信息
- echo.
- echo ========================================
- echo !SCRIPT_NAME! v!SCRIPT_VERSION!
- echo ========================================
- echo.
- :: 检查现有安装
- call :CHECK_EXISTING_PE
- if !EXISTING_INSTALL! equ 1 (
- echo [信息] 检测到已安装的PE系统
- echo.
- echo 当前配置:
- echo 启动项名称: !EXISTING_PE_NAME!
- echo 启动超时: !EXISTING_TIMEOUT! 秒
- echo 安装位置: !EXISTING_INSTALL_DRIVE!\boot
- echo.
- echo 选择操作:
- echo [Y] 继续安装
- echo [N] 修改配置
- echo [M] 仅修改名称
- echo [C] 仅修改超时
- echo [R] 移除现有
- echo [A] 退出
- echo.
- choice /c YNMCRA /n /m "请输入选择: "
- if errorlevel 6 (
- echo 用户退出安装
- exit /b 0
- ) else if errorlevel 5 (
- echo.
- echo 正在移除现有PE系统...
- set "INSTALL_DRIVE=!EXISTING_INSTALL_DRIVE!"
- call :REMOVE_EXISTING
- echo.
- echo PE系统移除完成
- echo.
- set "EXISTING_INSTALL=0"
- goto CONFIG_MENU
- ) else if errorlevel 4 (
- call :MODIFY_TIMEOUT_ONLY
- goto MAIN_MENU
- ) else if errorlevel 3 (
- call :MODIFY_NAME_ONLY
- goto MAIN_MENU
- ) else if errorlevel 2 (
- set "SKIP_CONFIG=0"
- set "PE_NAME=!EXISTING_PE_NAME!"
- set "TIMEOUT=!EXISTING_TIMEOUT!"
- set "INSTALL_DRIVE=!EXISTING_INSTALL_DRIVE!"
- goto CONFIG_MENU
- ) else if errorlevel 1 (
- set "SKIP_CONFIG=1"
- set "PE_NAME=!EXISTING_PE_NAME!"
- set "TIMEOUT=!EXISTING_TIMEOUT!"
- set "INSTALL_DRIVE=!EXISTING_INSTALL_DRIVE!"
- goto START_INSTALL
- )
- ) else (
- echo [信息] 未检测到现有PE系统,开始全新安装
- echo.
- )
- :: 主菜单入口点
- :MAIN_MENU
- call :CHECK_EXISTING_PE
- if !EXISTING_INSTALL! equ 1 (
- echo.
- echo ========================================
- echo PE系统管理菜单
- echo ========================================
- echo.
- echo 当前PE配置:
- echo 启动项名称: !EXISTING_PE_NAME!
- echo 启动超时: !EXISTING_TIMEOUT! 秒
- echo 安装位置: !EXISTING_INSTALL_DRIVE!\boot
- echo.
- echo 操作选项:
- echo [1] 修改启动项名称
- echo [2] 修改启动超时时间
- echo [3] 重新安装PE系统
- echo [4] 移除现有PE系统
- echo [5] 退出
- echo.
-
- choice /c 12345 /n /m "请选择操作 (1-5): "
- if errorlevel 5 (
- echo 用户退出安装
- exit /b 0
- ) else if errorlevel 4 (
- echo.
- echo 正在移除现有PE系统...
- set "INSTALL_DRIVE=!EXISTING_INSTALL_DRIVE!"
- call :REMOVE_EXISTING
- echo.
- echo PE系统移除完成
- echo.
- set "EXISTING_INSTALL=0"
- goto MAIN_MENU
- ) else if errorlevel 3 (
- set "SKIP_CONFIG=1"
- set "PE_NAME=!EXISTING_PE_NAME!"
- set "TIMEOUT=!EXISTING_TIMEOUT!"
- set "INSTALL_DRIVE=!EXISTING_INSTALL_DRIVE!"
- goto START_INSTALL
- ) else if errorlevel 2 (
- call :MODIFY_TIMEOUT_ONLY
- goto MAIN_MENU
- ) else if errorlevel 1 (
- call :MODIFY_NAME_ONLY
- goto MAIN_MENU
- )
- ) else (
- goto CONFIG_MENU
- )
- :: 配置菜单界面
- :CONFIG_MENU
- if !SKIP_CONFIG! equ 0 (
- echo.
- echo ========================================
- echo 安装配置菜单
- echo ========================================
- echo.
- echo 当前配置:
- echo 1. 启动项名称: !PE_NAME!
- echo 2. 启动超时: !TIMEOUT! 秒
- echo 3. 安装盘符: !INSTALL_DRIVE!
- echo.
- echo 操作选项:
- echo [1] 修改启动项名称
- echo [2] 修改启动超时时间
- echo [3] 修改安装盘符
- echo [4] 开始安装/重新安装
- echo [5] 退出安装
- echo.
-
- choice /c 12345 /n /m "请选择操作 (1-5): "
- if errorlevel 5 (
- echo 用户退出安装
- exit /b 0
- ) else if errorlevel 4 (
- goto START_INSTALL
- ) else if errorlevel 3 (
- call :CONFIG_DRIVE
- goto CONFIG_MENU
- ) else if errorlevel 2 (
- call :CONFIG_TIMEOUT
- goto CONFIG_MENU
- ) else if errorlevel 1 (
- call :CONFIG_NAME
- goto CONFIG_MENU
- )
- )
- :START_INSTALL
- :: 显示最终配置确认
- echo.
- echo ========================================
- echo 最终安装配置
- echo ========================================
- echo.
- echo 安装配置:
- echo 启动项名称: !PE_NAME!
- echo 启动超时: !TIMEOUT! 秒
- echo 安装盘符: !INSTALL_DRIVE!
- if !NO_LOG! equ 1 ( :: 开启日志,显示日志文件信息
- echo 日志文件: %~nx0!LOG_FILE:~-20!
- )
- echo.
- if !CONFIG_MODIFIED! equ 1 (
- echo [注意] 配置已被修改
- echo.
- )
- echo 按任意键开始安装,Ctrl+C 取消...
- pause >nul
- :: 记录开始时间 - 修复:移除外部条件判断,LOG函数内部已处理
- call :LOG "开始安装PE系统"
- call :LOG "配置: 名称=!PE_NAME!, 超时=!TIMEOUT!秒, 盘符=!INSTALL_DRIVE!"
- :: 检查管理员权限
- echo.
- echo 正在检查管理员权限...
- >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
- if %errorlevel% NEQ 0 (
- echo 需要管理员权限,正在请求提升权限...
- call :LOG "请求提升管理员权限"
-
- :: 构建带参数的命令
- set "CMD_WITH_ARGS=%~f0 -skipconfig"
- set "CMD_WITH_ARGS=!CMD_WITH_ARGS! -name "!PE_NAME!""
- set "CMD_WITH_ARGS=!CMD_WITH_ARGS! -timeout !TIMEOUT!"
- set "CMD_WITH_ARGS=!CMD_WITH_ARGS! -drive "!INSTALL_DRIVE!""
-
- powershell -Command "Start-Process -Verb RunAs -FilePath 'cmd' -ArgumentList '/c','!CMD_WITH_ARGS!'" >nul 2>&1
- if %errorlevel% NEQ 0 (
- echo [错误] 无法获取管理员权限
- call :LOG "错误:无法获取管理员权限"
- pause
- )
- exit /b
- )
- :: 检查是否是以提升权限运行
- echo √ 已获得管理员权限
- call :LOG "成功获取管理员权限"
- :: 后续安装流程
- goto INSTALL_MAIN
- :INSTALL_MAIN
- :: 第一阶段:检查源文件
- echo.
- echo 正在检查源文件...
- if not exist "%~dp0boot\boot.sdi" (
- set "ERROR_MSG=缺少 boot.sdi 文件"
- goto ERROR_HANDLER
- )
- if not exist "%~dp0boot\boot.wim" (
- set "ERROR_MSG=缺少 boot.wim 文件"
- goto ERROR_HANDLER
- )
- :: 检查源boot.wim文件大小
- for %%F in ("%~dp0boot\boot.wim") do set "SOURCE_WIM_SIZE=%%~zF"
- echo √ 源文件检查通过(boot.wim: !SOURCE_WIM_SIZE! 字节)
- call :LOG "源文件检查通过,boot.wim大小: !SOURCE_WIM_SIZE! 字节"
- :: 检测启动模式
- echo.
- echo 正在检测系统启动模式...
- set UEFI_MODE=0
- bcdedit | find "winload.efi" >nul && set UEFI_MODE=1
- bcdedit | find "efi" >nul && set UEFI_MODE=1
- if !UEFI_MODE! equ 1 (
- echo √ 检测到 UEFI 启动模式
- call :LOG "检测到 UEFI 启动模式"
- ) else (
- echo √ 检测到 Legacy BIOS 启动模式
- call :LOG "检测到 Legacy BIOS 启动模式"
- )
- :: 清理现有PE项(如果存在)
- echo.
- echo 正在清理现有PE启动项...
- bcdedit /enum %PE_GUID% >nul 2>&1 && (
- echo ! 发现现有PE项,正在清理...
- for /f "tokens=2 delims=," %%a in ('bcdedit /enum %PE_GUID% /v 2^>nul ^| find "ramdisk"') do (
- bcdedit /delete %%a /f >nul 2>&1 && echo √ 清理RAM磁盘项 || echo ! 清理RAM磁盘项失败
- )
- bcdedit /delete %PE_GUID% /f >nul 2>&1 && echo √ 清理PE启动项 || echo ! 清理PE启动项失败
- ) || echo √ 无现有PE项需要清理
- call :LOG "完成现有项清理"
- :: 创建RAM磁盘设备
- echo.
- echo 正在创建RAM磁盘设备...
- for /f "tokens=2 delims={}" %%i in ('bcdedit /create /device 2^>nul') do set "RAM_GUID={%%i}"
- if "!RAM_GUID!"=="" (
- set "ERROR_MSG=创建RAM磁盘设备失败"
- goto ERROR_HANDLER
- )
- bcdedit /set !RAM_GUID! ramdisksdidevice partition=!INSTALL_DRIVE! >nul 2>&1 || (
- set "ERROR_MSG=设置RAM磁盘设备失败"
- goto ERROR_HANDLER
- )
- bcdedit /set !RAM_GUID! ramdisksdipath \boot\boot.sdi >nul 2>&1 || (
- set "ERROR_MSG=设置RAM磁盘路径失败"
- goto ERROR_HANDLER
- )
- echo √ RAM磁盘设备创建成功
- call :LOG "RAM磁盘设备创建成功: !RAM_GUID!"
- :: 创建PE启动项
- echo.
- echo 正在创建PE启动项...
- bcdedit /create !PE_GUID! /d "!PE_NAME!" /application osloader >nul 2>&1 || (
- set "ERROR_MSG=创建PE启动项失败"
- goto ERROR_HANDLER
- )
- if !UEFI_MODE! equ 1 (
- bcdedit /set !PE_GUID! path \windows\system32\boot\winload.efi >nul 2>&1
- bcdedit /set !PE_GUID! highestmode on >nul 2>&1
- ) else (
- bcdedit /set !PE_GUID! path \windows\system32\boot\winload.exe >nul 2>&1
- )
- :: 配置启动参数
- bcdedit /set !PE_GUID! device ramdisk=[!INSTALL_DRIVE!]\boot\boot.wim,!RAM_GUID! >nul 2>&1 || (
- set "ERROR_MSG=设置启动设备失败"
- goto ERROR_HANDLER
- )
- bcdedit /set !PE_GUID! osdevice ramdisk=[!INSTALL_DRIVE!]\boot\boot.wim,!RAM_GUID! >nul 2>&1 || (
- set "ERROR_MSG=设置OS设备失败"
- goto ERROR_HANDLER
- )
- bcdedit /set !PE_GUID! systemroot \windows >nul 2>&1
- bcdedit /set !PE_GUID! detecthal on >nul 2>&1
- bcdedit /set !PE_GUID! winpe on >nul 2>&1
- echo √ PE启动项配置成功
- call :LOG "PE启动项创建成功"
- :: 配置启动菜单
- echo.
- echo 正在配置启动菜单...
- bcdedit /displayorder !PE_GUID! /addlast >nul 2>&1 && echo √ 添加启动菜单项 || echo ! 添加启动菜单项失败
- bcdedit /timeout !TIMEOUT! >nul 2>&1 && echo √ 设置启动超时!TIMEOUT!秒 || echo ! 设置启动超时失败
- bcdedit /set {bootmgr} displaybootmenu yes >nul 2>&1
- bcdedit /set {bootmgr} bootmenupolicy legacy >nul 2>&1 && echo √ 配置启动菜单样式 || echo ! 配置启动菜单样式失败
- call :LOG "启动菜单配置完成"
- :: 第二阶段:复制文件并检查目标文件
- echo.
- echo 正在复制PE文件到 !INSTALL_DRIVE!\boot ...
- if not exist "!INSTALL_DRIVE!\boot" (
- md "!INSTALL_DRIVE!\boot" >nul 2>&1 && echo √ 创建boot目录 || echo ! 创建boot目录失败
- )
- attrib +h +s "!INSTALL_DRIVE!\boot" >nul 2>&1 && echo √ 设置目录隐藏属性 || echo ! 设置目录属性失败
- copy /y "%~dp0boot\boot.sdi" "!INSTALL_DRIVE!\boot" >nul 2>&1 && echo √ 复制boot.sdi文件 || echo ! 复制boot.sdi失败
- copy /y "%~dp0boot\boot.wim" "!INSTALL_DRIVE!\boot" >nul 2>&1 && echo √ 复制boot.wim文件 || echo ! 复制boot.wim失败
- :: 验证文件复制并检查目标文件大小
- if exist "!INSTALL_DRIVE!\boot\boot.sdi" (
- echo √ boot.sdi文件验证成功
- ) else (
- set "ERROR_MSG=boot.sdi文件复制失败"
- goto ERROR_HANDLER
- )
- if exist "!INSTALL_DRIVE!\boot\boot.wim" (
- for %%F in ("!INSTALL_DRIVE!\boot\boot.wim") do set "WIM_SIZE=%%~zF"
- set "WIM_SIZE_CHECKED=1"
- echo √ boot.wim文件复制成功(大小: !WIM_SIZE! 字节)
- ) else (
- set "ERROR_MSG=boot.wim文件复制失败"
- goto ERROR_HANDLER
- )
- call :LOG "PE文件复制完成,目标boot.wim大小: !WIM_SIZE! 字节"
- :: 第三阶段:根据最终文件大小显示提醒
- if !WIM_SIZE_CHECKED! equ 1 (
- if !WIM_SIZE! equ 0 (
- echo.
- echo ========================================
- echo 重要提醒
- echo ========================================
- echo.
- echo [注意] 安装的 boot.wim 文件大小为 0 字节!
- echo.
- echo 可能原因:
- echo 1. 源文件下载不完整
- echo 2. 源文件损坏
- echo 3. 复制过程中出现问题
- echo.
- echo 安装已完成,但PE系统将无法正常启动。
- echo 目标文件: !INSTALL_DRIVE!\boot\boot.wim
- echo 文件大小: 0 字节
- echo.
- call :LOG "警告: 安装的boot.wim文件大小为0字节"
- ) else if !WIM_SIZE! LSS 10000000 (
- echo.
- echo [警告] 安装的 boot.wim 文件大小较小 (!WIM_SIZE! 字节)
- echo 正常的PE系统文件通常大于10MB
- call :LOG "警告: 安装的boot.wim文件大小较小"
- ) else (
- echo √ 安装的 boot.wim 文件大小正常
- )
- )
- :: 安装完成
- echo.
- echo ========================================
- echo 安装成功完成!
- echo ========================================
- echo.
- echo 启动项名称: !PE_NAME!
- echo 启动模式: !UEFI_MODE! (0=Legacy, 1=UEFI)
- echo 启动超时: !TIMEOUT! 秒
- echo 安装位置: !INSTALL_DRIVE!\boot\
- echo 最终文件大小: !WIM_SIZE! 字节
- if !NO_LOG! equ 1 ( :: 开启日志时显示日志文件信息
- echo 日志文件: !LOG_FILE!
- )
- echo.
- :: 根据最终文件大小显示特殊提醒
- if !WIM_SIZE_CHECKED! equ 1 (
- if !WIM_SIZE! equ 0 (
- echo ========================================
- echo 重要后续操作提醒
- echo ========================================
- echo.
- echo [重要] 检测到安装的 boot.wim 文件大小为 0 字节!
- echo.
- echo 安装已完成,但PE系统无法正常启动。
- echo 请执行以下操作:
- echo 1. 获取有效的 boot.wim 文件
- echo 2. 手动替换 !INSTALL_DRIVE!\boot\boot.wim
- echo 3. 重启后即可正常使用PE系统
- echo.
- ) else if !WIM_SIZE! LSS 10000000 (
- echo [注意] 安装的PE文件较小,功能可能受限
- echo 建议使用完整的PE系统文件以获得最佳体验
- echo.
- )
- )
- echo 重启后可在启动菜单中选择PE系统
- echo.
- call :LOG "PE系统安装成功完成"
- set "SUCCESS=1"
- goto END
- :CHECK_EXISTING_PE
- set "EXISTING_INSTALL=0"
- set "EXISTING_PE_NAME=未知PE系统"
- set "EXISTING_TIMEOUT=5"
- set "EXISTING_INSTALL_DRIVE=C:"
- :: 检查GUID是否存在
- bcdedit /enum %PE_GUID% >nul 2>&1
- if errorlevel 1 goto :EOF
- :: 多重验证确保是PE系统
- set "IS_PE=0"
- :: 验证1:检查winpe属性
- bcdedit /enum %PE_GUID% | findstr /i "winpe.*yes" >nul && set "IS_PE=1"
- :: 验证2:检查ramdisk设备
- if !IS_PE! equ 0 (
- bcdedit /enum %PE_GUID% | findstr /i "ramdisk" >nul && set "IS_PE=1"
- )
- :: 验证3:检查osdevice是否为ramdisk
- if !IS_PE! equ 0 (
- bcdedit /enum %PE_GUID% | findstr /i "osdevice.*ramdisk" >nul && set "IS_PE=1"
- )
- :: 如果不是PE系统,退出
- if !IS_PE! equ 0 goto :EOF
- set "EXISTING_INSTALL=1"
- :: 提取名称
- for /f "tokens=1,* delims= " %%a in ('bcdedit /enum %PE_GUID% ^| findstr /i /c:"description"') do (
- if /i "%%a"=="description" set "EXISTING_PE_NAME=%%b"
- )
- :: 如果方法1失败,尝试另一种格式
- if "!EXISTING_PE_NAME!"=="未知PE系统" (
- for /f "tokens=2*" %%i in ('bcdedit /enum %PE_GUID% ^| findstr /i /c:"description"') do (
- set "EXISTING_PE_NAME=%%j"
- )
- )
- :: 获取超时时间
- for /f "tokens=1,* delims= " %%a in ('bcdedit /enum {bootmgr} ^| findstr /i /c:"timeout"') do (
- if /i "%%a"=="timeout" set "EXISTING_TIMEOUT=%%b"
- )
- :: 获取安装位置
- for /f "tokens=2 delims=[]" %%i in ('bcdedit /enum %PE_GUID% ^| findstr /c:"ramdisk"') do (
- set "EXISTING_INSTALL_DRIVE=%%i"
- )
- :: 清理前后的空格,保留中间的空格
- :TRIM_FRONT
- if not "!EXISTING_PE_NAME!"=="" if "!EXISTING_PE_NAME:~0,1!"==" " set "EXISTING_PE_NAME=!EXISTING_PE_NAME:~1!" && goto TRIM_FRONT
- :TRIM_BACK
- if not "!EXISTING_PE_NAME!"=="" if "!EXISTING_PE_NAME:~-1!"==" " set "EXISTING_PE_NAME=!EXISTING_PE_NAME:~0,-1!" && goto TRIM_BACK
- :: 清理超时时间的空格
- set "EXISTING_TIMEOUT=!EXISTING_TIMEOUT: =!"
- goto :EOF
- :CONFIG_NAME
- echo.
- set /p "NEW_PE_NAME=请输入新的启动项名称 (当前: !PE_NAME!): "
- if "!NEW_PE_NAME!"=="" (
- echo 名称未修改
- ) else (
- set "PE_NAME=!NEW_PE_NAME!"
- set "CONFIG_MODIFIED=1"
- echo √ 启动项名称已修改为: !PE_NAME!
- )
- goto :eof
- :CONFIG_TIMEOUT
- echo.
- :RETRY_TIMEOUT
- set /p "NEW_TIMEOUT=请输入启动超时时间(1-30秒) (当前: !TIMEOUT!): "
- :: 检查是否为空
- if "!NEW_TIMEOUT!"=="" (
- echo 超时时间未修改
- goto :eof
- )
- :: 使用最基础的验证方法
- set "VALID_INPUT=0"
- :: 直接检查所有可能的有效值
- if "!NEW_TIMEOUT!"=="1" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="2" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="3" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="4" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="5" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="6" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="7" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="8" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="9" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="10" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="11" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="12" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="13" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="14" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="15" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="16" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="17" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="18" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="19" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="20" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="21" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="22" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="23" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="24" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="25" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="26" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="27" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="28" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="29" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="30" set "VALID_INPUT=1"
- if !VALID_INPUT! equ 0 (
- echo [错误] 请输入 1-30 之间的有效数字(可按Ctrl+C退出)
- goto RETRY_TIMEOUT
- )
- set "TIMEOUT=!NEW_TIMEOUT!"
- set "CONFIG_MODIFIED=1"
- echo √ 启动超时时间已修改为: !TIMEOUT! 秒
- goto :eof
- :CONFIG_DRIVE
- echo.
- set /p "NEW_DRIVE=请输入安装盘符(如 C: D: E:) (当前: !INSTALL_DRIVE!): "
- if "!NEW_DRIVE!"=="" (
- echo 安装盘符未修改
- goto :eof
- )
- call :VALIDATE_DRIVE "!NEW_DRIVE!"
- if errorlevel 1 (
- echo [错误] 盘符 !NEW_DRIVE! 无效或不可用
- goto :eof
- )
- set "INSTALL_DRIVE=!NEW_DRIVE!"
- set "CONFIG_MODIFIED=1"
- echo √ 安装盘符已修改为: !INSTALL_DRIVE!
- goto :eof
- :VALIDATE_DRIVE
- set "DRIVE_TO_CHECK=%~1"
- echo !DRIVE_TO_CHECK! | findstr /r "^[A-Z]:" >nul
- if errorlevel 1 exit /b 1
- if not exist "!DRIVE_TO_CHECK!" exit /b 1
- :: 检查盘符是否可写
- echo test > "!DRIVE_TO_CHECK!\test.tmp" 2>nul
- if errorlevel 1 exit /b 1
- del "!DRIVE_TO_CHECK!\test.tmp" 2>nul
- exit /b 0
- :REMOVE_EXISTING
- call :LOG "开始移除现有PE系统"
- bcdedit /enum %PE_GUID% >nul 2>&1 && (
- for /f "tokens=2 delims=," %%a in ('bcdedit /enum %PE_GUID% /v 2^>nul ^| find "ramdisk"') do (
- bcdedit /delete %%a /f >nul 2>&1 && echo √ 移除RAM磁盘项 || echo ! 移除RAM磁盘项失败
- )
- bcdedit /delete %PE_GUID% /f >nul 2>&1 && echo √ 移除PE启动项 || echo ! 移除PE启动项失败
- )
- :: 检查是否存在boot目录和文件
- set "BOOT_DIR_EXISTS=0"
- set "BOOT_FILES_EXIST=0"
- if exist "!INSTALL_DRIVE!\boot" set "BOOT_DIR_EXISTS=1"
- if exist "!INSTALL_DRIVE!\boot\boot.wim" set "BOOT_FILES_EXIST=1"
- if exist "!INSTALL_DRIVE!\boot\boot.sdi" set "BOOT_FILES_EXIST=1"
- if !BOOT_FILES_EXIST! equ 1 (
- echo.
- echo ========================================
- echo Boot文件清理选项
- echo ========================================
- echo.
- echo 检测到PE系统文件:
- if exist "!INSTALL_DRIVE!\boot\boot.wim" (
- for %%F in ("!INSTALL_DRIVE!\boot\boot.wim") do echo boot.wim: %%~zF 字节
- )
- if exist "!INSTALL_DRIVE!\boot\boot.sdi" (
- for %%F in ("!INSTALL_DRIVE!\boot\boot.sdi") do echo boot.sdi: %%~zF 字节
- )
- echo.
- echo 位置:!INSTALL_DRIVE!\boot\
- echo.
- choice /c YNC /m "请选择清理选项:[Y]删除所有文件 [N]保留文件 [C]取消操作"
-
- if errorlevel 3 (
- echo 操作已取消
- call :LOG "用户取消文件删除操作"
- goto :eof
- ) else if errorlevel 2 (
- echo √ 已保留PE系统文件
- call :LOG "用户选择保留PE文件"
- ) else if errorlevel 1 (
- :: 删除boot目录下的PE文件
- if exist "!INSTALL_DRIVE!\boot\boot.wim" (
- del "!INSTALL_DRIVE!\boot\boot.wim" >nul 2>&1 && echo √ 删除boot.wim || echo ! 删除boot.wim失败
- )
- if exist "!INSTALL_DRIVE!\boot\boot.sdi" (
- del "!INSTALL_DRIVE!\boot\boot.sdi" >nul 2>&1 && echo √ 删除boot.sdi || echo ! 删除boot.sdi失败
- )
-
- :: 检查是否删除空目录
- set "DIR_EMPTY=1"
- dir "!INSTALL_DRIVE!\boot" /b 2>nul | findstr . >nul && set "DIR_EMPTY=0"
-
- if !DIR_EMPTY! equ 1 (
- rd "!INSTALL_DRIVE!\boot" >nul 2>&1 && echo √ 删除空boot目录 || echo ! 删除boot目录失败
- ) else (
- echo √ 保留非空boot目录(可能包含其他文件)
- )
- call :LOG "用户选择删除PE文件"
- )
- ) else if !BOOT_DIR_EXISTS! equ 1 (
- echo.
- echo [信息] 检测到boot目录但未找到PE文件
- choice /c YN /t 10 /d n /m "是否删除boot目录?(10秒后自动选择否)"
- if errorlevel 2 (
- echo √ 保留boot目录
- ) else (
- rd "!INSTALL_DRIVE!\boot" >nul 2>&1 && echo √ 删除boot目录 || echo ! 删除boot目录失败
- )
- ) else (
- echo [信息] 未找到boot目录,无需清理文件
- )
- call :LOG "现有PE系统移除完成"
- goto :eof
- :MODIFY_NAME_ONLY
- echo.
- echo ========================================
- echo 仅修改PE启动项名称
- echo ========================================
- echo.
- echo 当前名称: !EXISTING_PE_NAME!
- echo.
- set /p "NEW_PE_NAME=请输入新的启动项名称: "
- if "!NEW_PE_NAME!"=="" (
- echo 名称未修改
- goto RETURN_TO_MENU
- )
- echo.
- echo 正在修改启动项名称...
- bcdedit /set !PE_GUID! description "!NEW_PE_NAME!" >nul 2>&1
- if !errorlevel! equ 0 (
- echo √ 启动项名称修改成功!
- echo 修改前: !EXISTING_PE_NAME!
- echo 修改后: !NEW_PE_NAME!
- echo.
-
- :: 日志记录函数
- call :LOG "修改PE启动项名称"
- call :LOG "修改前: !EXISTING_PE_NAME!"
- call :LOG "修改后: !NEW_PE_NAME!"
- call :LOG "修改PE名称成功"
-
- :: 更新现有名称变量,以便菜单显示最新名称
- set "EXISTING_PE_NAME=!NEW_PE_NAME!"
-
- ) else (
- echo [错误] 修改启动项名称失败,请检查管理员权限
- call :LOG "错误: 修改PE启动项名称失败"
- )
- :RETURN_TO_MENU
- echo.
- echo 正在返回菜单...
- timeout /t 2 >nul
- :: 修复:直接返回到调用点,不退出
- exit /b 0
- :MODIFY_TIMEOUT_ONLY
- echo.
- echo ========================================
- echo 仅修改启动超时时间
- echo ========================================
- echo.
- echo 当前超时: !EXISTING_TIMEOUT! 秒
- echo.
- :RETRY_TIMEOUT_ONLY
- set /p "NEW_TIMEOUT=请输入启动超时时间(1-30秒): "
- :: 检查是否为空
- if "!NEW_TIMEOUT!"=="" (
- echo 超时时间未修改
- goto RETURN_TO_MENU2
- )
- :: 使用最基础的验证方法 - 逐个数字检查
- set "VALID_INPUT=0"
- :: 直接检查所有可能的有效值
- if "!NEW_TIMEOUT!"=="1" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="2" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="3" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="4" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="5" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="6" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="7" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="8" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="9" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="10" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="11" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="12" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="13" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="14" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="15" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="16" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="17" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="18" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="19" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="20" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="21" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="22" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="23" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="24" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="25" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="26" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="27" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="28" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="29" set "VALID_INPUT=1"
- if "!NEW_TIMEOUT!"=="30" set "VALID_INPUT=1"
- if !VALID_INPUT! equ 0 (
- echo [错误] 请输入 1-30 之间的有效数字(可按Ctrl+C退出)
- goto RETRY_TIMEOUT_ONLY
- )
- echo.
- echo 正在修改启动超时时间...
- bcdedit /timeout !NEW_TIMEOUT! >nul 2>&1
- if !errorlevel! equ 0 (
- echo √ 启动超时时间修改成功!
- echo 修改前: !EXISTING_TIMEOUT! 秒
- echo 修改后: !NEW_TIMEOUT! 秒
- echo.
-
- call :LOG "修改启动超时时间"
- call :LOG "修改前: !EXISTING_TIMEOUT! 秒"
- call :LOG "修改后: !NEW_TIMEOUT! 秒"
- call :LOG "修改超时成功"
- :: 更新现有超时变量,以便菜单显示最新值
- set "EXISTING_TIMEOUT=!NEW_TIMEOUT!"
- ) else (
- echo [错误] 修改启动超时失败,请检查管理员权限
- call :LOG "错误: 修改启动超时失败"
- )
- :RETURN_TO_MENU2
- echo.
- echo 正在返回菜单...
- timeout /t 2 >nul
- :: 修复:直接返回到调用点,不退出
- exit /b 0
- :: 日志记录函数
- :LOG
- if !NO_LOG! equ 0 goto :eof :: 如果关闭日志,直接退出
- set "LOG_MESSAGE=%~1"
- for /f "tokens=1-3 delims=/ " %%a in ('date /t') do set "LOG_DATE=%%c-%%a-%%b"
- :: 使用 %TIME% 获取包含秒数的完整时间
- set "CURRENT_TIME=%TIME%"
- :: 处理时间格式,确保始终是 HH:MM:SS 格式
- :: 移除可能的空格并确保两位数格式
- if "%CURRENT_TIME:~1,1%"==":" (
- set "LOG_TIME=0%CURRENT_TIME:~0,1%:%CURRENT_TIME:~2,2%:%CURRENT_TIME:~5,2%"
- ) else (
- set "LOG_TIME=%CURRENT_TIME:~0,2%:%CURRENT_TIME:~3,2%:%CURRENT_TIME:~6,2%"
- )
- echo [!LOG_DATE! !LOG_TIME!] !LOG_MESSAGE! >> "!LOG_FILE!"
- goto :eof
- :ERROR_HANDLER
- echo.
- echo ========================================
- echo 安装过程中出现错误
- echo ========================================
- echo.
- echo [错误] !ERROR_MSG!
- echo.
- echo 请检查:
- echo 1. 是否具有管理员权限
- echo 2. boot目录下的文件是否完整
- echo 3. 系统BCD存储是否正常
- echo 4. 目标盘符 !INSTALL_DRIVE! 是否可写
- echo.
- if !NO_LOG! equ 1 ( :: 开启日志时显示日志文件信息
- echo 详细日志请查看: !LOG_FILE!
- call :LOG "错误: !ERROR_MSG!"
- )
- echo.
- pause
- goto END
- :END
- if !SUCCESS! equ 1 (
- echo.
- if !WIM_SIZE_CHECKED! equ 1 (
- if !WIM_SIZE! equ 0 (
- echo [注意] 由于boot.wim文件为0字节,建议先修复再重启
- choice /t 15 /d n /c yn /m "是否立即重启电脑?(建议选择否,先修复boot.wim文件)"
- ) else if !WIM_SIZE! LSS 10000000 (
- choice /t 15 /d n /c yn /m "是否立即重启电脑?(PE文件较小,功能可能受限)"
- ) else (
- choice /t 15 /d n /c yn /m "是否立即重启电脑?(15秒后自动选择否)"
- )
- ) else (
- choice /t 15 /d n /c yn /m "是否立即重启电脑?(15秒后自动选择否)"
- )
-
- if errorlevel 2 (
- echo.
- echo 安装完成!请手动重启电脑以使用PE系统
- echo 下次启动时选择"!PE_NAME!"即可进入PE环境
- if !WIM_SIZE_CHECKED! equ 1 (
- if !WIM_SIZE! equ 0 (
- echo [重要] 重启前请先替换有效的 boot.wim 文件
- )
- )
- pause
- ) else (
- echo.
- echo 正在准备重启电脑...
- echo 系统将在5秒后重启,请保存所有工作
- shutdown /r /t 5 /c "PE系统安装完成,系统即将重启"
- echo 重启命令已发送...
- pause
- )
- )
- endlocal
- exit /b 0
复制代码
|
|