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


Compare-Object

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

Синтаксис

Default (по умолчанию)

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является объектом различия (=>). Строки с содержимым, отображаемым в обоих файлах, не отображаются.

$objects = @{
  ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt)
  DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)
}
Compare-Object @objects
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. Сравнение двух простых объектов с помощью свойств

В этом примере мы сравниваем две разные строки с одинаковой длиной.

$objects = @{
  ReferenceObject = 'abc'
  DifferenceObject = 'xyz'
  Property = 'Length'
}
Compare-Object @objects -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

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Culture

Указывает язык и региональные параметры, используемые для сравнения.

Свойства параметра

Тип:String
Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-DifferenceObject

Указывает объекты, которые сравниваются с ссылочными объектами.

Свойства параметра

Тип:

PSObject[]

Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:1
Обязательно:True
Значение из конвейера:True
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-ExcludeDifferent

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

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

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-IncludeEqual

IncludeEqual отображает совпадения между ссылочными и различиями объектов.

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-PassThru

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

Свойства параметра

Тип:SwitchParameter
Default value:False
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-Property

Задает массив свойств ссылочных и различий объектов для сравнения.

Значение параметра свойства может быть новым вычисляемым свойством. Вычисляемое свойство может быть блоком скрипта или хэш-таблицей. Допустимые сочетания ключей и значений:

  • Выражение: <string> или <script block>

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

Свойства параметра

Тип:

Object[]

Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-ReferenceObject

Задает массив объектов, используемых в качестве ссылки для сравнения.

Свойства параметра

Тип:

PSObject[]

Default value:None
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:0
Обязательно:True
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

-SyncWindow

Указывает количество смежных объектов, которые Compare-Object проверяется при поиске соответствия в коллекции объектов. Compare-Object проверяет смежные объекты, если он не находит объект в той же позиции в коллекции. Значение по умолчанию — [int32]::MaxValue, что означает, что Compare-Object проверяет всю коллекцию объектов.

При работе с большими коллекциями значение по умолчанию может быть не эффективным, но точным. Указание меньшего значения для SyncWindow может повысить производительность, но может иметь меньшую точность.

Свойства параметра

Тип:Int32
Default value:[int32]::MaxValue
Поддерживаются подстановочные знаки:False
DontShow:False

Наборы параметров

(All)
Position:Named
Обязательно:False
Значение из конвейера:False
Значение из конвейера по имени свойства:False
Значение из оставшихся аргументов:False

CommonParameters

Этот командлет поддерживает общие параметры: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction и -WarningVariable. Дополнительные сведения см. в разделе about_CommonParameters.

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

PSObject

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

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

None

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

PSCustomObject

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

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

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

Примечания

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

  • Виндоус:
    • compare
    • diff

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