Compare-Object
将两组对象进行比较。
语法
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
说明
cmdlet Compare-Object
比较两组对象。 一组对象是 引用,另一组对象是 差异。
Compare-Object
检查比较整个 对象的可用方法。 如果找不到合适的方法,它会调用 ToString () 输入对象的方法,并比较字符串结果。 可以提供一个或多个要用于比较的属性。 提供属性时,cmdlet 仅比较这些属性的值。
比较结果指示属性值是仅出现在 引用 对象 (<=
) 中,还是仅在 差异 对象 (=>
) 中出现。 如果使用 IncludeEqual 参数, (==
) 指示值在两个 对象中。
如果 引用 或 差异 对象为 null ($null
) , Compare-Object
将生成终止错误。
一些示例使用展开来减少代码示例的行长度。 有关详细信息,请参阅 about_Splatting。
示例
示例 1 - 比较两个文本文件的内容
此示例比较两个文本文件的内容。 该示例使用以下两个文本文件,每个值在单独的行上。
Testfile1.txt
包含值:dog、squirrel 和 bird。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 参数时,对象的类型不会更改,但返回的对象实例已添加一个名为 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 参数时,对象的类型不会更改,但返回的对象实例已添加一个名为 SideIndicator 的 NoteProperty。 SideIndicator 显示输出所属的输入对象。
备注
PowerShell 包含以下别名 Compare-Object
:
- Windows:
compare
diff
使用 PassThru 参数时,控制台中显示的输出可能不包含 SideIndicator 属性。 对象类型输出 Compare-Object
的默认格式视图不包括 SideIndicator 属性。 有关详细信息,请参阅本文中的 示例 3 。