将可扩展性脚本添加到一键重置

OEM 可以插入自定义脚本,这些脚本在用户运行按钮重置功能时运行:保留我的文件删除所有内容

可以使用扩展性脚本或自动应用文件夹来还原无法以其他方式还原的常见自定义项,包括:

  • 开始菜单
  • 任务栏
  • OOBE
  • Unattend.xml 自定义项

此外,扩展性脚本可帮助执行其他任务,例如:

  • 修改数据或实用工具分区
  • 保存和还原“保留我的文件”功能通常不会保留的文件

注意

如果包含自动应用文件夹,则不应包含扩展性脚本。 如果同时包含自动应用文件夹和扩展性脚本,则会忽略自动应用文件夹。

关于添加扩展性脚本

若要添加可扩展脚本,必须了解以下概念:

  • 扩展点 - 在一键重置过程中的不同点,可在其中运行自定义脚本。
  • 扩展性脚本 - 在定义的扩展点运行的脚本。
  • 一键重置配置文件 (ResetConfig.xml) - 文件定义要在不同扩展点运行的脚本。

在恢复期间启用脚本

若要将可扩展脚本添加到按钮重置,请在 C:\Recovery\OEM 文件夹中添加以下所有内容:

  • 用于定义要运行的脚本的一键重置配置文件 (ResetConfig.xml)。
  • 扩展性脚本
  • 扩展性脚本所需的任何文件。

扩展性脚本

要求:

  • 脚本采用 .cmd 或 .exe 文件格式。
  • 脚本不依赖于默认 Windows RE 映像 (winre.wim) 中不存在的 Windows PE 可选组件。
  • 脚本不依赖于默认 Windows RE 映像 (winre.wim) 中不存在的二进制文件(例如 .exe 或 .dll 文件)。
  • 脚本在运行时不会显示图形用户界面 (GUI)。
  • 对于每个扩展点,脚本可在 5 分钟内完成所有预期功能。
  • 脚本不得修改驱动器号。 这可能会导致恢复失败。
  • 如果成功,脚本必须返回 0(零)。 如果一键重置收到非 0 值,则执行以下步骤:
    • 如果正在运行“保留我的文件”功能:所有系统更改将会回滚。 如果脚本或可执行文件是从 Windows“电脑设置”菜单启动的,系统将在 Windows 中重启。 如果脚本或可执行文件是从 Windows RE 或高级启动菜单启动的,则系统将保留在 Windows RE 中并显示错误消息。
    • 如果正在运行“删除所有内容”功能:将忽略失败。 脚本或可执行文件将继续执行重置过程的下一步骤并记录失败结果。

一键重置配置文件 (ResetConfig.xml)

添加一个 ResetConfig.xml 文件以指向一键重置扩展性脚本。

必须使用 UTF-8 文件类型保存此文件。 不要使用 ANSI 编码。 例如:在记事本中,依次单击“文件”、“另存为”。 在“编码”框中,选择“UTF-8”

保存此文件,并将其以 C:\Recovery\OEM\ResetConfig.xml 文件名复制到 Windows 映像中。

可以使用同一 ResetConfig.xml 文件来配置 Windows,以创建恢复媒体。 有关详细信息,请参阅部署一键重置功能

可以使用四个扩展点指向在“保留我的文件”或“删除所有内容”操作的开头和结尾附近运行的脚本。 对于常见的自定义项,通常只需要一个脚本,如以下示例脚本中所示。

扩展点

“保留我的文件”功能概括为以下步骤

  1. 电脑启动进入 Windows 恢复环境 (Windows RE)。
  2. 扩展点 A (BasicReset_BeforeImageApply):在此处添加一个脚本,以便在用户运行“保留我的文件”功能时复制默认不会迁移的文件、驱动程序或设置
  3. 收集用户帐户、设置和数据并将其移到临时位置。
  4. 使用 Windows 组件存储中的文件在临时位置构建操作系统的新副本。
  5. 存储在 C:\Recovery\Customizations 下的预配程序包中的自定义项将应用于新操作系统。
  6. 复制现有操作系统中的驱动程序并将其注入新操作系统。
  7. 预装的 Windows 应用将从其备份位置还原。
  8. 系统关键设置将应用于新操作系统。
  9. 现有操作系统将移到 C:\Windows.old。
  10. 新操作系统将移到操作系统卷的根目录。
  11. 扩展点 B (BasicReset_AfterImageApply):在此处添加一个脚本,以还原自定义项文件(unattend.xml、layoutmodification.xml),或还原可能已在扩展点 A 中备份的文件和设置
  12. 电脑将重启并进入新操作系统。
  13. 在首次启动期间,将重新应用用户数据和设置。

“删除所有内容”功能可概括为以下步骤

  1. 电脑启动进入 Windows 恢复环境 (Windows RE)。
  2. 从操作系统卷中删除用户帐户、数据和已安装的 Windows 应用与 Windows 桌面应用程序。
  3. 格式化数据卷(如果用户已请求)。
  4. 在操作系统和数据卷上执行数据擦除(如果用户已请求)。
  5. 扩展点 C (FactoryReset_AfterDiskFormat):在此处添加一个脚本,以根据需要重新配置数据分区重要提示:请勿修改 Windows 分区。
  6. 使用 Windows 组件存储中的文件在临时位置构建操作系统的新副本。
  7. 存储在 C:\Recovery\Customizations 下的预配程序包中的自定义项将应用于新操作系统。
  8. 复制现有操作系统中的驱动程序并将其注入新操作系统。
  9. 预装的通用 Windows 应用将从其备份位置还原。
  10. 删除现有操作系统。
  11. 新操作系统将移到操作系统卷的根目录。
  12. 扩展点 D (FactoryReset_AfterImageApply):在此处添加一个脚本,以还原自定义项文件(unattend.xml、layoutmodification.xml)
  13. 电脑将重启并进入新操作系统。
  14. OOBE 启动。

示例:还原“开始”菜单、任务栏、OOBE 和 unattend.xml 自定义项

下面是示例脚本和示例 ResetConfig.xml 文件,这些文件在 Windows 11 上的一键重置期间协同工作,以还原常见自定义项。 可以使用这些示例测试一键恢复。 若要使用这些示例进行测试:

  • 将以下内容保存到 C:\Recovery\OEM 文件夹中:
    • 示例脚本 CommonCustomizations.cmd
    • 一键重置配置文件 ResetConfig.xml
    • “开始”菜单配置文件的副本 (LayoutModification.json)
    • 任务栏配置文件的副本 (TaskbarLayoutModification.xml)
    • unattend.xml 文件的副本

下面是示例脚本和示例 ResetConfig.xml 文件,这些文件在 Windows 10 上的一键重置期间协同工作,以还原常见自定义项。 可以使用这些示例测试一键恢复。 若要使用这些示例进行测试:

  • 将以下内容保存到 C:\Recovery\OEM 文件夹中:
    • 示例脚本 CommonCustomizations.cmd
    • 一键重置配置文件 ResetConfig.xml
    • “开始”菜单配置文件的副本 (LayoutModification.xml)
    • 任务栏配置文件的副本 (TaskbarLayoutModification.xml)
    • unattend.xml 文件的副本
  • 将整个 OOBE 文件夹及其子文件夹 %WINDIR%\System32\Oobe\Info\ 复制到 C:\Recovery\OEM\OOBE\Info 中。

CommonCustomizations.cmd

此文件将自定义文件从恢复文件夹复制到恢复的 OS 中。

rem CommonCustomizations.cmd

rem Define %TARGETOS% as the Windows folder (This later becomes C:\Windows) 
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C

rem Define %TARGETOSDRIVE% as the Windows partition (This later becomes C:)
for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

rem Add back Windows settings, Start menu, Taskbar, and OOBE.xml customizations
copy "%TARGETOSDRIVE%\Recovery\OEM\Unattend.xml" "%TARGETOS%\Panther\Unattend.xml" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\LayoutModification.json" "%TARGETOSDRIVE%\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.json" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\TaskbarLayoutModification.xml" "%TARGETOS%\OEM\TaskbarLayoutModification.xml" /y
xcopy "%TARGETOSDRIVE%\Recovery\OEM\OOBE\Info" "%TARGETOS%\System32\Oobe\Info\" /s

rem Recommended: Create a pagefile for devices with 1GB or less of RAM.
wpeutil CreatePageFile /path=%TARGETOSDRIVE%\PageFile.sys /size=256

EXIT 0
rem CommonCustomizations.cmd

rem Define %TARGETOS% as the Windows folder (This later becomes C:\Windows) 
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C

rem Define %TARGETOSDRIVE% as the Windows partition (This later becomes C:)
for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

rem Add back Windows settings, Start menu, Taskbar, and OOBE.xml customizations
copy "%TARGETOSDRIVE%\Recovery\OEM\Unattend.xml" "%TARGETOS%\Panther\Unattend.xml" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\LayoutModification.xml" "%TARGETOSDRIVE%\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" /y
copy "%TARGETOSDRIVE%\Recovery\OEM\TaskbarLayoutModification.xml" "%TARGETOS%\OEM\TaskbarLayoutModification.xml" /y
xcopy "%TARGETOSDRIVE%\Recovery\OEM\OOBE\Info" "%TARGETOS%\System32\Oobe\Info\" /s

rem Recommended: Create a pagefile for devices with 1GB or less of RAM.
wpeutil CreatePageFile /path=%TARGETOSDRIVE%\PageFile.sys /size=256

EXIT 0

ResetConfig.xml

注意

此示例两次指向同一脚本,因此保留我的文件删除所有内容功能都可以使用它。

<?xml version="1.0" encoding="utf-8"?>
<!-- ResetConfig.xml -->
<Reset>
  <Run Phase="BasicReset_AfterImageApply">
    <Path>CommonCustomizations.cmd</Path>
    <Duration>2</Duration>
  </Run>
  <Run Phase="FactoryReset_AfterImageApply">
    <Path>CommonCustomizations.cmd</Path>
    <Duration>2</Duration>
  </Run>
  <!-- May be combined with Recovery Media Creator
       configurations – insert SystemDisk element here -->
</Reset>

保留和检索文件

借助“保留我的文件”功能,可以使用示例脚本来保留原本会被删除的文件,方法是将这些文件放置在内存中的临时位置。 无法使用“删除所有内容”功能来保留文件

如果需要,可以使用以下存储位置。

  • Windows PE RAM 驱动器 (X:)。 此虚拟驱动器由 Windows PE 创建,在执行“保留我的文件”过程中会保持活动状态。 可将它与“保留我的文件”功能配合使用,以便在刷新分区之前保存数据,并在完成分区刷新后还原数据。 可用内存量限制为系统上的 RAM 量,减去完全扩展后 Windows RE 工具所需的 RAM 量。 有关装载 Windows RE 和确定完全扩展的文件大小的说明,请参阅自定义 Windows RE

  • 指定的 OEM 分区。 可以在分区上留出额外的空间。 例如,可以在恢复映像分区上留出空间,并使用脚本临时分配驱动器号,然后将文件保存到该分区。 但是,如果用户使用恢复媒体将磁盘重新分区,则在恢复过程中,这些分区上的数据可能会丢失。

这些示例脚本保留 Windows 日志文件。 请将这些脚本保存在 C:\Recovery\OEM 文件夹中。

保留文件的示例 ResetConfig.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- ResetConfig.xml -->
   <Reset>
      <Run Phase="BasicReset_BeforeImageApply">
         <Path>SaveLogFiles.cmd</Path>
         <Duration>4</Duration>
      </Run>      
      <Run Phase="BasicReset_AfterImageApply">
         <Path>RetrieveLogFiles.cmd</Path>
         <Duration>2</Duration>
      </Run>
      <!-- May be combined with Recovery Media Creator
       configurations – insert SystemDisk element here -->
   </Reset>

保留文件的示例扩展性脚本

SaveLogFiles.cmd:将日志文件保存到内存中的临时文件夹

:rem == SaveLogFiles.cmd

:rem == 1. Use the registry to identify the location of
:rem       the new operating system and the primary hard
:rem       drive. For example, 
:rem       %TARGETOS% may be defined as C:\Windows
:rem       %TARGETOSDRIVE% may be defined as C:
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C

for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

:rem == 2. Copy old Windows logs to a temporary folder in memory
mkdir X:\Temp
xcopy %TARGETOS%\Logs\*.* X:\temp\OldLogs /cherkyi

EXIT 0

检索文件的示例扩展性脚本

RetrieveLogFiles.cmd:检索由 SaveLogFiles.cmd 脚本保存在内存中的文件

:rem == RetrieveLogFiles.cmd

:rem == This sample script retrieves the files that 
:rem    were saved in memory by 
:rem    SaveLogFiles.cmd,
:rem    and adds them back to the system.

:rem == 1. Use the registry to identify the location of
:rem       the new operating system and the primary drive.
:rem        
:rem       %TARGETOS% is the Windows folder 
:rem          (This later becomes C:\Windows)
:rem       %TARGETOSDRIVE% is the Windows partition 
:rem          (This later becomes C:)
for /F "tokens=1,2,3 delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RecoveryEnvironment" /v TargetOS') DO SET TARGETOS=%%C
for /F "tokens=1 delims=\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A

:rem == 2. Copy the old logs to the new OS 
:rem       at C:\Windows\OldLogs
mkdir %TARGETOS%\OldLogs
xcopy X:\Temp\OldLogs\* %TARGETOS%\OldLogs /cherkyi

EXIT 0

替代方法:部署后复制脚本

在用户完成 OOBE 后不久,恢复脚本即会从 C:\Recovery\OEM 文件夹移到恢复分区,即 R:\RecoveryImage\

如果在此操作发生之前使用了一键重置(这种情况不太可能),这些脚本可能无法运行。 为防止这种情况,可以在部署映像之后,将恢复文件直接复制到恢复分区,即 R:\RecoveryImage\

后续步骤

自定义一键重置体验后,接下来可将用于一键重置的恢复映像 (Install.wim) 部署到恢复映像分区。

若要将 Diskpart 脚本、ResetConfig.xml 文件和一键重置恢复映像 (install.wim) 复制到目标电脑的恢复映像分区,请按照部署一键重置功能主题中的说明操作。

一键重置概述

创建介质以运行一键重置功能

部署一键重置功能

REAgentC 命令行选项

ResetConfig XML 参考