冲突和优先级
在包括、排除和重新路由文件和设置时,请务必了解用户状态迁移工具 (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 文件中,结果的行为都是相同的。
包括和排除文件
如果同一组件中存在以下代码 | 结果行为 | 说明 |
---|---|---|
|
迁移 Dir1 中的所有文件和子文件夹 (包括 C: ) 中的所有.txt 文件。 | 排除<>规则不会影响迁移,因为<包含>规则更具体。 |
|
迁移 C:\Dir1 中的所有文件和子文件夹,C:\Dir1\Dir2 及其子文件夹中 的.txt 文件除外。 | 这两个规则都按预期进行处理。 |
|
迁移 C:\Dir1 中的所有文件和子文件夹,C:\Dir1 及其子文件夹中 的.txt 文件除外。 | 这两个规则都按预期进行处理。 |
|
不会迁移任何内容。 | 规则同样具体,因此排除<>规则优先于<包含>规则。 |
|
从 Dir2 以外的子文件夹中迁移 Dir1 中的.txt文件和 .txt 文件。 不会从 Dir2 或其子文件夹迁移任何文件。 |
这两个规则都按预期进行处理。 |
|
迁移 Dir2 的所有文件和子文件夹,Dir1 中的 .txt 文件和 Dir1 的任何子文件夹除外, (包括 Dir2) 。 | 这两个规则都按预期进行处理。 |
如果以下代码存在于不同的组件中 | 结果行为 | 说明 |
---|---|---|
组件 1:
组件 2:
|
迁移 C:\Dir1\ (的所有文件和子文件夹,包括 C:\Dir1\Dir2) 。 | 不同组件中的规则相互影响,无条件排除>规则除外<。 因此,在此示例中,尽管在处理组件 1 时排除了某些 .txt 文件,但在处理组件 2 时会包含这些文件。 |
组件 1:
组件 2:
|
从 Dir2 迁移除 C:\Dir1 及其子文件夹中 .txt 文件之外的所有文件和子文件夹。 | 这两个规则都按预期进行处理。 |
组件 1:
组件 2:
|
迁移 Dir1 和任何子文件夹中的所有 .txt 文件。 | 组件 1 不包含 <包含> 规则,因此 <不会处理排除> 规则。 |
包括和排除注册表对象
如果同一组件中存在以下代码 | 结果行为 | 说明 |
---|---|---|
|
迁移 HKLM\Software\Microsoft\命令处理器中的所有密钥,DefaultColor 除外。 | 这两个规则都按预期进行处理。 |
|
仅迁移 HKLM\Software\Microsoft\Command Processor 中的 DefaultColor。 | 迁移 DefaultColor 是因为 <包含> 规则比 <排除> 规则更具体。 |
|
不迁移 DefaultColor。 | 规则同样具体,因此排除<>规则优先于<包含>规则。 |
如果以下代码存在于不同的组件中 | 结果行为 | 说明 |
---|---|---|
组件 1:
组件 2:
|
迁移 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
不会还原。