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

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

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

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

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

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

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

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

Общее

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

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

<Если правило включения> находится в одном компоненте<, а правило 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" для папки Документы задано правило, аналогичное следующему, существует в файле миграции.xml (который содержит все .doc файлы из папки Документы ), то переносятся только файлы.doc , а все остальные файлы исключаются:

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

Как USMT обрабатывает каждый компонент в файле .xml с несколькими компонентами?

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

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

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

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

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

Как USMT объединяет все .xml файлы, указанные в командной строке?

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

Правила <включения> и <исключения>

Что происходит при наличии конфликтующих <правил включения> и <исключения> ?

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

В следующем примере 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 (включая все .txt файлы в C:). Правило <исключения> не влияет на миграцию, так как <правило включения> является более конкретным.
  • Включить правило: <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>
Ничего не переносится. Правила одинаково специфичны, поэтому <правило исключения> имеет приоритет над правилом <включения> .
  • Включить правило: 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). Правила, которые находятся в разных компонентах, не влияют друг на друга, за исключением правила безусловного< исключения>. Таким образом, в этом примере, хотя некоторые .txt файлы были исключены при обработке компонента 1, они были включены при обработке компонента 2.
Компонент 1.
  • Включить правило: C:\Dir1\Dir2* []

Компонент 2.
  • Правило исключения: C:\Dir1* [.txt]
Переносит все файлы и вложенные папки из Dir2, кроме файлов.txt в C:\Dir1 и его вложенных папок. Оба правила обрабатываются по назначению.
Компонент 1.
  • Правило исключения: C:\Dir1\Dir2* []

Компонент 2.
  • Включить правило: C:\Dir1* [.txt]
Переносит все .txt файлы в Dir1 и все вложенные папки. Компонент 1 не содержит <правила включения> , поэтому <правило исключения> не обрабатывается.

Включение и исключение объектов реестра

Если следующий код существует в том же компоненте Результирующее поведение Объяснение
  • Включить правило:
    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 переносится, так как <правило включения> является более конкретным, чем <правило исключения> .
  • Включить правило:
    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 не восстанавливаются.

Справочник по XML-файлу USMT.