无忧启动论坛

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

[原创] 【最小安装器】WindowsSetup脚本

  [复制链接]
跳转到指定楼层
1#
发表于 昨天 20:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
纯粹的脚本式安装器,利用微软系统自身的命令完成渔船映像的解压与引导的修复。
由于是纯文本格式,明码无欺,不会篡改主页什么的,绝对安全!而且可以自己随意修改。
作为批处理脚本,为了这个小目标,这个已经写得够复杂了,但功能也够傻瓜(支持一键按到底),同时也够灵活(可单独执行其中某一项功能)。
这可能是世界上最小且功能相对齐全的系统安装器了!
请自行保存到记事本,保存为扩展名为cmd的文件,即可在PE环境使用。

@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!")

:: 加载全局变量(关键:跨菜单共享变量)
call :load_global_vars

:: 主程序入口
:main_menu
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                                                  ║
echo            ║         Windows系统部署工具(PE环境专用)        ║
echo            ║                                                  ║
echo            ║                    深山红叶                      ║
echo            ║                                                  ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║       1. 一键安装(包含下面所有步骤)            ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║       2. 展开 Windows 系统映像文件到硬盘         ║
echo            ║                                                  ║
echo            ║       3. 植入无人值守文件到目标系统              ║
echo            ║                                                  ║
echo            ║       4. 修复目标系统 EFI 引导                   ║
echo            ║                                                  ║
echo            ║       5. 退出工具                                ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║                                                  ║
echo            ║    【注意】                                      ║
echo            ║                                                  ║
echo            ║    务必事先做好硬盘的分区准备!                  ║
echo            ║    务必在操作前请备份重要数据!                  ║
echo            ║    本工具将引导您完成 Windows 安装部署。         ║
echo            ║                                                  ║
echo            ╚══════════════════════════════════════════════════╝
echo.
set /p choice=.               请选择操作(1-5):

if "%choice%"=="1" (
    call :deploy_system
    if errorlevel 1 goto main_menu
    call :deploy_unattend
    if errorlevel 1 goto main_menu
    call :repair_uefi
    goto main_menu
)
if "%choice%"=="2" (
    call :deploy_system
    goto main_menu
)
if "%choice%"=="3" (
    call :deploy_unattend
    goto main_menu
)
if "%choice%"=="4" (
    call :repair_uefi
    goto main_menu
)
if "%choice%"=="5" goto exit_tool
echo.
echo                【错误】选择无效,请重新输入!
pause >nul
goto main_menu

:: 部署Windows系统
:deploy_system
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                第一步:确认安装源                ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║    请挂载Windows安装映像到虚拟光驱或展开到U盘。  ║
echo            ║    然后确认Windows安装源文件位置:               ║
echo            ║    通常位于安装U盘或ISO挂载盘的sources目录下     ║
echo            ║    文件名应为install.wim或install.esd            ║
echo            ╚══════════════════════════════════════════════════╝
echo.

:input_source
echo.
set /p drive_letter=.               请输入安装文件所在的盘符(例如 F,不要冒号):
if "%drive_letter%"=="" (
    echo                【错误】盘符不能为空!
    goto input_source
)

set "drive_letter=%drive_letter::=%"
set "wim_path=%drive_letter%:\sources\install.wim"
set "esd_path=%drive_letter%:\sources\install.esd"

if exist "%wim_path%" (
    set "source_path=%wim_path%"
    echo.
    echo            找到 install.wim 文件:%wim_path%
) else if exist "%esd_path%" (
    set "source_path=%esd_path%"
    echo.
    echo            找到 install.esd 文件:%esd_path%
) else (
    echo                【错误】%drive_letter%:\sources\ 目录找不到 install.wim 或 install.esd 文件!
    pause >nul
    goto input_source
)

echo.
echo            [√] 安装源文件确认成功:%source_path%
echo.
echo            任意键继续……
set "GLOBAL_SOURCE_PATH=%source_path%"
call :save_global_vars  :: 保存变量到文件
pause >nul

:select_target
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                第二步:选择目标磁盘              ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║     即将展示所有磁盘列表。                       ║
echo            ║     请选择要安装Windows的目标磁盘。              ║
echo            ║     【警告】目标磁盘的数据将被覆盖!             ║
echo            ╚══════════════════════════════════════════════════╝
cls
echo.
echo.
echo                     当前计算机磁盘列表
echo  ========================================================

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  请根据磁盘容量信息确定要安装的目标磁盘。

:input_target_disk
echo.
set /p target_disk=  请输入目标磁盘编号(例如0):
if "%target_disk%"=="" (
    echo      【错误】输入不能为空!
    goto input_target_disk
)
cls
echo.
echo.
echo                     所选目标磁盘分区列表
echo  ========================================================
echo.

echo select disk %target_disk% > "%WORK_DIR%\list_part.txt"
echo list partition >> "%WORK_DIR%\list_part.txt"
diskpart /s "%WORK_DIR%\list_part.txt"
del "%WORK_DIR%\list_part.txt" >nul 2>&1

echo.
set /p target_partition=  请输入目标分区编号(例如 2 ):
if "%target_partition%"=="" (
echo.
    echo      【错误】输入不能为空!
    goto input_target_disk
)

set "temp_drive=X"
echo select disk %target_disk% > "%WORK_DIR%\assign_temp.txt"
echo select partition %target_partition% >> "%WORK_DIR%\assign_temp.txt"
echo assign letter=%temp_drive% >> "%WORK_DIR%\assign_temp.txt"
echo exit >> "%WORK_DIR%\assign_temp.txt"
diskpart /s "%WORK_DIR%\assign_temp.txt" >nul 2>&1

if not exist "%temp_drive%:\" (
echo.
    echo      【错误】无法访问目标分区!
    pause >nul
    goto input_target_disk
)

:: 保存目标磁盘/分区/盘符到全局变量
set "GLOBAL_TARGET_DRIVE=%temp_drive%"
set "GLOBAL_TARGET_DISK=%target_disk%"
set "GLOBAL_TARGET_PARTITION=%target_partition%"
call :save_global_vars  :: 持久化保存
echo  [√] 目标分区:磁盘%target_disk% 分区%target_partition% (%temp_drive%:),确认后请按任意键继续!
echo.
pause >nul

:select_image
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                第三步:选择系统版本              ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║                                                  ║
echo            ║       正在获取映像信息...                        ║
echo            ║                                                  ║
echo            ╚══════════════════════════════════════════════════╝
echo.
dism /Get-ImageInfo /ImageFile:"%GLOBAL_SOURCE_PATH%" > "%WORK_DIR%\image_info.txt" 2>&1

findstr /c:"索引:" "%WORK_DIR%\image_info.txt" >nul
if errorlevel 1 (
    echo                【错误】无法读取映像文件!
    pause >nul
    goto select_image
)

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

findstr /c:"索引: %image_index%" "%WORK_DIR%\image_info.txt" >nul
if errorlevel 1 (
    echo                【错误】索引号 %image_index% 不存在!
    goto input_index
)

set "GLOBAL_IMAGE_INDEX=%image_index%"
call :save_global_vars  :: 保存索引号
echo.
echo            [√] 已选择版本索引号:%image_index%
pause >nul

:confirm_install
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                重要警告                          ║
echo            ╚══════════════════════════════════════════════════╝
echo.
echo             【注意】目标分区 %GLOBAL_TARGET_DRIVE%: 上的所有数据将被永久删除!
echo.
set /p format_confirm=.               确认要格式化分区并安装系统吗?(输入YES继续):
if /i not "%format_confirm%"=="YES" (
echo.
    echo            操作已取消。
    call :remove_temp_drive
    pause >nul
    exit /b 1
)

:format_target
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                格式化目标分区                    ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║                                                  ║
echo            ║          正在格式化目标分区...                   ║
echo            ║                                                  ║
echo            ╚══════════════════════════════════════════════════╝
echo.
echo select disk %GLOBAL_TARGET_DISK% > "%WORK_DIR%\format.txt"
echo select partition %GLOBAL_TARGET_PARTITION% >> "%WORK_DIR%\format.txt"
echo format fs=NTFS quick label="Windows" >> "%WORK_DIR%\format.txt"
echo assign letter=%GLOBAL_TARGET_DRIVE% >> "%WORK_DIR%\format.txt"
echo exit >> "%WORK_DIR%\format.txt"
diskpart /s "%WORK_DIR%\format.txt"

if errorlevel 1 (
echo.
    echo                【错误】格式化失败!
    pause >nul
    exit /b 1
)

echo.
echo            [√] 格式化完成
pause >nul

:apply_image
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                应用系统映像                      ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║      正在应用系统映像到目标分区...               ║
echo            ║      这可能需要较长时间,请耐心等待...           ║
echo            ╚══════════════════════════════════════════════════╝
echo.
dism /Apply-Image /ImageFile:"%GLOBAL_SOURCE_PATH%" /Index:%GLOBAL_IMAGE_INDEX% /ApplyDir:%GLOBAL_TARGET_DRIVE%:\

if errorlevel 1 (
echo.
    echo                【错误】应用映像失败!
    pause >nul
    call :error_cleanup
    exit /b 1
)

:: 标记系统分区盘符(用于后续无人值守和引导修复)
set "GLOBAL_SYSTEM_DRIVE=%GLOBAL_TARGET_DRIVE%"
call :save_global_vars  :: 关键:保存系统分区信息
echo.
echo            [√] 系统映像应用成功!
pause >nul

call :repair_boot  :: 部署完成后自动修复引导
exit /b 0

:: 修复引导记录(基于目标磁盘和系统分区)
:repair_boot
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                修复引导记录                      ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║                                                  ║
echo            ║          正在修复系统引导...                     ║
echo            ║                                                  ║
echo            ╚══════════════════════════════════════════════════╝
echo.

:: 检查必要变量,若未定义则提示输入
if not defined GLOBAL_TARGET_DISK (
echo.
    echo            【提示】未找到目标磁盘信息,请手动输入
    set /p GLOBAL_TARGET_DISK=.               请输入目标磁盘编号(例如0):
    if "!GLOBAL_TARGET_DISK!"=="" (
echo.
        echo                【错误】磁盘编号不能为空!
        pause >nul
        exit /b 1
    )
)
if not defined GLOBAL_SYSTEM_DRIVE (
echo.
    echo            【提示】未能确定系统分区信息,请手动输入要植入的目标分区
echo.
    set /p GLOBAL_SYSTEM_DRIVE=.               请输入系统分区盘符(例如 X):
    if "!GLOBAL_SYSTEM_DRIVE!"=="" (
        echo                【错误】盘符不能为空!
        pause >nul
        exit /b 1
    )
    set "GLOBAL_SYSTEM_DRIVE=!GLOBAL_SYSTEM_DRIVE::=!"  :: 移除可能的冒号
)

set "target_disk=!GLOBAL_TARGET_DISK!"
set "system_drive=!GLOBAL_SYSTEM_DRIVE!"
set "esp_drive=S"

:: 在目标磁盘中查找ESP分区
echo select disk %target_disk% > "%WORK_DIR%\find_esp.txt"
echo list partition >> "%WORK_DIR%\find_esp.txt"
diskpart /s "%WORK_DIR%\find_esp.txt" | find "系统" > "%WORK_DIR%\esp_info.txt" 2>&1
diskpart /s "%WORK_DIR%\find_esp.txt" | find "EFI" >> "%WORK_DIR%\esp_info.txt" 2>&1

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 !esp_found! equ 1 (
    echo select disk %target_disk% > "%WORK_DIR%\assign_esp.txt"
    echo select partition !esp_partition! >> "%WORK_DIR%\assign_esp.txt"
    echo assign letter=%esp_drive% >> "%WORK_DIR%\assign_esp.txt"
    echo exit >> "%WORK_DIR%\assign_esp.txt"
    diskpart /s "%WORK_DIR%\assign_esp.txt" >nul 2>&1

    if exist "%esp_drive%:\" (
        :: 强制使用系统分区修复引导(解决盘符混乱问题)
        bcdboot %system_drive%:\Windows /s %esp_drive%: /f UEFI
        if errorlevel 1 (
echo.
            echo            【警告】UEFI引导创建失败,尝试BIOS引导...
            bcdboot %system_drive%:\Windows /s %esp_drive%: /f BIOS
        )
        set "GLOBAL_ESP_DRIVE=%esp_drive%"
        set "GLOBAL_ESP_PARTITION=!esp_partition!"
        call :save_global_vars
echo.
        echo            [√] 引导修复成功(目标磁盘%target_disk%,系统分区%system_drive%:)
    ) else (
echo.
        echo                【错误】ESP分区挂载失败,无法修复引导!
        pause >nul
        call :error_cleanup
        exit /b 1
    )
) else (
echo.
    echo                【错误】在目标磁盘%target_disk%中未找到ESP分区!
echo.
    echo            请确保目标磁盘已创建EFI系统分区(通常大小100-500MB)
    pause >nul
    call :error_cleanup
    exit /b 1
)

echo.
echo            [√] 引导修复完成!
call :cleanup
pause >nul
exit /b 0

:: 部署无人值守文件(确保生成到目标分区)
:deploy_unattend
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║             部署无人值守安装文件                 ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║                                                  ║
echo            ║        请先选择目标系统分区                      ║
echo            ║                                                  ║
echo            ╚══════════════════════════════════════════════════╝
echo.

:: 检查系统分区变量,未定义则提示输入
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"

echo.
echo            正在创建无人值守文件...
(
echo ^<?xml version="1.0" encoding="utf-8"?^>
echo ^<unattend xmlns="urn:schemas-microsoft-com:unattend"^>
echo   ^<settings pass="disabled"^>
echo     ^<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" language="neutral" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" publicKeyToken="31bf3856ad364e35" versionScope="nonSxS"^>
echo       ^<UserData^>
echo         ^<ProductKey^>
echo           ^<Key /^>
echo         ^</ProductKey^>
echo             ^<!-- 接受协议 --^>
echo             ^<AcceptEula^>true^</AcceptEula^>
echo       ^</UserData^>
echo       ^<RunSynchronous^>
echo             ^<!-- 此段放置绕过硬件检查及其他限制等必须在安装初期执行的命令 --^>
echo         ^<RunSynchronousCommand wcm:action="add"^>
echo           ^<Order^>1^</Order^>
echo           ^<Path^>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassTPMCheck /t REG_DWORD /d 1 /f^</Path^>
echo         ^</RunSynchronousCommand^>
echo         ^<RunSynchronousCommand wcm:action="add"^>
echo           ^<Order^>2^</Order^>
echo           ^<Path^>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassSecureBootCheck /t REG_DWORD /d 1 /f^</Path^>
echo         ^</RunSynchronousCommand^>
echo         ^<RunSynchronousCommand wcm:action="add"^>
echo           ^<Order^>3^</Order^>
echo           ^<Path^>reg add HKLM\SYSTEM\Setup\LabConfig /v BypassRAMCheck /t REG_DWORD /d 1 /f^</Path^>
echo         ^</RunSynchronousCommand^>
echo              ^<!-- 以下为非必须的命令 --^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>4^</Order^>
echo                 ^<Path^>reg add HKLM\System\Setup\LabConfig /v BypassStorageCheck /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>5^</Order^>
echo                 ^<Path^>reg add HKLM\System\Setup\LabConfig /v BypassCPUCheck /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>6^</Order^>
echo                 ^<Path^>reg add HKLM\SYSTEM\Setup\MoSetup /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo         ^</RunSynchronous^>
echo     ^</component^>
echo   ^</settings^>
echo   ^<settings pass="specialize"^>
echo     ^<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" language="neutral" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" publicKeyToken="31bf3856ad364e35" versionScope="nonSxS"^>
echo       ^<RunSynchronous^>
echo             ^<!-- 此段放置除安装初期必要命令外的其他所有注册表优化命令 --^>
echo         ^<RunSynchronousCommand wcm:action="add"^>
echo           ^<Order^>1^</Order^>
echo           ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE /v BypassNRO /t REG_DWORD /d 1 /f^</Path^>
echo         ^</RunSynchronousCommand^>
echo             ^<!-- 以下添加 --^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>2^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Systray /v HideSystray /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>3^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>4^</Order^>
echo                 ^<Path^>reg add HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>5^</Order^>
echo                 ^<Path^>reg add HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server /v fDenyTSConnections /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>6^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Dsh /v AllowNewsAndInterests /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>7^</Order^>
echo                 ^<Path^>reg add HKLM\SYSTEM\CurrentControlSet\Control\BitLocker /v PreventDeviceEncryption /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>8^</Order^>
echo                 ^<Path^>reg add HKLM\Software\Policies\Microsoft\Edge /v HideFirstRunExperience /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>9^</Order^>
echo                 ^<Path^>reg add HKLM\Software\Policies\Microsoft\Edge\Recommended /v BackgroundModeEnabled /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>10^</Order^>
echo                 ^<Path^>reg add HKLM\Software\Policies\Microsoft\Edge\Recommended /v StartupBoostEnabled /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>11^</Order^>
echo                 ^<Path^>reg add HKU\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\GameDVR /v AppCaptureEnabled /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>12^</Order^>
echo                 ^<Path^>reg add HKU\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced /v HideFileExt /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>13^</Order^>
echo                 ^<Path^>reg add HKU\.DEFAULT\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /v NoAutorun /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>14^</Order^>
echo                 ^<Path^>reg add HKU\.DEFAULT\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /v NoDriveTypeAutoRun /t REG_DWORD /d 255 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>15^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender /v DisableAntiSpyware /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>16^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender /v DisableRoutinelyTakingAction /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>17^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection /v DisableRoutinelyTakingAction /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>18^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection /v DisableIOAVProtection /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>19^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection /v DisableOnAccessProtection /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>20^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection /v DisableRealtimeMonitoring /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>21^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection /v DisableAsyncScanOnOpen /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>22^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Security Center /v FirstRunDisabled /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>23^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications /v DisableNotifications /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>24^</Order^>
echo                 ^<Path^>reg add HKU\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel /v "{20D04FE0-3AEA-1069-A2D8-08002B30309D}" /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>25^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /v NoDriveTypeAutoRun /t REG_DWORD /d 255 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>26^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer /v NoAutorun /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>27^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer /v SmartScreenEnabled /t REG_SZ /d off /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>28^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons /v 29 /t REG_SZ /d "%systemroot%\system32\imageres.dll,197" /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>29^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\MRT /v DontOfferThroughWUAU /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>30^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Policies\Microsoft\Windows NT\SystemRestore /v DisableSR /t REG_DWORD /d 1 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>31^</Order^>
echo                 ^<Path^>reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo             ^<RunSynchronousCommand wcm:action="add"^>
echo                 ^<Order^>32^</Order^>
echo                 ^<Path^>reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced /v HideFileExt /t REG_DWORD /d 0 /f^</Path^>
echo             ^</RunSynchronousCommand^>
echo       ^</RunSynchronous^>
echo     ^</component^>
echo   ^</settings^>
echo   ^<settings pass="oobeSystem"^>
echo             ^<!-- 此段放置启用内置的Administrator账户并自动登录的相关命令 --^>
echo     ^<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" language="neutral" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" publicKeyToken="31bf3856ad364e35" versionScope="nonSxS"^>
echo         ^<UserAccounts^>
echo             ^<AdministratorPassword^>
echo                 ^<Value^>^</Value^>
echo                 ^<PlainText^>true^</PlainText^>
echo             ^</AdministratorPassword^>
echo         ^</UserAccounts^>
echo         ^<AutoLogon^>
echo             ^<Username^>Administrator^</Username^>
echo             ^<Enabled^>true^</Enabled^>
echo             ^<LogonCount^>1^</LogonCount^>
echo             ^<Password^>
echo                 ^<Value^>^</Value^>
echo                 ^<PlainText^>true^</PlainText^>
echo             ^</Password^>
echo         ^</AutoLogon^>
echo       ^<OOBE^>
echo         ^<ProtectYourPC^>3^</ProtectYourPC^>
echo             ^<!-- 添加 --^>
echo             ^<HideEULAPage^>true^</HideEULAPage^>
echo             ^<HideOEMRegistrationScreen^>true^</HideOEMRegistrationScreen^>
echo             ^<HideOnlineAccountScreens^>true^</HideOnlineAccountScreens^>
echo             ^<HideWirelessSetupInOOBE^>true^</HideWirelessSetupInOOBE^>
echo             ^<NetworkLocation^>Work^</NetworkLocation^>
echo             ^<SkipUserOOBE^>true^</SkipUserOOBE^>
echo             ^<SkipMachineOOBE^>true^</SkipMachineOOBE^>
echo       ^</OOBE^>
echo         ^<FirstLogonCommands^>
echo             ^<!-- 首次登录时要运行的指令。此处为示例,请根据需要增删修改 --^>
echo             ^<SynchronousCommand wcm:action="add"^>
echo                 ^<Order^>1^</Order^>
echo                 ^<CommandLine^>%windir%\Panther\Optimizer.cmd^</CommandLine^>
echo                 ^<Description^>运行优化脚本^</Description^>
echo             ^</SynchronousCommand^>
echo         ^</FirstLogonCommands^>
echo       ^<TimeZone^>中国标准时间^</TimeZone^>
echo     ^</component^>
echo     ^<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" language="neutral" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" publicKeyToken="31bf3856ad364e35" versionScope="nonSxS"^>
echo       ^<InputLocale^>00000804^</InputLocale^>
echo       ^<SystemLocale^>zh-CN^</SystemLocale^>
echo       ^<UserLocale^>zh-CN^</UserLocale^>
echo       ^<UILanguage^>zh-CN^</UILanguage^>
echo       ^<UILanguageFallback^>en-US^</UILanguageFallback^>
echo     ^</component^>
echo     ^<component name="Microsoft-Windows-SecureStartup-FilterDriver" processorArchitecture="amd64" language="neutral" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" publicKeyToken="31bf3856ad364e35" versionScope="nonSxS"^>
echo       ^<PreventDeviceEncryption^>true^</PreventDeviceEncryption^>
echo     ^</component^>
echo     ^<component name="Microsoft-Windows-EnhancedStorage-Adm" processorArchitecture="amd64" language="neutral" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" publicKeyToken="31bf3856ad364e35" versionScope="nonSxS"^>
echo       ^<TCGSecurityActivationDisabled^>1^</TCGSecurityActivationDisabled^>
echo     ^</component^>
echo   ^</settings^>
echo ^</unattend^>

) > "!SOURCE_FILE!"

:: 确保目标目录存在(关键:解决目录不存在导致的生成失败)
if not exist "!TARGET_DIR!" (
    mkdir "!TARGET_DIR!" >nul 2>&1
    if errorlevel 1 (
echo.
        echo                【错误】无法创建目录 !TARGET_DIR!(权限不足或分区未挂载)
        pause >nul
        exit /b 1
    )
)

:: 复制无人值守文件到目标位置
copy /y "!SOURCE_FILE!" "!TARGET_FILE!" >nul 2>&1
if errorlevel 1 (
echo.
    echo                【错误】无法复制无人值守文件到 !TARGET_FILE!
    echo            请检查系统分区是否可写(是否已格式化且挂载)
    pause >nul
    exit /b 1
)

:: 验证文件是否生成成功
if exist "!TARGET_FILE!" (
echo.
    echo            [√] 无人值守文件部署成功:!TARGET_FILE!
) else (
    echo.
echo                【错误】无人值守文件生成失败!
    pause >nul
    exit /b 1
)

pause >nul
exit /b 0

:: 修复UEFI引导(独立功能,兼容单独调用)
:repair_uefi
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                UEFI引导修复工具                  ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║                                                  ║
echo            ║          下面开始修复 UEFI 引导                  ║
echo            ║                                                  ║
echo            ╚══════════════════════════════════════════════════╝
echo.

:: 检查并加载系统分区信息
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

:: 工具函数:移除临时盘符
:remove_temp_drive
if defined GLOBAL_TARGET_DRIVE (
    echo select disk %GLOBAL_TARGET_DISK% > "%WORK_DIR%\remove_temp.txt"
    echo select partition %GLOBAL_TARGET_PARTITION% >> "%WORK_DIR%\remove_temp.txt"
    echo remove letter=%GLOBAL_TARGET_DRIVE% >> "%WORK_DIR%\remove_temp.txt"
    echo exit >> "%WORK_DIR%\remove_temp.txt"
    diskpart /s "%WORK_DIR%\remove_temp.txt" >nul 2>&1
)
exit /b 0

:: 工具函数:清理临时文件和盘符
:cleanup
call :remove_temp_drive
if defined GLOBAL_ESP_DRIVE (
    echo select disk %GLOBAL_TARGET_DISK% > "%WORK_DIR%\remove_esp.txt"
    echo select partition %GLOBAL_ESP_PARTITION% >> "%WORK_DIR%\remove_esp.txt"
    echo remove letter=%GLOBAL_ESP_DRIVE% >> "%WORK_DIR%\remove_esp.txt"
    echo exit >> "%WORK_DIR%\remove_esp.txt"
    diskpart /s "%WORK_DIR%\remove_esp.txt" >nul 2>&1
)
exit /b 0

:: 错误清理
:error_cleanup
call :cleanup
exit /b 1

:: 退出工具
:exit_tool
cls
echo.
echo            ╔══════════════════════════════════════════════════╗
echo            ║                感谢使用                         ║
echo            ╠══════════════════════════════════════════════════╣
echo            ║                                                 ║
echo            ║    感谢使用Windows系统部署工具!                ║
echo            ║    请重启并完成后续安装过程……                 ║
echo            ║                                                 ║
echo            ╚══════════════════════════════════════════════════╝
echo.
rd /s /q "%WORK_DIR%" >nul 2>&1
endlocal  :: 最后退出时关闭局部环境
exit

点评

辛苦了 大哥功力深厚啊~~~~`  发表于 昨天 20:38
感谢分享!  发表于 昨天 20:23

评分

参与人数 4无忧币 +20 收起 理由
dfw9 + 5 赞一个!
xsm01 + 5 很给力!
freesoft00 + 5
海市蜃楼 + 5

查看全部评分

27#
发表于 1 小时前 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

26#
发表于 1 小时前 | 只看该作者
感谢分享
回复

使用道具 举报

25#
发表于 2 小时前 | 只看该作者
虽然各种工具很多,但这种纯脚本真是很佩服。
回复

使用道具 举报

24#
发表于 2 小时前 | 只看该作者
支持原创
回复

使用道具 举报

23#
发表于 3 小时前 | 只看该作者
简单易行,试试看,谢谢了
回复

使用道具 举报

22#
发表于 3 小时前 | 只看该作者
看到了顶一下,。
回复

使用道具 举报

21#
发表于 3 小时前 | 只看该作者
这么多耐心看完了
回复

使用道具 举报

20#
发表于 5 小时前 | 只看该作者
下来看看先谢谢
回复

使用道具 举报

19#
发表于 5 小时前 | 只看该作者
谢谢您的分享!
回复

使用道具 举报

18#
发表于 5 小时前 | 只看该作者
多谢楼主分享
回复

使用道具 举报

17#
发表于 6 小时前 | 只看该作者
原来是个安装脚本
回复

使用道具 举报

16#
发表于 6 小时前 | 只看该作者
感谢分享
回复

使用道具 举报

15#
发表于 7 小时前 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
发表于 7 小时前 | 只看该作者
最好是在卓面安装
回复

使用道具 举报

13#
发表于 9 小时前 | 只看该作者
挺厉害的,感谢分享
回复

使用道具 举报

12#
发表于 13 小时前 | 只看该作者
不错的代码!
回复

使用道具 举报

11#
发表于 昨天 21:12 | 只看该作者
深山红叶!以前的PE启动作者吗?

点评

嗯  发表于 昨天 21:27
回复

使用道具 举报

10#
发表于 昨天 20:58 | 只看该作者
感谢分享  谢谢
回复

使用道具 举报

9#
发表于 昨天 20:45 | 只看该作者
编码要注意下  

utf-8 不行  有乱码
ANSI  就好了

回复

使用道具 举报

8#
发表于 昨天 20:40 | 只看该作者
学习学习
回复

使用道具 举报

7#
发表于 昨天 20:35 | 只看该作者
感谢分享!
回复

使用道具 举报

6#
发表于 昨天 20:23 | 只看该作者
谢谢分享!
回复

使用道具 举报

5#
发表于 昨天 20:22 | 只看该作者
学习
回复

使用道具 举报

4#
发表于 昨天 20:20 | 只看该作者
非常实用的安装器
回复

使用道具 举报

3#
发表于 昨天 20:10 | 只看该作者
看起来有点复杂,用不上,支持~~~
回复

使用道具 举报

2#
发表于 昨天 20:07 | 只看该作者
学习学习
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-10-24 15:07

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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