冲突和优先级

当你包含、排除和重排文件和设置时,必须知道 用户状态迁移工具 (USMT) 5.0 如何处理冲突和优先级。当使用 USMT 时,必须注意以下最重要的冲突和优先级指南。

  • **如果组件内部的规则有冲突,则应用最具体的规则。**但是,<unconditionalExclude> 规则是一个例外,因为它优先于所有其他规则。 目录名称优先于文件扩展名。例如,参阅当 <include> 规则和 <exclude> 规则存存冲突时会发生什么事情?以及此主题稍后介绍的<include> 和 <exclude> 规则的优先级示例中的第一个示例。

  • **只有相同组件内部的规则会相互影响,视具体情况而定。**在不同组件中的规则不会相互影响,但 <unconditionalExclude> 规则除外。

  • **如果规则同样具体,则 <exclude> 优先于 <include>。**例如,如果你使用 <exclude> 规则排除某个文件,同时又使用 <include> 规则包含这个文件,则该文件将被排除。

  • **组件的排序无关紧要。**它并不影响哪个组件会在 .xml 文件中列示,因为每个组件都是独立处理的,与 .xml 文件中的其他组件无关。

  • <include> 和 <exclude> 规则在组件内部的排序无关紧要。

  • **你可以使用 <unconditionalExclude> 元件全面排除数据。**此元件排除各个对象,这与 .xml 文件中的任何其他 <include> 规则无关。例如,你可以使用 <unconditionalExclude> 元件排除计算机上的所有 MP3 文件,或排除 C:\UserData 中的所有文件。

本主题内容

概要

  • 位于不同组件内部的规则之间有何关系?

  • Config.xml 文件的优先级如何?

  • USMT 如何通过多个组件处理 .xml 文件中的各个组件?

  • 如何处理规则?

  • USMT 如何合并所有在命令行上指定的 .xml 文件?

<include> 和 <exclude> 规则

  • 当 <include> 规则和 <exclude> 规则存存冲突时会发生什么事情?

  • <include> 和 <exclude> 规则的优先级示例

文件冲突

  • 当存在文件冲突时,应执行哪些默认行为?

  • 当存在文件冲突时,应如何应用 <merge> 规则?

概要

位于不同组件内部的规则之间有何关系?

只有相同组件内部的规则会相互影响,视具体情况而定;但 <unconditionalExclude> 规则除外。不同组件中的规则不相互影响。如果在某个组件中有 <include> 规则,并且在另一个组件中包含相同的 <exclude> 规则,则数据将被迁移,因为这两个规则都是彼此独立的。

如果你在某个组件中拥有 <include> 规则,并且在相同文件的另一个组件中拥有 <locationModify> 规则,则文件将在两个地方迁移。即根据 <include> 规则包含该文件,并根据 <locationModify> 规则迁移该文件。

以下 .xml 文件将从 C:\Userdocs 中迁移所有文件(包含 .mp3 文件),因为已在独立组件中指定 <exclude> 规则。

<migration urlid="https://www.microsoft.com/migration/1.0/migxmlext/UserDocs">
<component type="Documents" context="System">
<displayName>User Documents</displayName>
        <role role="Data">
            <rules>
                <exclude>
                    <objectSet>
                        <pattern type="File">C:\Userdocs\* [*.mp3]</pattern>
                    </objectSet>
                </exclude>
          </rules>
        </role>
</component>

<component type="Documents" context="System">
<displayName> User documents to include </displayName>
        <role role="Data">
            <rules>
                <include>
                    <objectSet>
                        <pattern type="File"> C:\Userdocs\ [*]</pattern>
                    </objectSet>
                </include>
          </rules>
        </role>
</component>
</migration>

Config.xml 文件的优先级如何?

在 Config.xml 文件中指定 migrate="no" 的操作与从迁移 .xml 文件中删除相应文件的操作相同。但是,如果你为 My Documents 设置 migrate="no",而你拥有的规则与下文所述的迁移 .xml 文件(包含所有在 My Documents 中的文件)规则相类似,则将仅迁移 .doc 文件,并排除所有其他文件。

<include>
   <objectSet>
      <pattern type="File">%CSIDL_PERSONAL%\* [*.doc] </pattern>
   </objectSet>
</include> 

USMT 如何通过多个组件处理 .xml 文件中的各个组件?

组件的排序无关紧要。与独立于其他组件的形式处理每个组件。例如,如果你在某个组件中拥有 <include> 规则,并且在相同文件的另一个组件中拥有 <locationModify> 规则,则该文件将在两个地方迁移。即是,基于 <include> 规则将它包含,基于 <locationModify> 规则将它迁移。

如何处理规则?

有两大类规则。

  • 影响 ScanState 和 LoadState 工具的规则。例如,为 .xml 文件中的各个组件处理 <include>、<exclude> 和 <unconditionalExclude> 规则。USMT 为每个组件创建包含列表和排除列表。组件中的一些规则可能由于特定性而被丢弃,但其余所有规则得以处理。对于各项 <include> 规则,USMT 对多个元件进行循环访问,以看看是否有任何位置需要排除。USMT 枚举所有对象,并创建它即将为每个用户收集的对象列表。列表完成后,所有对象将存储或迁移到目标计算机。

  • 仅影响 LoadState 工具行为的规则。例如,<locationModify>、<contentModify> 和 <destinationCleanup> 规则并不影响 ScanState。它们仅可通过 LoadState 加以处理。首先,LoadState 工具基于 <locationModify> 和 <contentModify> 规则确定各个组件的内容和位置。然后,LoadState 处理所有 <destinationCleanup> 规则,并删除目标计算机的数据。最后,LoadState 将组件应用到计算机。

USMT 如何合并所有在命令行上指定的 .xml 文件?

USMT 无法基于文件名或内容分辨 .xml 文件。它对文件中的各个组件进行独立处理。USMT 仅支持多个 .xml 文件,以维持和整理这些文件中的组件。USMT 使用 UrlID 让各个组件相互分辨开来,从而确保你在命令行中指定的 .xml 文件拥有独特的迁移 UrlID。

<include> 和 <exclude> 规则

当 <include> 规则和 <exclude> 规则存存冲突时会发生什么事情?

如果组件内部有冲突的规则,则应用最具体的规则;但 <unconditionalExclude> 规则除外,因为它优先于所有其他规则。如果规则同样具体,则不可迁移数据。例如,如果你排除某个文件,随后包含相同文件,则不可迁移此文件。如果不同组件内部的规则有冲突,则规则并不相互影响,因为所有组件的处理都是独立完成的。

在以下示例中,mp3 文件将不从迁移中排除出来。因为目录名称优先于文件扩展名。

<include>
     <objectSet>
          <pattern type="File">C:\Data\* [*]</pattern>
     </objectSet>
</include>
<exclude>
     <objectSet>
          <pattern type="File"> C:\* [*.mp3]</pattern>
     </objectSet>
</exclude>  

<include> 和 <exclude> 规则的优先级示例

这些示例解释 USMT 如何处理 <include> 和 <exclude> 规则。当规则在不同组件中时,导致的行为将相同,不管组件是在相同还是不同的迁移 .xml 文件中。

  • 包含和排除文件

  • 包含和排除注册表对象

包含和排除文件

如果你在相同组件中拥有以下代码 导致的行为 说明
  • 包含规则:<pattern type="File">C:\Dir1\* [*]</pattern>

  • 排除规则:<pattern type="File">C:\* [*.txt]</pattern>

迁移 Dir1 中的所有文件和子文件夹(包含 C: 中的所有 .txt 文件)

<exclude> 规则并不影响迁移,因为 <include> 规则更为具体。

  • 包含规则:<pattern type="File">C:\Dir1\* [*]</pattern>

  • 排除规则:<pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

迁移 C:\Dir1 中的所有文件和子文件夹(除 C:\Dir1\Dir2 及其子文件夹中的 .txt 文件外)。

两种规则都按计划予以处理。

  • 包含规则:<pattern type="File">C:\Dir1\* [*]</pattern>

  • 排除规则:<pattern type="File">C:\Dir1\ * [*.txt]</pattern>

迁移 C:\Dir1 中的所有文件和子文件夹(除 C:\Dir1 中的 .txt 文件及其子文件夹外)。

两种规则都按计划予以处理。

  • 包含规则:<pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

  • 排除规则:<pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

将不迁移任何内容。

规则同样具体,因此 <exclude> 规则优先于<include>规则。

  • 包含规则:C:\Dir1\* [*.txt]

  • 排除规则:C:\Dir1\Dir2\* [*]

迁移 Dir1 以及子文件夹(而非 Dir2)中的 .txt 文件。

无文件从 Dir2 或其子文件夹中迁移出来。

两种规则都按计划予以处理。

  • 包含规则:C:\Dir1\Dir2\* [*]

  • 排除规则:C:\Dir1\* [*.txt]

迁移 Dir2 中的所有文件及其子文件夹除 Dir1 中的 .txt 文件以及 Dir1(包含 Dir2)中的任何子文件夹外。

两种规则都按计划予以处理。

如果你在不同组件中拥有以下代码 导致的行为 说明

组件 1:

  • 包含规则:<pattern type="File">C:\Dir1\* [*]</pattern>

  • 排除规则:<pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

组件 2:

  • 包含规则:<pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

  • 排除规则:<pattern type="File">C:\Dir1\* [*]</pattern>

迁移 C:\Dir1\(包含 C:\Dir1\Dir2\)的所有文件及其子文件夹。

不同组件中的规则不相互影响,但 <unconditionalExclude> 规则除外。因此,在此示例中,虽然在处理组件 1 时,排除了一些 .txt 文件,但在处理组件 2 时,将包含这些文件。

组件 1:

  • 包含规则:C:\Dir1\Dir2\* [*]

组件 2:

  • 排除规则:C:\Dir1\* [*.txt]

迁移 Dir2 中的所有文件和子文件夹(除 C:\Dir1 及其子文件夹中的 .txt 文件外)。

两种规则都按计划予以处理。

组件 1:

  • 排除规则:C:\Dir1\Dir2\* [*]

组件 2:

  • 包含规则:C:\Dir1\* [*.txt]

迁移 Dir1 以及任何子文件夹中的所有 .txt 文件。

组件 1 不含有 <include> 规则,因此,未对任何 <exclude> 规则加以处理。

包含和排除注册表对象

如果你在相同组件中拥有以下代码 导致的行为 说明
  • 包含规则:HKLM\Software\Microsoft\Command Processor\* [*]

  • 排除规则:HKLM\Software\Microsoft\Command Processor [DefaultColor]

迁移所有在 HKLM\Software\Microsoft\Command Processor 中的密钥(除 DefaultColor 外)。

两种规则都按计划予以处理。

  • 包含规则:HKLM\Software\Microsoft\Command Processor [DefaultColor]

  • 排除规则:HKLM\Software\Microsoft\Command Processor\* [*]

仅迁移 HKLM\Software\Microsoft\Command Processor 中的 DefaultColor。

DefaultColor 已迁移,因为 <include> 规则比 <exclude> 规则更具体。

  • 包含规则:HKLM\Software\Microsoft\Command Processor [DefaultColor]

  • 排除规则:HKLM\Software\Microsoft\Command Processor [DefaultColor]

不迁移 DefaultColor。

规则同样具体,因此 <exclude> 规则优先于<include>规则。

如果你在不同组件中拥有以下代码 导致的行为 说明

组件 1:

  • 包含规则:HKLM\Software\Microsoft\Command Processor [DefaultColor]

  • 排除规则:HKLM\Software\Microsoft\Command Processor\* [*]

组件 2:

  • 包含规则:HKLM\Software\Microsoft\Command Processor\* [*]

  • 排除规则:HKLM\Software\Microsoft\Command Processor [DefaultColor]

迁移 HKLM\Software\Microsoft\Command Processor 项下的所有密钥/值。

不同组件中的规则不相互影响,但 <unconditionalExclude> 规则除外。因此,在此示例中,对于在处理组件 1 时已排除的对象,将在处理组件 2 时予以包含。

文件冲突

当存在文件冲突时,应执行哪些默认行为?

如无 <merge> 规则,则注册表的默认行为即是使用源文件覆盖目标文件。文件的默认行为是将源文件改为“OriginalFileName(1).OriginalExtension”。

当存在文件冲突时,应如何应用 <merge> 规则?

当检测到冲突时,USMT 将选择最具体的 <merge> 规则,并应用该规则解决冲突。例如,如果你将 C:\* [*] 的 <merge> 规则设置到 sourcePriority() 以及将 C:\subfolder\* [*] 的另一 <merge> 规则设置到 destinationPriority(),则 USMT 使用 destinationPriority() 规则,因为它是最具体的。

示例方案

源计算机含有以下文件:

  • C:\Data\SampleA.txt

  • C:\Data\SampleB.txt

  • C:\Data\Folder\SampleB.txt

目标计算机含有以下文件:

  • C:\Data\SampleB.txt

  • C:\Data\Folder\SampleB.txt

你拥有一个含有以下代码的自定义 .xml 文件:

<include> 
   <objectSet> 
      <pattern type="File">c:\data\* [*]</pattern> 
   </objectSet> 
</include> 

在本示例中,下表描述了将第一栏中的代码添加到自定义 .xml 文件所导致的行为。

如果你指定以下代码 导致的行为
<merge script="MigXmlHelper.DestinationPriority()"> 
   <objectSet> 
      <pattern type="File">c:\data\* [*]</pattern> 
   </objectSet> 
</merge>

在 ScanState 期间,所有文件将添加到存储区。

在 LoadState 期间,将仅恢复 C:\Data\SampleA.txt。

<merge script="MigXmlHelper.SourcePriority()"> 
   <objectSet> 
      <pattern type="File">c:\data\* [*]</pattern> 
   </objectSet> 
</merge> 

在 ScanState 期间,所有文件将添加到存储区。

在 LoadState 期间,所有文件均将恢复,并覆盖目标计算机上的现有文件。

<merge script="MigXmlHelper.SourcePriority()"> 
   <objectSet> 
      <pattern type="File">c:\data\ [*]</pattern> 
   </objectSet> 
</merge> 

在 ScanState 期间,所有文件将添加到存储区。

在 LoadState 期间,出现以下情况之一:

  • 将恢复 C:\Data\SampleA.txt。

  • C:\Data\SampleB.txt 将恢复,并覆盖目标计算机上的现有文件。

  • C:\Data\Folder\SampleB.txt 将不会恢复。

另请参阅

其他资源

USMT XML 参考