← 返回博客

PE 自动分区 + 一键安装 Windows 10:无人值守装机实战(DeployPE)

2026/8/9 08:00:00 · 插上 U 盘进 PE,DeployPE 自动把 WIM 铺进硬盘、分区、写无人值守、修引导、重启,全程无人值守装好 Win10。含选盘四层安全闸门防格错盘、自动跳过 OOBE 区域设置、12 阶段真实进度条,以及一路踩平的坑与解法。当前 v1.4,适合需要反复装同配置机器、又怕手滑格错盘的人。每一步都看得见,不黑盒。

这是 FirPE 项目的”安装线”折腾记录。上一篇《Windows 镜像无人值守部署:进桌面自动装驱动 + 烤机测试(FirstBootKit)》讲了怎么把 FirstBootKit 烘焙进镜像(自动化部署);这篇单独拆开讲 DeployPE——也就是插 U 盘进 PE 后,怎么把 WIM 一键铺进硬盘、分区、写无人值守、修引导、重启(自动化安装)。当前定稿 v1.4(build v2026.08.08-22)(成品署名 by风平雨静时)。

一、DeployPE 是干嘛的

烘焙线只解决了”镜像里有什么、进桌面后怎么跑”。但”把 WIM 铺到硬盘、分区、写无人值守、修引导、重启”这一步,原先还得人守着 PE 点。DeployPE 就是补这条线的——插 U 盘进 PE,自动把镜像铺好,重启后 FirstBootKit 接管。

当前版本(v1.4)仅内置 WIN10 的自动分区 + 自动安装镜像;WIN11 暂时得另做准备。后续计划在主界面加一个 WIN10 / WIN11 切换安装按钮,选完镜像自动走对应流水线——这篇先记 WIN10 这条线。

它和 FirstBootKit 是前后脚两条流水线:

  • DeployPE(安装线 / 自动化安装):在 PE 里把 WIM 铺硬盘、分区、写无人值守、修引导、重启;
  • FirstBootKit(部署线 / 自动化部署):重启进新系统后,在首次进桌面时自动跑装驱动 / 烤机 / 清工具。

二、形态:AutoHotkey 编译的单文件 exe

精简 PE 里没有 PowerShell / .NET,GUI 用 AutoHotkey(AHK v1.1) 写、编译成单文件 DeployPE.exe。用 FileInstallDeployPE.cmd + config.ini + wimlib-imagex.exe + libwim-15.dll + dp_capture.cmd + D.jpg 全内嵌,运行时自解压到 %TEMP%\DeployPE_Runtime\ 再调 cmd 后端;放 U 盘 \FirPE\Startup\ 即可。

重编译坑:必须用 Python subprocess.run([Ahk2Exe, "/in", 源, "/out", 目标, "/icon", ico, "/base", u64.bin]) 传 Windows 绝对路径,勿用 Git Bash 直调——MSYS 路径转换会改写 /in 后的绝对路径,报 “Blank or missing parameter for /in”(EXIT=3)。编译参数:/base Unicode 64-bit.bin /icon winlogo.ico

DeployPE v1.4 部署准备界面——选盘下拉框(自动排除 PE 启动盘/WinPE 内存盘/<32GB)、磁盘列表、系统自动重启勾选

三、版本演进:v1.0 → v1.4 一条线走通

从 8-06 到 8-08,DeployPE 的演进可以压成一条主线——先把”能铺盘”跑通,再补”铺得对、铺得稳、看得清”。具体踩平的编码 / 触发 / 重启控制权细节,集中在第十节「致命坑合集」,这里只看版本本身。

v1.0(8-06):形态定下来

  • 放弃 diskpart 直接 clean,改用纯用户态思路;
  • AHK 单文件 exe + FileInstall 内嵌后端,整体形态定稿;
  • 初版选盘用 <60GB 下限,结果虚拟机小盘被错杀、大 U 盘反被选(后面才改成四层闸门);
  • GUI 落地,顺手踩了 AHK v1.1 的语法坑。

v1.1(8-07):把”跑通”补成”靠谱”

  • 修首版”显示成功但不部署 / 不重启”的链路问题;
  • 日志落 U 盘、修”完全没自动重启”、倒计时窗卡死、进度窗卡住;
  • 修 UEFI 引导与 wimlib 释放路径转义,unattend 跳 OOBE 生效;
  • exitcode 路径统一、日志编码统一 CP936、Trim 去换行——这版起版本号机制落地。

v1.2 → v1.4(8-08):打磨体验、定稿

  • 日志镜像 U 盘根、进度条改成 12 阶段真实映射、选盘反查修对;
  • UI 美化(标题”系统部署完成!!!“、确认窗 + 重启窗统一 10 秒倒计时);
  • v1.4(build v2026.08.08-22)定稿。

四、整体流程

进 PE 桌面 → 自动枚举磁盘 + 选盘 → wimlib 释放 WIM
  → 写 unattend → bcdboot 修引导 → 固件 BootNext(bcdedit)
  → AHK 弹 10 秒重启倒计时窗 → 重启进新系统(FirstBootKit 接管)

五、选盘安全闸门(最阴的坑)

最初想用 <60GB 排除 U 盘,结果虚拟机 40G 目标盘被错杀100G+ 的 U 盘反被选去 clean 而它正被锁 → diskpart 连环报”系统找不到指定的路径”。正确做法是排除”脚本所在的 PE 启动盘本身”:

  • :get_boot_disk%~dp0 反查 U 盘物理盘号排除;
  • :get_ram_disk 排除 WinPE 内存盘 X:
  • <32GB 兜底(典型 PE 引导小分区 / 装不下 Windows);
  • 自动选盘四层过滤:排除启动盘 + 排除内存盘 + 排除 <32GB + 剩余选容量最大;
  • 无法判定启动盘则 fail-closed 不自动选,逼手动填 DISK_INDEX,绝不冒险格 U 盘;
  • 分区按容量自动分档,用户只需确认,不手工覆盖:
目标盘容量分区方案
≤256 GB单分区
256–512 GB系统 200G + Data
512–1024 GB系统 300G + Data
>1024 GB系统 300G + Data + Data2

确认部署对话框——显示目标磁盘信息、红色数据丢失警告、9 秒自动倒计时、可取消转手动部署

六、无人值守与跳 OOBE

unattend 启用内置 Administrator + AutoLogon 空密码 + 关 OOBE + 关 UAC(ConsentPromptBehaviorAdmin=0 / PromptOnSecureDesktop=0);Microsoft-Windows-Deployment 组件在精简 WIM 可能不存在,得移除它、UAC 改到 oobeSystem 的 FirstLogonCommands;再加离线注册表兜底 reg load SOFTWARE 强制跳过。跳 OOBE 是整套命脉——否则部署完还卡区域设置页。

七、引导修复与固件 BootNext

  • 引导修复bcdboot 写引导;遇到 UEFI No Media 时回退 bootx64.efi fallback 保底;
  • 重启进硬盘(方案 C)bcdedit /set {fwbootmgr} bootsequence {bootmgr} 设固件 BootNext,确保重启直接进刚铺好的硬盘而非又回到 U 盘 PE。方案 A(disable U 盘引导)一度引入后移除,仅留方案 C。

八、重启控制权必须交给 AHK

.cmd 若自己 wpeutil reboot,PE 立即重启,AHK 的 CheckDone 检测不到 cmd 正常退出,倒计时窗永无机会弹。修复:.cmd 只写 DeployPE.exitcode=0 并记录”handing control to GUI”,由 AHK RebootConf / RebootNow10 秒(原 15 / 30 秒)倒计时窗处理重启,控制权交 GUI。

部署完成!!!——绿色大字提示、建议拔除 U 盘、5 秒自动重启倒计时(可立即重启或暂不重启)

九、进度可视化(用户:“目前不知道部署状态”)

原进度条是假条(BarVal+7 在 5~100 间来回弹)。改成按 12 个真实阶段 映射(start → locatewimlib → locatewim → firmware → enum → select → partition → apply → write_unattend → fixboot → bootdone → fwbootnext),WIM 释放阶段用 wimlib 真实百分比(Extracting file data: ... (P%))映射到 40-90%,右侧实时百分比文本 + 阶段前缀 【N/12】。各阶段区间:start 0-5 → locatewimlib 5-10 → locatewim 10-15 → firmware 15-18 → enum 18-25 → select 25-30 → partition 30-40 → apply 40-90% → write_unattend 90-93 → fixboot 93-97 → bootdone 97-99 → fwbootnext 99-100。

阶段进度区间说明
start0–5%启动
locatewimlib5–10%定位 wimlib
locatewim10–15%定位镜像
firmware15–18%固件准备
enum18–25%枚举磁盘
select25–30%选盘
partition30–40%分区
apply40–90%wimlib 真实释放百分比
write_unattend90–93%写无人值守
fixboot93–97%修引导
bootdone97–99%引导完成
fwbootnext99–100%设固件 BootNext

下面是部署过程中不同阶段的真实截图,可以看到进度条从【6/12】分区阶段一路走到【12/12】部署完成:

【6/12】已选定目标磁盘,准备分区——20%

【8/12】正在释放系统镜像(解压文件)——4%

【8/12】正在释放系统镜像(解压文件)——52%(wimlib 真实百分比映射到 40-90%)

【8/12】正在释放系统镜像(创建文件)——90%

【8/12】正在释放系统镜像(解压文件)——91%

【11/12】引导修复完成(bcdboot),即将重启——50%

十、致命坑合集(DeployPE 专属,8-06~8-08 一路踩)

  1. AHK v1.1 语法:函数内 if (x) { 同行左大括号非法 → 得换行 / 单行去大括号;字面值 %`% 转义;对象属性不能用于 %...% 传统替换。
  2. 控件变量必须 global:函数内 Gui, Add, vXxx 默认局部,漏 global 直接报 “A control’s variable must be global”。
  3. 连续 call :子程序 触发 cmd 解析器 bug → 整个部署执行两遍:在每对连续 call : 之间插 echo. >nul 打断链(rem 会吞输出,必须用 echo. >nul)。
  4. get_boot_diskSCRIPT_DIR 首字母定位启动盘:PE 里脚本解压在 RAM 盘 X:select volume X 找不到物理盘 → 自动选盘失败。改用 GUI 经 DP_USB_DRIVE 传的真实 U 盘盘符。
  5. 日志写瞎:AHK 优先写 A_Temp(X: RAM 盘),重启丢失,U 盘只留 1 行。改成优先直写 U 盘根 usbRoot . "DeployPE.log",找不到 U 盘才回退。
  6. AHK 与 cmd 的 exitcode 文件路径必须显式统一:AHK 读 A_Temp、cmd 写 %TEMP%,WinPE 下可能不同 → 误判失败。用 DP_EXITCODE_FILE 统一。
  7. 进度条阶段切换必须上限钳制:apply 推到 100 后进入 bootdone 不钳制会算成 150%。SetPhaseif (BarVal > hi) BarVal := hi
  8. AHK FileRead 必须显式 CP936:cmd 用 GBK 无 BOM 写日志,WinPE 代码页不一定是 GBK,AHK 默认按系统码读 → 中文解码错、正则匹配不到 TARGET_IMAGE_NAME=。统一 CP936。
  9. FileGetSize 做偏移是字节数,FileRead 解码后是字符数:GBK 中文字节 ≠ 字符,用字节当 SubStr 索引会截断多字节、正则匹配不到关键行。TailLog 直接读完整文件、用 StrLen 比较。
  10. Trim() 默认不去换行:cmd echo 0 > file"0\r\n"Trim(rcStr) 得到带换行的,与 "0" 不等 → 把成功误判失败。用 Trim(rcStr, " \t\r\n")
  11. wimlib 真释放 11GB Win10 成功(2026-08-07 验证):方案 C 确保重启进硬盘。
  12. 内部编译戳 v2026.08.08-NN 每次编译自增,配合对外版本号 DP_VERSION(v1.0→v1.4)便于区分 U 盘版本。

下载与使用

当前版本:DeployPE v1.4(build v2026.08.08-22),单文件 DeployPE.exe,成品署名 by风平雨静时

搭配使用(建议一起看):DeployPE(自动化安装)要配合《Windows 镜像无人值守部署:进桌面自动装驱动 + 烤机测试(FirstBootKit)》(自动化部署)里烘焙好的镜像一起用。DeployPE 负责把镜像铺进硬盘、装好 WIN10(系统安装);镜像里烤进的 FirstBootKit 负责进桌面后自动装驱动、跑烤机(驱动安装 + 系统测试)。两条线串起来,从系统安装 → 驱动安装 → 系统测试,全程无人值守——人只需要在 PE 里点一次”开始部署”,剩下交给流水线。

下载后怎么用

  1. DeployPE.exe 放到 PE 启动盘的桌面自启目录(本文演示用的是 FirPE,路径为 \FirPE\Startup\;其他 PE 镜像也可以,放到对应 PE 的桌面自启文件夹即可,单文件无需安装);
  2. 用该 U 盘启动目标机,进入 PE 桌面;
  3. 双击运行 DeployPE.exe,在「部署准备」界面确认目标磁盘(已自动排除 PE 启动盘 / WinPE 内存盘 / <32GB 小盘),按需勾选「系统自动重启」;
  4. 点「开始部署」→ 弹出确认框(9 秒倒计时自动开始,也可点「手动部署」立即执行);
  5. 等进度条走到 100%(12 阶段),提示「系统部署完成!!!」后拔除 U 盘,5 秒自动重启;
  6. 重启进新系统,FirstBootKit 接管自动装驱动 / 烤机 / 修运行库 / 清工具。

注意:部署会清空目标盘全部数据,请确保已备份。无法自动判定启动盘时 DeployPE 会 fail-closed 逼你手动填盘号,绝不冒险格 U 盘。

小结

DeployPE 解决的是”人守着 PE 点”这一步——把 WIM 铺进硬盘、分区、写无人值守、修引导、重启,全程一条 PE 里的流水线跑完,重启后 FirstBootKit 在首次进桌面接管收尾。它和 FirstBootKit 一前一后组成 FirPE 的完整自动化:DeployPE 负责安装线(自动化安装),FirstBootKit 负责部署线(自动化部署)。上篇《Windows 镜像无人值守部署:进桌面自动装驱动 + 烤机测试(FirstBootKit)》讲了烘焙 / 部署线,这篇补上安装线的细节——亿点点儿好玩的东西,也就这么一点点攒出来了。

本文也收录在首页「瞎搞」区 —— 返回瞎搞看更多折腾 →


常见问题

DeployPE 和 FirstBootKit 是什么关系?它俩谁是自动化安装、谁是自动化部署?

两条流水线。DeployPE 是"安装线"(自动化安装):在 PE 里把 WIM 铺进硬盘、分区、写无人值守、修引导、重启;重启进新系统后,FirstBootKit(已烤进镜像)接管自动装驱动、烤机、修运行库、清痕迹,它才是"部署线"(自动化部署)。前者在 PE 里跑,后者首次进桌面后跑。烘焙侧的完整记录见《Windows 镜像无人值守部署:进桌面自动装驱动 + 烤机测试(FirstBootKit)》。

为什么部署完后还卡在 OOBE 区域设置页?

说明 unattend 的跳 OOBE 没生效。常见根因:精简 WIM 里没有 Microsoft-Windows-Deployment 组件(得移除它、UAC 改到 oobeSystem 的 FirstLogonCommands),或 AutoLogon/内置 Administrator 没配对;DeployPE 还加了离线注册表兜底 `reg load` SOFTWARE 强制跳过。

选盘最阴的坑是什么?怎么防格错盘?

用 `<60GB` 排除 U 盘会错杀小目标盘、反选大 U 盘去 clean——diskpart 连环报"系统找不到指定的路径"。DeployPE 改成四层安全闸门:排除 PE 启动盘本身(diskpart 反查 U 盘物理盘)+ 排除 WinPE 内存盘 `X:` + 排除 <32GB> + 剩余选容量最大;无法判定启动盘就 fail-closed 逼手动填 DISK_INDEX,绝不冒险格 U 盘。

为什么进度条一开始是假的、后来才真实?

初版是 `BarVal+7` 在 5~100 间来回弹的假条,用户反馈"不知道部署状态"。改成按 12 个真实阶段映射,WIM 释放阶段用 wimlib 真实百分比(即 wimlib 输出的 Extracting file data 真实百分比)映射到 40-90%,右侧实时百分比 + 阶段前缀【N/12】。

重启为什么不能让 .cmd 自己 wpeutil reboot?

.cmd 若自己重启,PE 立即重启,AHK 的 CheckDone 检测不到 cmd 正常退出,15 秒倒计时窗永无机会弹。修复:.cmd 只写 exitcode 并记录"handing control to GUI",由 AHK 弹 10 秒(原 15/30 秒)倒计时窗处理重启,控制权交 GUI。