共用方式為


Compare-Object

比較兩組物件。

語法

Compare-Object
       [-ReferenceObject] <PSObject[]>
       [-DifferenceObject] <PSObject[]>
       [-SyncWindow <Int32>]
       [-Property <Object[]>]
       [-ExcludeDifferent]
       [-IncludeEqual]
       [-PassThru]
       [-Culture <String>]
       [-CaseSensitive]
       [<CommonParameters>]

Description

Compare-Object Cmdlet 會比較兩組物件。 一組對像是 參考,另一組對像是 差異。

Compare-Object 檢查是否有比較整個物件的可用方法。 如果找不到合適的方法,它會呼叫輸入物件的 ToString() 方法,並比較字串結果。 您可以提供一或多個要用於比較的屬性。 提供屬性時,Cmdlet 只會比較這些屬性的值。

比較的結果會指出屬性值只出現在 參考 物件(<=)中,還是只出現在 差異 物件中(=>)。 如果使用 IncludeEqual 參數,則 (==) 表示值在這兩個物件中。

如果 參考差異 物件為 null ($null),Compare-Object 會產生終止錯誤。

某些範例會使用噴濺來減少程式代碼範例的行長度。 如需詳細資訊,請參閱 about_Splatting

範例

範例 1 - 比較兩個文字文件的內容

此範例會比較兩個文本文件的內容。 此範例會使用下列兩個文本檔,每一行的值各有一個。

  • Testfile1.txt 包含值:狗、松鼠和鳥。
  • Testfile2.txt 包含值:cat、bird 和 racoon。

輸出只會顯示檔案之間不同行。 Testfile1.txt參考 物件(<=),而 Testfile2.txt差異 物件(=>)。 不會顯示兩個檔案中出現內容的行。

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)

InputObject SideIndicator
----------- -------------
cat         =>
racoon      =>
dog         <=
squirrel    <=

範例 2 - 比較每一行內容並排除差異

這個範例會使用 ExcludeDifferent 參數來比較兩個文本檔中每一行的內容。

從 PowerShell 7.1 起,使用 ExcludeDifferent 參數時,會推斷 IncludeEqual,輸出只會包含這兩個檔案中包含的行,如 SideIndicator==) 所示。

$objects = @{
  ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt)
  DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)
}
Compare-Object @objects -ExcludeDifferent

InputObject SideIndicator
----------- -------------
bird        ==

範例 3 - 使用 PassThru 參數時顯示差異

一般而言,Compare-Object 會傳回具有下列屬性 PSCustomObject 類型:

  • 正在比較 InputObject
  • SideIndicator 屬性,其中顯示輸出所屬的輸入物件

當您使用 passThru 參數 時,不會變更物件的 Type,但傳回的物件實例已新增 NoteProperty,名為 SideIndicatorSideIndicator 會顯示輸出所屬的輸入物件。

下列範例顯示不同的輸出類型。

$a = $true
Compare-Object -IncludeEqual $a $a
(Compare-Object -IncludeEqual $a $a) | Get-Member

InputObject SideIndicator
----------- -------------
       True ==

   TypeName: System.Management.Automation.PSCustomObject
Name          MemberType   Definition
----          ----------   ----------
Equals        Method       bool Equals(System.Object obj)
GetHashCode   Method       int GetHashCode()
GetType       Method       type GetType()
ToString      Method       string ToString()
InputObject   NoteProperty System.Boolean InputObject=True
SideIndicator NoteProperty string SideIndicator===

Compare-Object -IncludeEqual $a $a -PassThru
(Compare-Object -IncludeEqual $a $a -PassThru) | Get-Member

True

   TypeName: System.Boolean
Name          MemberType   Definition
----          ----------   ----------
CompareTo     Method       int CompareTo(System.Object obj), int CompareTo(bool value), int IComparable.CompareTo(Syst
Equals        Method       bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable[bool].Equals(bool ot
GetHashCode   Method       int GetHashCode()
GetType       Method       type GetType()
GetTypeCode   Method       System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode()
ToBoolean     Method       bool IConvertible.ToBoolean(System.IFormatProvider provider)
ToByte        Method       byte IConvertible.ToByte(System.IFormatProvider provider)
ToChar        Method       char IConvertible.ToChar(System.IFormatProvider provider)
ToDateTime    Method       datetime IConvertible.ToDateTime(System.IFormatProvider provider)
ToDecimal     Method       decimal IConvertible.ToDecimal(System.IFormatProvider provider)
ToDouble      Method       double IConvertible.ToDouble(System.IFormatProvider provider)
ToInt16       Method       short IConvertible.ToInt16(System.IFormatProvider provider)
ToInt32       Method       int IConvertible.ToInt32(System.IFormatProvider provider)
ToInt64       Method       long IConvertible.ToInt64(System.IFormatProvider provider)
ToSByte       Method       sbyte IConvertible.ToSByte(System.IFormatProvider provider)
ToSingle      Method       float IConvertible.ToSingle(System.IFormatProvider provider)
ToString      Method       string ToString(), string ToString(System.IFormatProvider provider), string IConvertible.To
ToType        Method       System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider)
ToUInt16      Method       ushort IConvertible.ToUInt16(System.IFormatProvider provider)
ToUInt32      Method       uint IConvertible.ToUInt32(System.IFormatProvider provider)
ToUInt64      Method       ulong IConvertible.ToUInt64(System.IFormatProvider provider)
TryFormat     Method       bool TryFormat(System.Span[char] destination, [ref] int charsWritten)
SideIndicator NoteProperty string SideIndicator===

使用 PassThru時,會傳回原始物件類型 (System.Boolean)。 請注意,System.Boolean 對象的預設格式所顯示的輸出如何未顯示 SideIndicator 屬性。 不過,傳回 System.Boolean 物件已新增 NoteProperty

範例 4 - 使用屬性比較兩個簡單物件

在此範例中,我們會比較兩個長度相同的不同字串。

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual

Length SideIndicator
------ -------------
     3 ==

範例 5 - 使用屬性比較複雜物件

此範例顯示比較複雜對象時的行為。 在此範例中,我們會為PowerShell的不同實例儲存兩個不同的進程物件。 這兩個變數都包含具有相同名稱的進程物件。 比較物件而不指定 Property 參數時,Cmdlet 會將對象視為相等。 請注意,InputObject 的值與 ToString() 方法的結果相同。 由於 System.Diagnostics.Process 類別沒有 IComparable 介面,因此 Cmdlet 會將對象轉換成字元串,然後比較結果。

PS> Get-Process pwsh

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
    101   123.32     139.10      35.81   11168   1 pwsh
     89   107.55      66.97      11.44   17600   1 pwsh

PS> $a = Get-Process -Id 11168
PS> $b = Get-Process -Id 17600
PS> $a.ToString()
System.Diagnostics.Process (pwsh)
PS> $b.ToString()
System.Diagnostics.Process (pwsh)
PS> Compare-Object $a $b -IncludeEqual

InputObject                       SideIndicator
-----------                       -------------
System.Diagnostics.Process (pwsh) ==

PS> Compare-Object $a $b -Property ProcessName, Id, CPU

ProcessName    Id       CPU SideIndicator
-----------    --       --- -------------
pwsh        17600   11.4375 =>
pwsh        11168 36.203125 <=

當您指定要比較的屬性時,Cmdlet 會顯示差異。

範例 6 - 比較實作 IComparable 的複雜物件

如果對象實作 IComparable,Cmdlet 會搜尋比較物件的方式。如果物件是不同的類型,Difference 對象會轉換成 ReferenceObject 的類型,然後進行比較。

在此範例中,我們會比較字串與 TimeSpan 物件。 在第一個案例中,字串會轉換成 TimeSpan,讓物件相等。

Compare-Object ([timespan]"0:0:1") "0:0:1" -IncludeEqual

InputObject SideIndicator
----------- -------------
00:00:01    ==

Compare-Object "0:0:1" ([timespan]"0:0:1")

InputObject SideIndicator
----------- -------------
00:00:01    =>
0:0:1       <=

在第二個案例中,TimeSpan 會轉換成字串,讓物件不同。

參數

-CaseSensitive

表示比較應該區分大小寫。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-Culture

指定要用於比較的文化特性。

類型:String
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-DifferenceObject

指定與 參考 物件比較的物件。

類型:PSObject[]
Position:1
預設值:None
必要:True
接受管線輸入:True
接受萬用字元:False

-ExcludeDifferent

指出這個 Cmdlet 只會顯示相等之比較物件的特性。 會捨棄對象之間的差異。

使用 ExcludeDifferent 搭配 IncludeEqual,只顯示 參考差異 對象之間的相符行。

如果未指定 excludeDifferent IncludeEqual ,則沒有輸出。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-IncludeEqual

IncludeEqual 會顯示 參考差異 物件之間的相符專案。

根據預設,輸出也會包含 參考差異 對象之間的差異。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-PassThru

當您使用 PassThru 參數時,Compare-Object 省略比較物件周圍的 PSCustomObject 包裝函式,並傳回不同的物件,保持不變。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-Property

指定要比較之 參考差異 對象的屬性陣列。

Property 參數的值可以是新的導出屬性。 匯出屬性可以是腳本區塊或哈希表。 有效的機碼/值組如下:

  • 表達式 - <string><script block>

如需詳細資訊,請參閱 about_Calculated_Properties

類型:Object[]
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-ReferenceObject

指定做為比較參考的物件陣列。

類型:PSObject[]
Position:0
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:False

-SyncWindow

指定在物件集合中尋找相符專案時,Compare-Object 檢查的相鄰物件數目。 Compare-Object 在集合中找不到相同位置的物件時,檢查相鄰的物件。 默認值為 [int32]::MaxValue,這表示 Compare-Object 會檢查整個物件集合。

使用大型集合時,預設值可能沒有效率,但正確。 指定 SyncWindow 的較小值可能會提高效能,但精確度可能較低。

類型:Int32
Position:Named
預設值:[int32]::MaxValue
必要:False
接受管線輸入:False
接受萬用字元:False

輸入

PSObject

您可以將物件向下傳送至 DifferenceObject 參數。

輸出

None

根據預設,當 ReferenceObjectDifferenceObject 相同時,此 Cmdlet 不會傳回任何輸出。

PSCustomObject

當物件不同時,這個 Cmdlet 會將不同對象包裝在 PSCustomObject 包裝函式中,並搭配 SideIndicator 屬性來參考差異。

當您使用 IncludeEqual 參數和物件相同時,Cmdlet 會傳回包裝在 psCustomObject 中,並將 SideIndicator 屬性設定為 ==的物件。

當您使用 passThru 參數 時,不會變更物件的 Type,但傳回的物件實例已新增 NoteProperty,名為 SideIndicatorSideIndicator 會顯示輸出所屬的輸入物件。

備註

PowerShell 包含下列 Compare-Object別名:

  • 窗戶:
    • compare
    • diff

使用 PassThru 參數時,控制台中顯示的輸出可能不會包含 SideIndicator 屬性。 Compare-Object 所輸出物件類型的預設格式檢視不包含 SideIndicator 屬性。 如需詳細資訊,請參閱本文 範例 3