Compare-Object
Membandingkan dua set objek.
Sintaks
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
Deskripsi
Cmdlet Compare-Object
membandingkan dua set objek. Satu set objek adalah referensi , dan kumpulan objek lainnya adalah perbedaan .
Compare-Object
memeriksa metode yang tersedia untuk membandingkan seluruh objek. Jika tidak dapat menemukan metode yang sesuai, metode ini memanggil metode ToString() objek input dan membandingkan hasil string. Anda dapat menyediakan satu atau beberapa properti yang akan digunakan untuk perbandingan. Ketika properti disediakan, cmdlet membandingkan nilai properti tersebut saja.
Hasil perbandingan menunjukkan apakah nilai properti hanya muncul di objek referensi (<=
) atau hanya dalam perbedaan objek (=>
). Jika parameter IncludeEqual digunakan, (==
) menunjukkan nilainya ada di kedua objek.
Jika referensi atau perbedaan objek null ($null
), Compare-Object
menghasilkan kesalahan penghentian.
Beberapa contoh menggunakan splatting untuk mengurangi panjang baris sampel kode. Untuk informasi selengkapnya, lihat about_Splatting.
Contoh
Contoh 1 - Bandingkan konten dua file teks
Contoh ini membandingkan konten dua file teks. Contohnya menggunakan dua file teks berikut, dengan setiap nilai pada baris terpisah.
-
Testfile1.txt
berisi nilai-nilai: anjing, tupai, dan burung. -
Testfile2.txt
berisi nilai-nilai: kucing, burung, dan racoon.
Output hanya menampilkan baris yang berbeda di antara file.
Testfile1.txt
adalah referensi objek (<=
) dan Testfile2.txt
adalah perbedaan objek (=>
). Baris dengan konten yang muncul di kedua file tidak ditampilkan.
$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 <=
Contoh 2 - Membandingkan setiap baris konten dan mengecualikan perbedaan
Contoh ini menggunakan parameter ExcludeDifferent untuk membandingkan setiap baris konten dalam dua file teks.
Pada PowerShell 7.1, saat menggunakan parameter ExcludeDifferent, IncludeEqual disimpulkan dan output hanya berisi baris yang terkandung dalam kedua file, seperti yang ditunjukkan oleh 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 ==
Contoh 3 - Tampilkan perbedaan saat menggunakan parameter PassThru
Biasanya, Compare-Object
mengembalikan jenis PSCustomObject dengan properti berikut:
- InputObject dibandingkan
- Properti SideIndicator yang menunjukkan objek input mana yang dimiliki output
Saat Anda menggunakan parameter PassThru, Jenis objek tidak diubah tetapi instans objek yang dikembalikan memiliki NoteProperty tambahan bernama SideIndicator. SideIndicator menunjukkan objek input mana tempat output berada.
Contoh berikut menunjukkan berbagai jenis output.
$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===
Saat menggunakan PassThru, jenis objek asli (System.Boolean) dikembalikan. Perhatikan bagaimana output yang ditampilkan dengan format default untuk objek System.Boolean tidak menampilkan properti SideIndicator. Namun, objek System.Boolean yang dikembalikan memiliki NotePropertyyang ditambahkan.
Contoh 4 - Membandingkan dua objek sederhana menggunakan properti
Dalam contoh ini, kita membandingkan dua string berbeda yang memiliki panjang yang sama.
$objects = @{
ReferenceObject = 'abc'
DifferenceObject = 'xyz'
Property = 'Length'
}
Compare-Object @objects -IncludeEqual
Length SideIndicator
------ -------------
3 ==
Contoh 5 - Membandingkan objek kompleks menggunakan properti
Contoh ini menunjukkan perilaku saat membandingkan objek kompleks. Dalam contoh ini, kami menyimpan dua objek proses yang berbeda untuk instans PowerShell yang berbeda. Kedua variabel berisi objek proses dengan nama yang sama. Ketika objek dibandingkan tanpa menentukan parameter Properti, cmdlet menganggap objek sama. Perhatikan bahwa nilai InputObject sama dengan hasil metode ToString(). Karena kelas System.Diagnostics.Process tidak memiliki antarmuka IComparable, cmdlet mengonversi objek menjadi string kemudian membandingkan hasilnya.
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 <=
Saat Anda menentukan properti yang akan dibandingkan, cmdlet menunjukkan perbedaannya.
Contoh 6 - Membandingkan objek kompleks yang mengimplementasikan IComparable
Jika objek mengimplementasikan IComparable, cmdlet mencari cara untuk membandingkan objek. Jika objek adalah jenis yang berbeda, objek Perbedaan dikonversi ke jenis ReferenceObject kemudian dibandingkan.
Dalam contoh ini, kita membandingkan string dengan objek TimeSpan. Dalam kasus pertama, string dikonversi ke timeSpan sehingga objek sama.
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 <=
Dalam kasus kedua, TimeSpan dikonversi ke string sehingga objek berbeda.
Parameter
-CaseSensitive
Menunjukkan bahwa perbandingan harus peka huruf besar/kecil.
Jenis: | SwitchParameter |
Position: | Named |
Nilai default: | False |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
-Culture
Menentukan budaya yang akan digunakan untuk perbandingan.
Jenis: | String |
Position: | Named |
Nilai default: | None |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
-DifferenceObject
Menentukan objek yang dibandingkan dengan referensi objek.
Jenis: | PSObject[] |
Position: | 1 |
Nilai default: | None |
Diperlukan: | True |
Terima input alur: | True |
Terima karakter wildcard: | False |
-ExcludeDifferent
Menunjukkan bahwa cmdlet ini hanya menampilkan karakteristik objek yang dibandingkan yang sama. Perbedaan antara objek dibuang.
Gunakan ExcludeDifferent dengan IncludeEqual untuk menampilkan hanya garis yang cocok antara referensi dan perbedaan objek.
Jika ExcludeDifferent ditentukan tanpa IncludeEqual, tidak ada output.
Jenis: | SwitchParameter |
Position: | Named |
Nilai default: | False |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
-IncludeEqual
IncludeEqual menampilkan kecocokan antara referensi dan perbedaan objek.
Secara default, output juga mencakup perbedaan antara referensi dan perbedaan objek.
Jenis: | SwitchParameter |
Position: | Named |
Nilai default: | False |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
-PassThru
Saat Anda menggunakan parameter PassThru, Compare-Object
menghilangkan pembungkus PSCustomObject di sekitar objek yang dibandingkan dan mengembalikan objek yang berbeda, tidak berubah.
Jenis: | SwitchParameter |
Position: | Named |
Nilai default: | False |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
-Property
Menentukan array properti referensi dan perbedaan objek untuk dibandingkan.
Nilai parameter Properti dapat menjadi properti terhitung baru. Properti terhitung dapat berupa blok skrip atau tabel hash. Pasangan kunci-nilai yang valid adalah:
- Ekspresi -
<string>
atau<script block>
Untuk informasi selengkapnya, lihat about_Calculated_Properties.
Jenis: | Object[] |
Position: | Named |
Nilai default: | None |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
-ReferenceObject
Menentukan array objek yang digunakan sebagai referensi untuk perbandingan.
Jenis: | PSObject[] |
Position: | 0 |
Nilai default: | None |
Diperlukan: | True |
Terima input alur: | False |
Terima karakter wildcard: | False |
-SyncWindow
Menentukan jumlah objek yang berdekatan yang Compare-Object
periksa saat mencari kecocokan dalam kumpulan objek.
Compare-Object
memeriksa objek yang berdekatan ketika tidak menemukan objek dalam posisi yang sama dalam koleksi. Nilai default adalah [Int32]::MaxValue
, yang berarti bahwa Compare-Object
memeriksa seluruh koleksi objek.
Saat bekerja dengan koleksi besar, nilai default mungkin tidak efisien tetapi akurat. Menentukan nilai yang lebih kecil untuk SyncWindow dapat meningkatkan performa tetapi dapat memiliki akurasi yang lebih rendah.
Jenis: | Int32 |
Position: | Named |
Nilai default: | [Int32]::MaxValue |
Diperlukan: | False |
Terima input alur: | False |
Terima karakter wildcard: | False |
Input
Anda dapat mengirim objek ke alur ke parameter DifferenceObject.
Output
None
Secara default, cmdlet ini tidak mengembalikan output saat ReferenceObject dan DifferenceObject sama.
Ketika objek berbeda, cmdlet ini membungkus objek yang berbeda dalam pembungkus PSCustomObject dengan properti SideIndicator untuk mereferensikan perbedaan.
Saat Anda menggunakan parameter IncludeEqual dan objeknya sama, cmdlet mengembalikan objek yang dibungkus dalam PSCustomObject dengan properti SideIndicator diatur ke ==
.
Saat Anda menggunakan parameter PassThru, Jenis objek tidak diubah tetapi instans objek yang dikembalikan memiliki NoteProperty tambahan bernama SideIndicator. SideIndicator menunjukkan objek input mana tempat output berada.
Catatan
PowerShell menyertakan alias berikut untuk Compare-Object
:
- Windows:
compare
diff
Saat menggunakan parameter PassThru, output yang ditampilkan di konsol mungkin tidak menyertakan properti SideIndicator. Tampilan format default untuk output jenis objek menurut Compare-Object
tidak menyertakan properti SideIndicator. Untuk informasi selengkapnya, lihat Contoh 3 dalam artikel ini.