在功能更新期间运行自定义操作

概述

IT 专业人员可以通过在功能更新期间和之后运行他们自己的自定义操作脚本来自定义功能更新。 从 Windows 10 版本 1803 开始提供自定义操作。

运行自定义操作

关于自定义操作

自定义操作是在功能更新过程中运行的 .cmd 脚本。 这些脚本可在功能更新的四个阶段中运行:

  1. 预安装阶段:此阶段是指安装程序已启动但兼容性检查尚未开始。 此阶段中的操作在 preinstall.cmd 中指定。 如果脚本失败,功能更新将会失败。
  2. 预提交阶段:此阶段是指应用功能更新并重启系统之前。 此阶段中的操作在 precommit.cmd 中指定。 如果脚本失败,功能更新将会失败。
  3. 卸载后阶段:此阶段是指用户启动卸载功能更新后。 此阶段中的操作在 postuninstall.cmd 中指定。 postuninstall.cmd是 Windows 10 版本 2004 的新功能。
  4. 完成:此阶段是指安装程序完成之后。 如果功能更新失败或必须回滚,则 failure.cmd 可用于执行自定义操作或撤消以前的自定义脚本的操作。 如果功能更新成功,则 success.cmd 可用于执行功能更新后的操作。 success.cmd是 Windows 10 版本 2004 的新功能。

自定义操作在由 Windows 安装程序安装的功能更新的过程中运行。 有些 Windows 功能更新会通过月度质量更新安装,然后通过“启用包”(用于激活 Windows 功能的小型可快速安装的“主开关”)来启用。 例如,从 Windows 10 版本 2004 更新到 Windows 10 版本 20H2。 通过启用包安装的功能更新不支持自定义操作。

自定义操作文件夹结构

自定义操作脚本会从 %windir%\System32\update\ 中的子文件夹中运行,具体取决于你是要为某一个升级还是要针对将来所有的升级来运行脚本。 Windows 安装程序会在以下位置自动查找这些脚本,如果它们存在,则将会运行它们:

Folder 说明
%windir%\System32\update\run Windows 安装程序将会迁移这些文件夹中的脚本,以便在将来的升级中运行它们。
%windir%\System32\update\runonce 此文件夹中的脚本将只在一次升级中运行,不会为将来的升级进行迁移。
%windir%\System32\update\run\<GUID>

%windir%\System32\update\runonce\<GUID>
创建独一无二的 GUID 来清晰标识你运行的每个脚本。 使用此 GUID 来命名 runrunonce 文件夹中的文件夹。
%windir%\System32\update\run\<GUID>\reflectdrivers

%windir%\System32\update\runonce\<GUID>\reflectdrivers
此文件夹中对启动至关重要的驱动程序将会反映出来。 请确保 reflectdrivers 文件夹只包含必要的一组加密驱动程序。 驱动程序比必要的多可能会对升级方案产生负面影响。 请参阅设备驱动程序,以详细了解反映的驱动程序。

如果更新失败或必须回滚,则 failure.cmd 脚本可用于执行自定义操作或撤消以前的自定义脚本的操作。 如果该脚本失败,更新将会失败。

自定义操作脚本位置和示例

脚本位置

下表显示了用于运行自定义操作的文件的文件夹路径结构:

运行(脚本将会迁移) 运行一次(脚本不会迁移)
%windir%\System32\update\run\<GUID>\preinstall.cmd %windir%\System32\update\runonce\<GUID>\preinstall.cmd
%windir%\System32\update\run\<GUID>\precommit.cmd %windir%\System32\update\runonce\<GUID>\precommit.cmd
%windir%\System32\update\run\<GUID>\postuninstall.cmd %windir%\System32\update\runonce\<GUID>\postuninstall.cmd
%windir%\System32\update\run\<GUID>\success.cmd %windir%\System32\update\runonce\<GUID>\success.cmd
%windir%\System32\update\run\<GUID>\failure.cmd %windir%\System32\update\runonce\<GUID>\failure.cmd
%windir%\System32\update\run\<GUID>\reflectdrivers\example1.inf %windir%\System32\update\runonce\<GUID>\reflectdrivers\example2.inf
%windir%\System32\update\run\<GUID>\reflectdrivers\example1.sys %windir%\System32\update\run\<GUID>\reflectdrivers\example2.sys

示例文件路径和名称

方案 文件位置示例
脚本部署数据 %windir%\system32\update\
迁移目录
将要迁移的脚本 %windir%\system32\update\run\
不会迁移的脚本 %windir%\system32\update\runonce\
具有 GUID 的文件夹路径 %windir%\system32\update\run\6971CB27-6F59-43CD-A764-969EE9BBCC1C\
具有 GUID 的脚本名称
%windir%\system32\update\run\6971CB27-6F59-43CD-A764-969EE9BBCC1C\preinstall.cmd
%windir%\system32\update\run\6971CB27-6F59-43CD-A764-969EE9BBCC1C\precommit.cmd
%windir%\system32\update\run\6971CB27-6F59-43CD-A764-969EE9BBCC1C\postuninstall.cmd
%windir%\system32\update\run\6971CB27-6F59-43CD-A764-969EE9BBCC1C\failure.cmd
%windir%\system32\update\run\6971CB27-6F59-43CD-A764-969EE9BBCC1C\success.cmd
%windir%\system32\update\runonce\6971CB27-6F59-43CD-A764-969EE9BBCC1C\preinstall.cmd
%windir%\system32\update\runonce\6971CB27-6F59-43CD-A764-969EE9BBCC1C\precommit.cmd
%windir%\system32\update\runonce\6971CB27-6F59-43CD-A764-969EE9BBCC1C\postuninstall.cmd
%windir%\system32\update\runonce\6971CB27-6F59-43CD-A764-969EE9BBCC1C\failure.cmd
%windir%\system32\update\runonce\6971CB27-6F59-43CD-A764-969EE9BBCC1C\success.cmd
反映的驱动程序文件夹 %windir%\system32\update\run\6971CB27-6F59-43CD-A764-969EE9BBCC1C\reflectdrivers\