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
Указывает, что сравнение выполняется с учетом регистра.
Тип: | SwitchParameter |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-Culture
Указывает язык, используемый для сравнения.
Тип: | String |
Position: | Named |
Default value: | None |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-DifferenceObject
Указывает объекты, которые сравниваются с эталонными объектами.
Тип: | PSObject[] |
Position: | 1 |
Default value: | None |
Обязательно: | True |
Принять входные данные конвейера: | True |
Принять подстановочные знаки: | False |
-ExcludeDifferent
Указывает, что этот командлет отображает только характеристики сравниваемых объектов, равных. Различия между объектами удаляются.
Используйте ExcludeDifferent с IncludeEqual, чтобы отобразить только строки, соответствующие объектам ссылок и отличиям.
Если параметр ExcludeDifferent указан без IncludeEqual, выходные данные отсутствуют.
Тип: | SwitchParameter |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-IncludeEqual
IncludeEqual отображает совпадения между объектами ссылок и отличий.
По умолчанию выходные данные также включают различия между объектами ссылок и различий.
Тип: | SwitchParameter |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-PassThru
При использовании параметра Compare-Object
PassThru опустить оболочку PSCustomObject вокруг сравниваемых объектов и возвращает различные объекты без изменений.
Тип: | SwitchParameter |
Position: | Named |
Default value: | False |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-Property
Задает массив свойств объектов ссылок и различий для сравнения.
Значение параметра Property может быть новым вычисляемым свойством. Вычисляемое свойство может быть блоком скрипта или хэш-таблицей. Допустимые пары "ключ-значение":
- Выражение —
<string>
или<script block>
Дополнительные сведения см. в about_Calculated_Properties.
Тип: | Object[] |
Position: | Named |
Default value: | None |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-ReferenceObject
Задает массив объектов, используемых в качестве ссылки для сравнения.
Тип: | PSObject[] |
Position: | 0 |
Default value: | None |
Обязательно: | True |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
-SyncWindow
Указывает количество смежных объектов, проверяющих Compare-Object
при поиске соответствия в коллекции объектов. Compare-Object
проверяет смежные объекты, если он не находит объект в той же позиции в коллекции. Значение по умолчанию — это [Int32]::MaxValue
означает, что Compare-Object
проверяет всю коллекцию объектов.
При работе с большими коллекциями значение по умолчанию может быть не эффективным, но точным. Указание меньшего значения для SyncWindow может повысить производительность, но может иметь меньшую точность.
Тип: | Int32 |
Position: | Named |
Default value: | [Int32]::MaxValue |
Обязательно: | False |
Принять входные данные конвейера: | False |
Принять подстановочные знаки: | False |
Входные данные
Объект можно отправить по конвейеру в параметр DifferenceObject .
Выходные данные
None
По умолчанию этот командлет не возвращает выходные данные, когда объект ReferenceObject и DifferenceObject совпадают.
Если объекты отличаются, этот командлет упаковывает различные объекты в оболочку PSCustomObject со свойством SideIndicator для ссылки на различия.
Если вы используете параметр IncludeEqual и объекты одинаковы, командлет возвращает объекты, упакованные в PSCustomObject со свойством SideIndicator, равным ==
.
При использовании параметра PassThru тип объекта не изменяется, но экземпляр возвращаемого объекта имеет добавленный NoteProperty с именем SideIndicator. SideIndicator показывает, к какому входному объекту принадлежит выходной объект.
Примечания
PowerShell включает следующие псевдонимы для Compare-Object
:
- Windows:
compare
diff
При использовании параметра PassThru выходные данные, отображаемые в консоли, могут не включать свойство SideIndicator. Представление формата по умолчанию для выходных данных Compare-Object
типа объекта не включает свойство SideIndicator . Дополнительные сведения см . в примере 3 в этой статье.
Связанные ссылки
PowerShell