Поделиться через


Compare-Object

Сравнивает два набора объектов.

Синтаксис

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

Описание

Командлет Compare-Object сравнивает два набора объектов . Один набор объектов является ссылкой, а другой набор объектов — это разница.

Compare-Object проверяет наличие доступных методов сравнения всего объекта. Если не удается найти подходящий метод, он вызывает метод ToString() входных объектов и сравнивает строковые результаты. Можно указать одно или несколько свойств, которые будут использоваться для сравнения. При указании свойств командлет сравнивает значения только этих свойств.

Результат сравнения показывает, отображается ли значение свойства только в объекте ссылки (<=) или только в объекте разности (=>). Если используется параметр 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тип объекта не изменяется, но в экземпляре возвращаемого объекта добавлено свойство NotePropertyс именем SideIndicator. 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 , командлет считает объекты равными. Обратите внимание, что значение InputObject совпадает с результатом метода ToString(). Так как класс System.Diagnostics.Process не имеет интерфейса IComparable , командлет преобразует объекты в строки, а затем сравнивает результаты.

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 <=

При указании сравниваемых свойств командлет показывает различия.

Пример 6. Сравнение сложных объектов, реализующих IComparable

Если объект реализует IComparable, командлет ищет способы сравнения объектов. Если объекты имеют разные типы, объект 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

Указывает, что этот командлет отображает только одинаковые характеристики сравниваемых объектов. Различия между объектами удаляются.

Используйте ExcludeDifferent с IncludeEqual , чтобы отобразить только строки, соответствующие объектам ссылок и различий .

Если параметр ExcludeDifferent указан без IncludeEqual, выходные данные отсутствуют.

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

При использовании параметра Compare-ObjectPassThru опустить оболочку PSCustomObject вокруг сравниваемых объектов и вернуть различные объекты без изменений.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

-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

Входные данные

PSObject

Объект можно отправить вниз по конвейеру в параметр DifferenceObject .

Выходные данные

None

По умолчанию этот командлет не возвращает выходные данные, если ReferenceObject и DifferenceObject совпадают.

PSCustomObject

Если объекты отличаются, этот командлет заключает различные объекты в оболочку PSCustomObject со свойством SideIndicator для ссылки на различия.

Если вы используете параметр IncludeEqual и объекты совпадают, командлет возвращает объекты, заключенные в PSCustomObject со свойством SideIndicator , равным ==.

При использовании параметра PassThruтип объекта не изменяется, но в экземпляре возвращаемого объекта добавлено свойство NotePropertyс именем SideIndicator. SideIndicator показывает, к какому входному объекту относится выходные данные.

Примечания

PowerShell включает следующие псевдонимы для Compare-Object:

  • Windows:
    • compare
    • diff

При использовании параметра PassThru выходные данные, отображаемые в консоли, могут не включать свойство SideIndicator . Представление формата по умолчанию для выходных данных Compare-Object типа объекта не включает свойство SideIndicator . Дополнительные сведения см. в примере 3 этой статьи.