冲突和优先级

在包括、排除和重新路由文件和设置时,请务必了解用户状态迁移工具 (USMT) 如何处理冲突和优先级。 以下是使用 USMT 时要记住的最重要冲突和优先级准则。

  • 如果组件中存在冲突的规则,则会应用最具体的规则。 但是, <无条件Exclude> 规则是一个例外,因为它优先于所有其他规则。 目录名称优先于文件扩展名。 有关示例,请参阅当存在冲突<的包含>和<排除>规则时会发生什么情况?以及本文稍后包含>和<排除>规则优先示例中的第一个<示例

  • 只有同一组件中的规则才能相互影响,具体取决于具体性。 不同组件中的规则相互影响,无条件排除>规则除外<

  • 如果规则同样具体, <则 exclude> 优先于 <include>。 例如,如果使用 <排除> 规则来排除文件,并使用 <包含> 规则包含同一文件,则会排除该文件。

  • 组件的排序并不重要。 在哪个 .xml 文件中列出哪些组件并不重要,因为每个组件独立于所有 .xml 文件中的其他组件进行处理。

  • 组件内 <包含> 和 <排除> 规则的顺序并不重要。

  • unconditionalExclude <> 元素可用于全局排除数据。 此元素排除对象,而不考虑 .xml 文件中的任何其他 <include> 规则。 例如, <无条件Exclude> 元素可用于排除计算机上的所有 MP3 文件或从 C:\UserData中排除所有文件。

概要

位于不同组件中的规则之间的关系是什么?

只有同一组件中的规则可以相互影响,具体取决于具体性,无条件Exclude> 规则除外<。 位于不同组件中的规则不会相互影响。 如果一个组件中有一个<包含>规则,另一个组件中有一个相同的<排除>规则,则会迁移数据,因为这两个规则彼此独立。

如果包含<>规则位于一个组件中,而 <locationModify> 规则位于同一文件的另一个组件中,则会在两个位置迁移该文件。 也就是说,基于包含规则包含<>文件,并根据 locationModify> 规则迁移<该文件。

以下 .xml 文件从 C:\Userdocs 迁移所有文件,包括 .mp3 文件,因为 <排除> 规则是在单独的组件中指定的。

<migration urlid="http://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 文件?

migrate="no"在 文件中Config.xml指定与从迁移 .xml 文件中删除相应的组件相同。 但是,如果migrate="no"Documents 文件夹设置了 ,但迁移 .xml 文件 (包含 Documents 文件夹中的所有.doc 文件) 中存在类似于以下规则的规则,则仅迁移 .doc 文件,并排除所有其他文件:

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

USMT 如何处理具有多个组件的 .xml 文件中的每个组件?

组件的排序并不重要。 每个组件独立于其他组件进行处理。 例如,如果包含<>规则位于一个组件中,而 <locationModify> 规则位于同一文件的另一个组件中,则会在这两个位置迁移该文件。 也就是说,基于包含规则包含<>文件,并根据 locationModify> 规则迁移<该文件。

如何处理规则?

有两大类规则。

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

  • 仅影响 LoadState 工具行为的规则。 例如, <locationModify><contentModify><destinationCleanup> 规则不会影响 ScanState。 它们仅使用 LoadState 进行处理。 首先,LoadState 工具根据 <locationModify 和 contentModify>>规则确定每个组件的内容和<位置。 然后, LoadState 处理所有 <destinationCleanup> 规则,并从目标计算机中删除数据。 最后, LoadState 将组件应用于计算机。

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

USMT 不会根据文件的名称或内容来区分 .xml 文件。 它分别处理文件中的每个组件。 USMT 仅支持多个 .xml 文件,以便更轻松地维护和组织其中的组件。 由于 USMT 使用 urlid 将每个组件与其他组件区分开来,因此请确保命令行中指定的每个 .xml 文件都具有唯一的迁移 urlid。

包含<>和<排除>规则

存在冲突的 <包含> 和 <排除> 规则时会发生什么情况?

如果组件中存在冲突的规则,则应用最具体的规则,但无条件的Exclude> 规则除外<,该规则优先于所有其他规则。 如果规则同样具体,则不会迁移数据。 例如,如果排除并包含同一个文件,则不会迁移该文件。 如果不同组件中的规则存在冲突,则规则不会相互影响,因为每个组件都是独立处理的。

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

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

<包括> 和 <排除> 规则优先级示例

这些示例说明了 USMT 如何处理 <包含><排除> 规则。 当规则位于不同的组件中时,无论组件位于相同或不同的迁移 .xml 文件中,结果的行为都是相同的。

包括和排除文件

如果同一组件中存在以下代码 结果行为 说明
  • 包含规则: <pattern type=“File”>C:\Dir1* []</pattern>
  • 排除规则: <pattern type=“File”>C:* [.txt]</pattern>
迁移 Dir1 中的所有文件和子文件夹 (包括 C: ) 中的所有.txt 文件。 排除<>规则不会影响迁移,因为<包含>规则更具体。
  • 包含规则: <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>
不会迁移任何内容。 规则同样具体,因此排除<>规则优先于<包含>规则。
  • 包括规则:C:\Dir1* [.txt]
  • 排除规则:C:\Dir1\Dir2* []
从 Dir2 以外的子文件夹中迁移 Dir1 中的.txt文件和 .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) 。 不同组件中的规则相互影响,无条件排除>规则除外<。 因此,在此示例中,尽管在处理组件 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 不包含 <包含> 规则,因此 <不会处理排除> 规则。

包括和排除注册表对象

如果同一组件中存在以下代码 结果行为 说明
  • 包括规则:
    HKLM\Software\Microsoft\Command Processor* []
  • 排除规则:
    HKLM\Software\Microsoft\Command Processor [DefaultColor]
迁移 HKLM\Software\Microsoft\命令处理器中的所有密钥,DefaultColor 除外。 这两个规则都按预期进行处理。
  • 包括规则:
    HKLM\Software\Microsoft\Command Processor [DefaultColor]
  • 排除规则:
    HKLM\Software\Microsoft\Command Processor* []
仅迁移 HKLM\Software\Microsoft\Command Processor 中的 DefaultColor。 迁移 DefaultColor 是因为 <包含> 规则比 <排除> 规则更具体。
  • 包括规则:
    HKLM\Software\Microsoft\Command Processor [DefaultColor]
  • 排除规则:
    HKLM\Software\Microsoft\Command Processor [DefaultColor]
不迁移 DefaultColor。 规则同样具体,因此排除<>规则优先于<包含>规则。
如果以下代码存在于不同的组件中 结果行为 说明
组件 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 下的所有键/值。 不同组件中的规则相互影响,无条件排除>规则除外<。 在此示例中,处理组件 1 时排除的对象包含在处理组件 2 时。

文件冲突

发生文件冲突时,默认行为是什么?

如果没有 <合并> 规则,注册表的默认行为是源覆盖目标。 文件的默认行为是增量重命名源:例如,OriginalFileName (1) 。OriginalExtension,OriginalFileName (2) 。OriginalExtension 等。

<发生文件冲突时,合并>规则如何工作?

检测到冲突时,USMT 会选择最具体的 <合并> 规则并应用它来解决冲突。 例如,如果 <>C:\* [*] 设置为 sourcePriority () 存在合并规则,而 C:\subfolder\* [*] 的另一个<合并>规则设置为 destinationPriority () ,则 USMT 使用 destinationPriority () 规则,因为它是最具体的。

示例方案

源计算机包含以下文件:

  • C:\Data\SampleA.txt

  • C:\Data\SampleB.txt

  • C:\Data\Folder\SampleB.txt

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

  • C:\Data\SampleB.txt

  • C:\Data\SampleB.txt

自定义 .xml 文件包含以下代码:

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

对于此示例,以下信息描述了将代码添加到自定义 .xml 文件时的结果行为。

示例 1

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

结果:在 ScanState 期间,所有文件都会添加到存储区。 在 LoadState 期间,仅 C:\Data\SampleA.txt 还原。

示例 2

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

结果:在 ScanState 期间,所有文件都会添加到存储区。 在 LoadState 期间,将还原所有文件,覆盖目标计算机上的现有文件。

示例 3

<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 参考