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 этой статьи.