共用方式為


衝突與優先順序

當您包含、排除和重新路由檔案及設定時,最好知道使用者狀態移轉工具 (USMT) 10.0 如何處理衝突與優先順序。使用 USMT 時,請記住以下是最重要的衝突與優先順序指導方針。

  • **如果元件內的規則發生衝突,則會套用最特定的規則。**不過,<unconditionalExclude> 規則的優先順序高於其他規則,因此不在此限。 目錄名稱的優先順序高於副檔名。如需範例,請參閱包含和排除規則存在衝突時會發生什麼事?以及本主題稍後的包含和排除優先順序範例中的第一個範例。

  • **只有相同元件內的規則會互相影響 (根據特定性)。**不同元件中的規則並不會互相影響 (但不含 <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> 優先順序範例

檔案衝突

  • 發生檔案衝突時的預設行為為何?

  • <merge> 規則在發生檔案衝突時如何運作?

一般

位在不同元件內之規則的關係為何?

只有相同元件內的規則會互相影響 (根據特定性),但不含 <unconditionalExclude> 規則。不同元件中的規則並不會互相影響。如果某個元件含有 <include> 規則,而另一個元件含有相同的 <exclude> 規則,因為兩個規則彼此無關,所以會移轉資料。

如果某個元件含有 <include> 規則,而相同檔案的另一個元件含有 <locationModify> 規則,則會在兩個位置移轉檔案。也就是說,會根據 <include> 規則予以包含,而根據 <locationModify> 規則進行移轉。

下列 .xml 檔案在個別元件中指定 <exclude> 規則,因此會移轉 C:\Userdocs 中的所有檔案 (含 .mp3 檔案)。

<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 檔案中刪除對應元件的作用是相同的。不過,如果您針對 [我的文件] 設定 migrate="no",但是移轉 .xml 檔案含有與下面所示類似的規則 (包含 [我的文件] 中的所有 .doc 檔案),則只會移轉 .doc 檔案,而排除其他所有檔案。

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

USMT 如何處理含有多個元件之 .xml 檔案中的每個元件?

元件的順序不會有任何影響。每個元件都是個別予以處理。例如,如果某個元件含有 <include> 規則,而相同檔案的另一個元件含有 <locationModify> 規則,則會在兩個位置移轉檔案。也就是說,會根據 <include> 規則予以包含,而根據 <locationModify> 規則進行移轉。

如何處理規則?

規則有兩大類別:

  • 影響 ScanState 和 LoadState 工具行為的規則。例如,USMT 會針對 .xml 檔案中的每個元件來處理 <include>、<exclude> 和 <unconditionalExclude> 規則。USMT 會針對每個元件建立包含清單和排除清單。元件中的某些規則可能會因特定性而予以捨棄,但是會處理其餘所有規則。USMT 會針對每個 <include> 規則逐一執行元素,以查看是否需要排除任何位置。USMT 會列舉所有物件,並建立要為每位使用者收集的物件清單。清單完成之後,每個物件就會存放或移轉至目的電腦。

  • 只影響 LoadState 工具行為的規則。例如,<locationModify>、<contentModify> 和 <destinationCleanup> 規則不會影響 ScanState。只有使用 LoadState 才可以處理它們。首先,LoadState 工具會根據 <locationModify> 和 <contentModify> 規則判斷每個元件的內容和位置。接著,LoadState 會處理所有 <destinationCleanup> 規則,並刪除目的電腦中的資料。最後,LoadState 會將元件套用至電腦。

USMT 如何結合我在命令列上指定的所有 .xml 檔案?

USMT 不會根據 .xml 檔案的名稱或內容來區分 .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 檔案)。

因為 <include> 規則較特定,所以 <exclude> 規則不會影響移轉。

  • 包含規則:<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 中的 .txt 檔案,以及非 Dir2 子資料夾中的 .txt 檔案。

不會移轉 Dir2 或其子資料夾中的檔案。

這兩個規則都會如預期處理。

  • 包含規則:C:\Dir1\Dir2\* [*]

  • 排除規則:C:\Dir1\* [*.txt]

移轉 Dir2 的所有檔案和子資料夾 (不含 Dir1 及其任何子資料夾中的 .txt 檔案,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。

因為 <include> 規則比 <exclude> 規則更特定,所以會移轉 DefaultColor。

  • 包含規則: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、OriginalFileName(2).OriginalExtension,以此類推。

<merge> 規則在發生檔案衝突時如何運作?

偵測到衝突時,USMT 會選取並套用最特定的 <merge> 規則,以解決衝突。例如,您有 C:\* [*] 設為 sourcePriority() 的 <merge> 規則,以及 C:\subfolder\* [*] 設為 destinationPriority() 的另一個 <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 參考