Compare-Object
比較兩個物件集。
Syntax
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Description
Cmdlet Compare-Object
會比較兩組物件。 其中一組對象是 參考,另一組對象是 差異。
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,但傳回的物件實例已加入名為 SideIndicator 的 NoteProperty。 SideIndicator 會顯示輸出所屬的輸入物件。
下列範例顯示不同的輸出類型。
$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
指出比較應區分大小寫。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Culture
指定要用於比較的文化特性。
Type: | String |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-DifferenceObject
指定與 參考 對象比較的物件。
Type: | PSObject[] |
Position: | 1 |
Default value: | None |
Required: | True |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-ExcludeDifferent
表示此 Cmdlet 只會顯示相等比較物件的特性。 會捨棄對象之間的差異。
使用 ExcludeDifferent 搭配 IncludeEqual ,只顯示 參考 對象與 差異 對象之間的相符行。
如果沒有 IncludeEqual 指定 ExcludeDifferent,則沒有輸出。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-IncludeEqual
IncludeEqual 會顯示 參考 對象與 差異 對象之間的相符專案。
根據預設,輸出也包含 參考 對象與 差異 對象之間的差異。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-PassThru
當您使用 PassThru 參數時, Compare-Object
省略比較物件周圍的 PSCustomObject 包裝函式,並傳回不同的物件,保持不變。
Type: | SwitchParameter |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Property
指定要比較之 參考 和 差異 物件的屬性陣列。
Property 參數的值可以是新的導出屬性。 匯出屬性可以是腳本區塊或哈希表。 有效的機碼/值組為:
- 表達式 -
<string>
或<script block>
如需詳細資訊,請參閱 about_Calculated_Properties。
Type: | Object[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-ReferenceObject
指定做為比較參考的物件陣列。
Type: | PSObject[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-SyncWindow
指定在物件集合中尋找相符專案時所檢查的相鄰物件 Compare-Object
數目。 Compare-Object
在集合中找不到相同位置的物件時,會檢查相鄰的物件。 默認值為 [Int32]::MaxValue
,這表示 Compare-Object
會檢查整個物件集合。
使用大型集合時,預設值可能沒有效率,但不正確。 為 SyncWindow 指定較小的值可能會提高效能,但可能具有較低的精確度。
Type: | Int32 |
Position: | Named |
Default value: | [Int32]::MaxValue |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
輸入
您可以將物件向下傳送至 DifferenceObject 參數。
輸出
None
根據預設,當 ReferenceObject 和 DifferenceObject 相同時,此 Cmdlet 不會傳回任何輸出。
當物件不同時,這個 Cmdlet 會使用 SideIndicator 屬性包裝 PSCustomObject 包裝函式中的不同物件,以參考差異。
當您使用 IncludeEqual 參數和物件相同時,Cmdlet 會傳回 包裝在 PSCustomObject 中的物件,並將 SideIndicator 屬性設定為 ==
。
當您使用 PassThru 參數時,不會變更物件的 Type,但傳回的物件實例已加入名為 SideIndicator 的 NoteProperty。 SideIndicator 會顯示輸出所屬的輸入物件。
備註
PowerShell 包含的下列別名 Compare-Object
:
- Windows:
compare
diff
使用 PassThru 參數時,控制台中顯示的輸出可能不會包含 SideIndicator 屬性。 物件類型輸出 Compare-Object
的預設格式檢視不包含 SideIndicator 屬性。 如需詳細資訊,請參閱本文中的 範例 3 。