Конфликты и приоритет

Когда вы включаете, исключаете и перенаправляете файлы и параметры, важно знать, как средство миграции пользовательской среды (USMT) 10.0 работает с конфликтами и приоритетом. Во время работы со средством USMT наиболее важными конфликтами и рекомендациями в отношении приоритета являются следующие.

  • Если в компоненте есть конфликтующие правила, применяется наиболее точное правило. Однако правило <unconditionalExclude> является исключением и имеет приоритет над всеми остальными правилами. Имена каталогов имеют приоритет перед расширениями файлов. Примеры см. далее в этом разделе в подразделе Что происходит, если совместить конфликтующие правила включения и исключения? и первый пример в подразделе Примеры приоритета при включении и исключении.

  • Только правила внутри одного компонента влияют друг на друга, в зависимости от характера правила. Правила, которые находятся в разных компонентах, не влияют друг на друга, за исключением правила <unconditionalExclude>.

  • Если правила одинаково частные, <exclude> имеет приоритет над <include>. Например, если вы используете правило <exclude> для исключения какого-либо файла и правило <include> для включения того же файла, то файл будет исключен.

  • Порядок компонентов не имеет значения. Не имеет значения, в каком XML-файле перечисляются компоненты, потому что каждый компонент обрабатывается независимо от других компонентов во всех XML-файлах.

  • Порядок правил <include> и <exclude> в компоненте не имеет значения.

  • Можно использовать элемент <unconditionalExclude> для глобального исключения данных. Этот элемент исключает объекты независимо от любых других правил <include> в XML-файлах. Например, можно использовать элемент <unconditionalExclude> для исключения всех имеющихся на компьютере MP3-файлов или для исключения всех файлов из папки C:\UserData.

В этом разделе

Общие вопросы

  • Как соотносятся между собой правила в разных компонентах?

  • Как работают приоритеты для файла Config.xml?

  • Как средство миграции пользовательской среды обрабатывает каждый компонент в XML-файле с несколькими компонентами?

  • Как обрабатываются правила?

  • Как средство миграции пользовательской среды объединяет все XML-файлы, указанные в командной строке?

Правила <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?

Определение migrate="no" в файле Config.xml равносильно удалению соответствующего компонента из XML-файла переноса. Тем не менее, если вы задали migrate="no" для папки "Мои документы", но в XML-файле переноса у вас есть правило, аналогичное одному из показанных ниже (включающее все DOC-файлы из папки "Мои документы"), будут перенесены только DOC-файлы, а все остальные файлы будут исключены.

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

Как средство миграции пользовательской среды обрабатывает каждый компонент в XML-файле с несколькими компонентами?

Порядок компонентов не имеет значения. Каждый компонент обрабатывается независимо от остальных компонентов. Например, если у вас для одного и того же файла есть правило <include> в одном компоненте и правило <locationModify> в другом компоненте, файл будет перенесен в обоих расположениях. То есть он будет включен в соответствии с правилом <include> и будет перенесен в соответствии с правилом <locationModify>.

Как обрабатываются правила?

Существует две обширных категории правил.

  • Правила, которые влияют на поведение средств ScanState и LoadState. Например, правила <include>, <exclude> и <unconditionalExclude> в XML-файлах обрабатываются для каждого компонента. Для каждого компонента средство USMT создает список включений и список исключений. Некоторые правила в компоненте могут быть отменены из-за приоритета более частного, но все остальные правила будут обработаны. Для каждого правила <include> средство USMT выполняет итерацию элементов, чтобы проверить, нет ли в них расположений, которые нужно исключить. Средство USMT перечисляет все объекты и создает список объектов, которые оно будет собирать для каждого пользователя. После создания списка каждый объект сохраняется или переносится на целевой компьютер.

  • Правила, которые влияют на поведение только средства LoadState. По умолчанию правила <locationModify>, <contentModify> и <destinationCleanup> не влияют на ScanState. Они обрабатываются только LoadState. Сначала средство LoadState определяет содержимое и расположение каждого компонента, основываясь на правилах <locationModify> и <contentModify>. Затем LoadState обрабатывает все правила <destinationCleanup> и удаляет данные с целевого компьютера. В завершение LoadState применяет компоненты к компьютеру.

Как средство миграции пользовательской среды объединяет все XML-файлы, указанные в командной строке?

Средство USMT не различает XML-файлы по именам или содержимому. Каждый компонент в файлах обрабатывается отдельно. Средство USMT поддерживает несколько XML-файлов только для упрощения обслуживания и организации компонентов в них. Поскольку средство USMT использует идентификатор URL, чтобы отличить один компонент от другого, убедитесь, что каждый XML-файл, указанный в командной строке, имеет уникальный идентификатор URL.

Правила <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 (включая все TXT-файлы в корневом каталоге диска C:).

Правило <exclude> не оказывает влияния на результат переноса, потому что правило <include> более частное.

  • Правило включения: <pattern type="File">C:\Dir1\* [*]</pattern>

  • Правило исключения: <pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

Переносит все файлы и вложенные папки в C:\Dir1, кроме TXT-файлов в C:\Dir1\Dir2 и его вложенных папках.

Обрабатываются оба правила, как и планировалось.

  • Правило включения: <pattern type="File">C:\Dir1\* [*]</pattern>

  • Правило исключения: <pattern type="File">C:\Dir1\ * [*.txt]</pattern>

Переносит все файлы и вложенные папки в C:\Dir1, кроме TXT-файлов в C:\Dir1\ и его вложенных папках.

Обрабатываются оба правила, как и планировалось.

  • Правило включения: <pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

  • Правило исключения: <pattern type="File">C:\Dir1\Dir2\* [*.txt]</pattern>

Ни один элемент не будет перенесен.

Правила одинаково частные, поэтому правило <exclude> имеет приоритет перед правилом <include>.

  • Правило включения: C:\Dir1\* [*.txt]

  • Правило исключения: C:\Dir1\Dir2\* [*]

Переносит все TXT-файлы в Dir1 и TXT-файлы из вложенных папок, кроме Dir2.

Из каталога Dir2 или его вложенных папок не переносится ни одного файла.

Обрабатываются оба правила, как и планировалось.

  • Правило включения: C:\Dir1\Dir2\* [*]

  • Правило исключения: C:\Dir1\* [*.txt]

Переносит все файлы и вложенные папки из Dir2 за исключением TXT-файлов Dir1 и всех вложенных папок 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>. Таким образом, несмотря на то, что в данном примере некоторые TXT-файлы были исключены при обработке компонента 1, они были включены при обработке компонента 2.

Компонент 1:

  • Правило включения: C:\Dir1\Dir2\* [*]

Компонент 2:

  • Правило исключения: C:\Dir1\* [*.txt]

Переносит все файлы и вложенные папки из C:\Dir1, кроме TXT-файлов в C:\Dir1\ и его вложенных папках.

Обрабатываются оба правила, как и планировалось.

Компонент 1:

  • Правило исключения: C:\Dir1\Dir2\* [*]

Компонент 2:

  • Правило включения: C:\Dir1\* [*.txt]

Переносит все TXT-файлы из Dir1 и любых вложенных папок.

Компонент 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\* [*]

Переносит только DefaultColor в HKLM\Software\Microsoft\Command Processor.

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>, то поведение по умолчанию для реестра заключается в том, что данные с исходного компьютера перезаписывают данные на целевом компьютере. Поведение по умолчанию для файлов заключается в том, что файлы на исходном компьютере получают имена с приращением, например: Исходное_имя_файла(1).Исходное_расширение, Исходное_имя_файла(2).Исходное_расширение и т. д.

Как действует правило <merge> при наличии конфликтов файлов?

Если конфликт обнаружен, средство миграции пользовательской среды выбирает наиболее строгое правило <merge> и применяет его, чтобы устранить конфликт. Например, если правило <merge> для C:\* [*] имеет значение sourcePriority(), а другое правило <merge> для C:\subfolder\* [*] имеет значение 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 не будет восстановлен.

 

Связанные разделы

Справочник по XML для средства миграции пользовательской среды