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 sekumpulan 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() 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 di objek perbedaan (=>). Jika parameter IncludeEqual digunakan, (==) menunjukkan nilai berada di kedua objek.

Jika referensi atau objek perbedaan 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: anjing, tupai, dan burung.
  • Testfile2.txt berisi nilai-nilai: kucing, burung, dan racoon.

Output hanya menampilkan baris yang berbeda di antara file. Testfile1.txtadalah 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 - Tampilkan perbedaan saat menggunakan parameter PassThru

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

  • InputObject sedang 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 NoteProperty yang ditambahkan.

Contoh 4 - Membandingkan dua objek sederhana menggunakan properti

Dalam contoh ini, kita 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 lalu 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 ke string sehingga objek berbeda.

Parameter

-CaseSensitive

Menunjukkan bahwa perbandingan harus peka huruf besar/kecil.

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

-Culture

Menentukan budaya yang akan digunakan untuk perbandingan.

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

-DifferenceObject

Menentukan objek yang dibandingkan dengan objek referensi .

Type:PSObject[]
Position:1
Default value:None
Required:True
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 menampilkan hanya baris yang cocok antara objek referensi dan perbedaan .

Jika ExcludeDifferent ditentukan tanpa IncludeEqual, tidak ada output.

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

-IncludeEqual

IncludeEqual menampilkan kecocokan antara referensi dan objek perbedaan .

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

Type:SwitchParameter
Position:Named
Default value:False
Required: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
Required: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
Required:False
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
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-SyncWindow

Menentukan jumlah objek yang berdekatan yang Compare-Object memeriksa saat mencari kecocokan dalam kumpulan objek. Compare-Object memeriksa objek yang berdekatan 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 dapat memiliki akurasi yang lebih rendah.

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

Input

PSObject

Anda dapat mengirim objek ke bawah alur ke parameter DifferenceObject .

Output

None

Secara default, cmdlet ini tidak mengembalikan output saat ReferenceObject dan DifferenceObject sama.

PSCustomObject

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 dengan Compare-Object tidak menyertakan properti SideIndicator . Untuk informasi selengkapnya lihat Contoh 3 di artikel ini.