PE 自动分区 + 一键安装 Windows 10:无人值守装机实战(DeployPE)
这是 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。用 FileInstall 把 DeployPE.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。

三、版本演进: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 |

六、无人值守与跳 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.efifallback 保底; - 重启进硬盘(方案 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 / RebootNow 弹 10 秒(原 15 / 30 秒)倒计时窗处理重启,控制权交 GUI。

九、进度可视化(用户:“目前不知道部署状态”)
原进度条是假条(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。
| 阶段 | 进度区间 | 说明 |
|---|---|---|
| start | 0–5% | 启动 |
| locatewimlib | 5–10% | 定位 wimlib |
| locatewim | 10–15% | 定位镜像 |
| firmware | 15–18% | 固件准备 |
| enum | 18–25% | 枚举磁盘 |
| select | 25–30% | 选盘 |
| partition | 30–40% | 分区 |
| apply | 40–90% | wimlib 真实释放百分比 |
| write_unattend | 90–93% | 写无人值守 |
| fixboot | 93–97% | 修引导 |
| bootdone | 97–99% | 引导完成 |
| fwbootnext | 99–100% | 设固件 BootNext |
下面是部署过程中不同阶段的真实截图,可以看到进度条从【6/12】分区阶段一路走到【12/12】部署完成:






十、致命坑合集(DeployPE 专属,8-06~8-08 一路踩)
- AHK v1.1 语法:函数内
if (x) {同行左大括号非法 → 得换行 / 单行去大括号;字面值%须`%转义;对象属性不能用于%...%传统替换。 - 控件变量必须
global:函数内Gui, Add, vXxx默认局部,漏global直接报 “A control’s variable must be global”。 - 连续
call :子程序触发 cmd 解析器 bug → 整个部署执行两遍:在每对连续call :之间插echo. >nul打断链(rem会吞输出,必须用echo. >nul)。 get_boot_disk用SCRIPT_DIR首字母定位启动盘:PE 里脚本解压在 RAM 盘X:,select volume X找不到物理盘 → 自动选盘失败。改用 GUI 经DP_USB_DRIVE传的真实 U 盘盘符。- 日志写瞎:AHK 优先写
A_Temp(X: RAM 盘),重启丢失,U 盘只留 1 行。改成优先直写 U 盘根usbRoot . "DeployPE.log",找不到 U 盘才回退。 - AHK 与 cmd 的 exitcode 文件路径必须显式统一:AHK 读
A_Temp、cmd 写%TEMP%,WinPE 下可能不同 → 误判失败。用DP_EXITCODE_FILE统一。 - 进度条阶段切换必须上限钳制:apply 推到 100 后进入 bootdone 不钳制会算成 150%。
SetPhase里if (BarVal > hi) BarVal := hi。 - AHK
FileRead必须显式 CP936:cmd 用 GBK 无 BOM 写日志,WinPE 代码页不一定是 GBK,AHK 默认按系统码读 → 中文解码错、正则匹配不到TARGET_IMAGE_NAME=。统一 CP936。 FileGetSize做偏移是字节数,FileRead解码后是字符数:GBK 中文字节 ≠ 字符,用字节当SubStr索引会截断多字节、正则匹配不到关键行。TailLog直接读完整文件、用StrLen比较。Trim()默认不去换行:cmdecho 0 > file写"0\r\n",Trim(rcStr)得到带换行的,与"0"不等 → 把成功误判失败。用Trim(rcStr, " \t\r\n")。- wimlib 真释放 11GB Win10 成功(2026-08-07 验证):方案 C 确保重启进硬盘。
- 内部编译戳
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 里点一次”开始部署”,剩下交给流水线。
下载后怎么用
- 把
DeployPE.exe放到 PE 启动盘的桌面自启目录(本文演示用的是 FirPE,路径为\FirPE\Startup\;其他 PE 镜像也可以,放到对应 PE 的桌面自启文件夹即可,单文件无需安装); - 用该 U 盘启动目标机,进入 PE 桌面;
- 双击运行
DeployPE.exe,在「部署准备」界面确认目标磁盘(已自动排除 PE 启动盘 / WinPE 内存盘 / <32GB 小盘),按需勾选「系统自动重启」; - 点「开始部署」→ 弹出确认框(9 秒倒计时自动开始,也可点「手动部署」立即执行);
- 等进度条走到 100%(12 阶段),提示「系统部署完成!!!」后拔除 U 盘,5 秒自动重启;
- 重启进新系统,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。