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

Compare-Object Cmdlet membandingkan dua set objek. Satu set objek adalah referensi, dan set objek lainnya adalah perbedaannya.

Compare-Object memeriksa metode yang tersedia untuk membandingkan seluruh objek. Jika tidak dapat menemukan metode yang sesuai, metode ini memanggil metode ToString() dari 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 objek perbedaan (=>). Jika parameter IncludeEqual digunakan, (==) menunjukkan nilainya ada di kedua objek.

Jika referensi atau objek perbedaan null ($null), Compare-Object menghasilkan kesalahan yang mengakhiri.

Beberapa contoh menggunakan percikan 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 objek referensi (<=) dan Testfile2.txtmerupakan objek perbedaan (=>). Baris dengan konten yang muncul di kedua file tidak ditampilkan.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)

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 - Menampilkan perbedaan saat menggunakan parameter PassThru

Biasanya, Compare-Object mengembalikan jenis PSCustomObject dengan properti berikut:

  • InputObject sedang dibandingkan
  • Properti SideIndicator menunjukkan objek input mana yang menjadi milik output

Saat Anda menggunakan parameter PassThru , Jenis objek tidak diubah tetapi instans objek yang dikembalikan memiliki NoteProperty tambahan bernama SideIndicator. SideIndicator menunjukkan objek input 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 oleh format default untuk objek System.Boolean tidak menampilkan properti SideIndicator . Namun, objek System.Boolean yang dikembalikan memiliki NoteProperty yang ditambahkan.

Contoh 4 - Membandingkan dua objek sederhana menggunakan properti

Dalam contoh ini, kami membandingkan dua string berbeda yang memiliki panjang yang sama.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -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 , lalu 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 menjadi string sehingga objek berbeda.

Parameter

-CaseSensitive

Menunjukkan bahwa perbandingan harus peka huruf besar/kecil.

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

Menentukan budaya yang akan digunakan untuk perbandingan.

Type:String
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-DifferenceObject

Menentukan objek yang dibandingkan dengan objek referensi .

Type:PSObject[]
Position:1
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-ExcludeDifferent

Menunjukkan bahwa cmdlet ini hanya menampilkan karakteristik objek yang dibandingkan yang sama. Perbedaan antara objek dibuang.

Gunakan ExcludeDifferent dengan IncludeEqual untuk hanya menampilkan garis yang cocok antara objek referensi dan perbedaan .

Jika ExcludeDifferent ditentukan tanpa IncludeEqual, tidak ada output.

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-IncludeEqual

IncludeEqual menampilkan kecocokan antara objek referensi dan perbedaan .

Secara default, output juga mencakup perbedaan antara referensi dan objek perbedaan .

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

Saat Anda menggunakan parameter PassThru , Compare-Object menghilangkan pembungkus PSCustomObject di sekitar objek yang dibandingkan dan mengembalikan objek yang berbeda, tidak berubah.

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Menentukan array properti referensi dan objek perbedaan 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.

Type:Object[]
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-ReferenceObject

Menentukan array objek yang digunakan sebagai referensi untuk perbandingan.

Type:PSObject[]
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-SyncWindow

Menentukan jumlah objek yang berdampingan yang Compare-Object memeriksa saat mencari kecocokan dalam kumpulan objek. Compare-Object memeriksa objek yang berbatasan ketika tidak menemukan objek dalam posisi yang sama dalam koleksi. Nilai defaultnya adalah [Int32]::MaxValue, yang berarti memeriksa Compare-Object 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 bisa memiliki akurasi yang lebih rendah.

Type:Int32
Position:Named
Default value:[Int32]::MaxValue
Accept pipeline input:False
Accept wildcard characters:False

Input

PSObject

Anda dapat mengirim objek ke alur ke parameter DifferenceObject .

Output

None

Jika objek referensi dan objek perbedaan sama, tidak ada output, kecuali Anda menggunakan parameter IncludeEqual .

PSCustomObject

Jika objek berbeda, Compare-Object bungkus objek yang berbeda dalam PSCustomObject pembungkus dengan properti SideIndicator untuk mereferensikan perbedaan.

Saat Anda menggunakan parameter PassThru , Jenis objek tidak diubah tetapi instans objek yang dikembalikan memiliki NoteProperty tambahan bernama SideIndicator. SideIndicator menunjukkan objek input 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 dengan Compare-Object tidak menyertakan properti SideIndicator . Untuk informasi selengkapnya lihat Contoh 3 di artikel ini.