Поиск по сайту:

Compare-Object (Microsoft.PowerShell.Utility)


Compare-Object

Модуль:
Microsoft.PowerShell.Utility

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

Синтаксис

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

Описание

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

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

Результат сравнения показывает, появилось ли значение свойства только в объекте ссылка (<=) или только в объекте разница (=>). Если используется параметр IncludeEqual, (==) указывает, что значение находится в обоих объектах.

Если объекты reference или difference имеют значение NULL ($null), Compare-Object генерирует завершающую ошибку.

В некоторых примерах сплаттинг используется для уменьшения длины строки примеров кода. Для получения дополнительной информации см. about_Splatting.

Примеры

Пример 1. Сравните содержимое двух текстовых файлов.

В этом примере сравнивается содержимое двух текстовых файлов. В примере используются следующие два текстовых файла, в которых каждое значение находится на отдельной строке.

  • Testfile1.txt содержит значения: собака, белка и птица.
  • Testfile2.txt содержит значения: кошка, птица и енот.

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

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

Тип :

SwitchParameter

Позиция:

Именованный

Значение по умолчанию:

False

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-Culture

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

Тип :

String

Позиция:

Именованный

Значение по умолчанию:

None

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-DifferenceObject

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

Тип :

PSОбъект[]

Позиция:

1

Значение по умолчанию:

None

Необходимый:

True

Примите ввод конвейера:

True

Принимайте подстановочные знаки:

False

-ExcludeDifferent

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

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

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

Тип :

SwitchParameter

Позиция:

Именованный

Значение по умолчанию:

False

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-IncludeEqual

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

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

Тип :

SwitchParameter

Позиция:

Именованный

Значение по умолчанию:

False

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-PassThru

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

Тип :

SwitchParameter

Позиция:

Именованный

Значение по умолчанию:

False

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-Property

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

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

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

Дополнительные сведения см. в разделе about_Calculated_Properties.

Тип :

Object[]

Позиция:

Именованный

Значение по умолчанию:

None

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-ReferenceObject

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

Тип :

PSОбъект[]

Позиция:

0

Значение по умолчанию:

None

Необходимый:

True

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

-SyncWindow

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

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

Тип :

Int32

Позиция:

Именованный

Значение по умолчанию:

[Int32]::MaxValue

Необходимый:

False

Примите ввод конвейера:

False

Принимайте подстановочные знаки:

False

Входы

PSObject

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

Выходы

Нет

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

PSCustomObject

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

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

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

Примечания

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

  • Windows:

      compare
      diff

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