Setup.exe应该用在哪?Windows.old文件夹非有不可吗?PE何时派上用场?细聊Windows系统升级机制
Setup.exe应该用在哪?Windows.old文件夹非有不可吗?PE何时派上用场?细聊Windows系统升级机制
本文开始时,先给你制造一些混乱.
Windows更新的方法和步骤你都听说过哪些?
- 设置中”更新和安全”在线下载安装更新
- 使用离线下载的更新包
- 使用Windows ISO安装镜像
- 在当前系统原位更新
- PE系统离线注入更新
- 使用DISM命令更新整合包
- Dism++安装更新
- 双击更新包进行更新
- ……
上面的方法真真假假,适用范围又各有不同.
今天笔者带你详细的了解一下,到底Windows更新哪些操作是必要的,哪些操作是不被允许的,微软和Windows的更新逻辑又是怎么样的.
正片开始
法则一:你永远不可能
你永远不可能使用ISO安装镜像在一个PE系统里离线升级Windows系统.
举例:
我的系统目前的版本是Windows10 22H2 19045.2262.我有一个Windows10 22H2 19045.6693的Windows ISO.我想用这个ISO升级我的Windows.
别想了,在PE里,完全无法做到更新这个Windows.因为使用完整的Windows安装映像升级Windows的时候,Windows升级并不等于单纯的文件替换.
※※ Windows 的“升级”本质是一个 运行中的安装程序(setup.exe)驱动的状态机:
- 扫描当前系统
- 判断可升级性
- 迁移注册表
- 迁移用户配置信息
- 写入新的版本信息
- 创建回滚还原点(Windows.old)
这些事情,只有setup.exe能够做到.
想必你也能理解了,setup.exe想要做到以上的事情,就必须要在一个”活的灵魂”上面运行.也就是他必须要在Windows系统里面运行,才能完成升级.在PE里的setup.exe是无法运行”升级Windows”的.
DISM永远也做不到上面的事情.DISM能做的最多的是替换文件.使用
1 | |
以上这两个命令,可以在PE中把离线Windows的winSxS系统组件更新到最新ISO里的版本.但是dism没有能力完全配置Windows升级,单纯的更新组件并不是升级Windows.这样的操作看似替换了系统文件,实际上再启动Windows后查看系统的版本,版本号不会发生变化,系统也不会发生改变.
简单来说:
DISM =
- 离线部署
- 文件/组件级
- 不负责系统“身份变更”
setup.exe =
- 运行安装
- 负责升级、迁移、回滚、版本写入
所以你把新系统文件“铺”进旧系统里,Windows 认为:我看到文件变了,但我没经历升级.
在PE里,Windows系统处于离线状态.我们只能部署,修复,覆盖Windows,而不能回滚,升级Windows.
升级Windows永远是Windows在线时才能进行的事情.
升级Windows永远只是setup.exe能做的事情.
所以,请记住:
你永远不可能使用ISO安装镜像在一个PE系统里离线更新Windows系统!
如果我们在PE里面运行setup.exe,选择保留个人文件和应用的升级方式安装Windows,那setup.exe直接报错:无法在WindowsPE环境下升级Windows.需要在Windows正常运行的环境中升级Windows.
你看微软都直接报错了,说明这事真的没法子了.
法则二:你永远不可能
你永远不可能阻止Windows.old文件夹产生.
只要是升级Windows,那么Windows.old文件夹就一定会出现.
- 升级前旧系统 = 回滚基础
- 回滚基础 = Windows.old
- 没有 Windows.old = 不允许升级
这是setup.exe内部强制逻辑.
我们唯一能做的,就是在Windows升级后及时把Windows.old文件夹删除.
C盘右键→属性→磁盘清理→清理系统文件→勾选Windows.old
法则三:你可以
你可以在PE系统中使用dism给Windows系统打更新补丁包.
在 PE 里能成功安装的,通常是这些种类的补丁包文件:
.msu.cab- 累积更新(LCU)
- 安全更新
- .NET 更新
- Servicing Stack Update(SSU)
用的工具通常是:
1 | |
或者Dism++直接导入.
更新包 ≠ 新 Windows
它只是在同一个身份下换组件.
一个特别关键、但很少有人注意到的事情:
你在 PE 里装更新包时,其实:
- 更新并没有真正完成
- 它只是:
- 导入新的WinSxS文件
- 标记为 Pending(预约状态)
- 等待下次正常启动
真正完成更新的是:
- TrustedInstaller
- Windows Modules Installer
- Session Manager
PE 只是预约了更新,
真正执行更新是在正常系统启动后.
※ 所以能够正常更新Windows的方法剩下了什么
- 使用Windows更新包在PE系统里安装更新.
- 使用Windows更新包在Windows系统里安装更新.
- 使用setup.exe在Windows系统里运行,选择保留个人文件和应用.
只有以上三种!!!
为什么setup.exe更新一次Windows那么慢?
不是因为拷文件慢,而是因为它在“证明自己没把你系统弄坏”.
setup.exe做的事情远不止释放文件到C盘.事实上:
- 全系统兼容性扫描
- 用户态 + 系统态双迁移
- 应用迁移(这是最慢的部分)
- 驱动重枚举
- 回滚系统构建
- Windows.old
- 回滚 BCD
- 回滚注册表快照
“我得保证你升级前的一切还能用.”
一致性验证,永远慢。
Windows.old 本身,也在拖慢升级:
在升级过程中:旧系统并不是简单移动,而是分批复制,校验,标记可回滚点
如果不勾选保留用户文件和应用程序,那还会有Windows.old吗?
是的,即使你不勾选保留个人文件和应用程序,依然会有 Windows.old.
不勾选保留个人文件和应用程序,Windows 仍然会:
- 把旧系统整体打包
- 放进
C:\Windows.old - 作为回滚基础
如果C盘空间不够了放不下Windows.old怎么办?
1️⃣ 直接拒绝升级
2️⃣ 升级中途失败并回滚
3️⃣ 强制你先释放空间,否则不让继续
你的反驳
你可能会说:我曾经在PE系统里使用Dism++的”释放映像”/“系统还原”功能释放了新版本系统的wim/esd文件,在**不勾选”格式化”**的情况下,根目录里生成了Windows.old.001文件夹,里面的内容就是原来版本的系统.
那你说为什么他命名为Windows.old.001,而不是Windows.old呢?
你还会说:我在启动系统后,使用”磁盘清理”,也扫描到了”以前安装的Windows系统文件“,也就是Windows.old.001文件夹,可以选择删除.
是的,DISM / DISM++ 也可以生成一个看起来像 Windows.old 的文件夹.
但它生成的不是“升级回滚用的 Windows.old”,而是:一个“被 Windows 识别为旧系统残留”的目录
所以,这个
Windows.old.001不能用于回滚,只是一个Windows的残骸而已.