Compare-Object

Modul: Microsoft.PowerShell.Utility

Compara două seturi de obiecte.

Syntaxă

Compare-Object <PSObject> <PSObject> >] 

Descriere

Codletul Compare-Object compară două seturi de obiecte. Un set de obiecte este referința,iar celălalt set de obiecte este diferența.

Compare-Objectverifică metodele disponibile de comparare a unui obiect întreg. Dacă nu găsește o metodă potrivită, apelează metodele ToString() ale obiectelor de intrare și compară rezultatele șirurilor de caractere. Puteți furniza una sau mai multe proprietăți care să fie utilizate pentru comparație. Atunci când sunt furnizate proprietăți, cmdlet-ul compară numai valorile acelor proprietăți.

Rezultatul comparației indică dacă valoarea unei proprietăți a apărut numai în obiectul de referință (<=) sau numai în obiectul de diferență (=>). Dacă se utilizează parametrul IncludeEqual, (==) indică faptul că valoarea se află în ambele obiecte.

Dacă obiectele de referință sau de diferență sunt nule ($null), Compare-Object generează o eroare de terminare.

Câteva exemple utilizează splatting pentru a reduce lungimea de linie a exemplelor de cod. Pentru mai multe informații, consultațiabout_Splatting.

Exemple

Exemplu 1 – Compararea conținutului a două fișiere text

Acest exemplu compară conținutul a două fișiere text. Exemplul utilizează următoarele două fișiere de text,cu fiecare valoare pe o linie separată.

  • Testfile1.txt conține valorile: câine, veveriță și pasăre.
  • Testfile2.txt conține valorile: pisică, pasăre și raton.

Legătura de ieșire afișează numai liniile care sunt diferite între fișiere. Testfile1.txt este obiectul de referință (<=) și Testfile2.txt este obiectul de diferență (=>). Liniile cu conținut care apar în ambele fișiere nu sunt afișate.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)InputObject SideIndicator----------- -------------cat =>racoon =>dog <=squirrel <=

Exemplu 2 – Compararea fiecărei linii de conținut și excluderea diferențelor

Acest exemplu utilizează parametrul ExcludeDifferent pentru a compara fiecare linie de conținut din două fișiere text.

De la PowerShell 7.1, atunci când se utilizează parametrul ExcludeDifferent, se deduce IncludeEqual și rezultatul conține numai liniile conținute în ambele fișiere, după cum arată SideIndicator(==).

$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject SideIndicator----------- -------------bird ==

Exemplu 3 – Afișarea diferenței atunci când se utilizează parametrul PassThru

În mod normal, Compare-Object returnează un tip PSCustomObject cu următoarele proprietăți:

  • Obiectul de intrare comparat
  • Proprietatea SideIndicator care arată cărui obiect de intrare aparține ieșirea

Când se utilizează parametrul PassThru, tipul obiectului nu se modifică, dar instanța obiectului returnat are adăugată o proprietate NoteProperty numită SideIndicator. SideIndicator arată cărui obiect de intrare aparține ieșirea.

Exemplele următoare prezintă diferitele tipuri de ieșire.

$a = $TrueCompare-Object -IncludeEqual $a $a(Compare-Object -IncludeEqual $a $a) | Get-MemberInputObject SideIndicator----------- ------------- True == TypeName: System.Management.Automation.PSCustomObjectName 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=TrueSideIndicator NoteProperty string SideIndicator===Compare-Object -IncludeEqual $a $a -PassThru(Compare-Object -IncludeEqual $a $a -PassThru) | Get-MemberTrue TypeName: System.BooleanName MemberType Definition---- ---------- ----------CompareTo Method int CompareTo(System.Object obj), int CompareTo(bool value), int IComparable.CompareTo(SystEquals Method bool Equals(System.Object obj), bool Equals(bool obj), bool IEquatable.Equals(bool otGetHashCode 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.ToToType 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 destination, int charsWritten)SideIndicator NoteProperty string SideIndicator===

Când se utilizează PassThru, se returnează tipul de obiect original (System.Boolean). Observați cum ieșirea afișată de formatul implicit pentru obiectele System.Boolean nu a afișat proprietateaSideIndicator. Cu toate acestea, obiectul System.Boolean returnat are proprietatea adăugatăNoteProperty.

Exemplu 4 – Compararea a două obiecte simple utilizând proprietăți

În acest exemplu, comparăm două șiruri de caractere diferite care au aceeași lungime.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqualLength SideIndicator------ ------------- 3 ==

Exemplu 5 – Compararea obiectelor complexe utilizând proprietăți

Acest exemplu arată comportamentul la compararea obiectelor complexe. În acest exemplu, stocăm douăobiecte de proces diferite pentru diferite instanțe de PowerShell. Ambele variabile conțin obiecte de proces cu același nume. Atunci când obiectele sunt comparate fără a specifica parametrul Propertyparametru, cmdlet-ul consideră că obiectele sunt egale. Observați că valoarea obiectuluiInputObject este aceeași cu cea a rezultatului metodei ToString(). Deoarece clasaSystem.Diagnostics.Process nu are interfața IComparable, cmdletconvertește obiectele în șiruri de caractere, apoi compară rezultatele.

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 pwshPS> $a = Get-Process -Id 11168PS> $b = Get-Process -Id 17600PS> $a.ToString()System.Diagnostics.Process (pwsh)PS> $b.ToString()System.Diagnostics.Process (pwsh)PS> Compare-Object $a $b -IncludeEqualInputObject SideIndicator----------- -------------System.Diagnostics.Process (pwsh) ==PS> Compare-Object $a $b -Property ProcessName, Id, CPUProcessName Id CPU SideIndicator----------- -- --- -------------pwsh 17600 11.4375 =>pwsh 11168 36.203125 <=

Când specificați proprietățile care urmează să fie comparate, cmdlet-ul arată diferențele.

Exemplu 6 – Compararea obiectelor complexe care implementează IComparable

Dacă obiectul implementează IComparable, cmdlet-ul caută modalități de a compara obiectele.Dacă obiectele sunt de tipuri diferite, obiectul Difference este convertit în tipul obiectuluiReferenceObject, apoi este comparat.

În acest exemplu, comparăm un șir de caractere cu un obiect TimeSpan. În primul caz, șirul de caractere este convertit într-un TimeSpan, astfel încât obiectele sunt egale.

Compare-Object ("0:0:1") "0:0:1" -IncludeEqualInputObject SideIndicator----------- -------------00:00:01 ==Compare-Object "0:0:1" ("0:0:1")InputObject SideIndicator----------- -------------00:00:01 =>0:0:1 <=

În al doilea caz, TimeSpan este convertit într-un șir de caractere, astfel încât obiectele sunt diferite.

Parameters

-CaseSensitive

Indică faptul că comparațiile trebuie să țină seama de majuscule și minuscule.

Tip: SwitchParameter
Poziție: Numit
Valoare implicită: False
Acceptă intrarea în conductă: False
Acceptă caractere wildcard: False
-Culture

Specifică cultura care trebuie utilizată pentru comparații.

Tip: Stringere
Poziție: Numit
Valoare implicită: Nimic
Aceptă intrarea în conductă: False
Acceptă caractere wildcard: False
-DifferenceObject

Specifică obiectele care sunt comparate cu obiectele de referință.

Tip: PSObject
Poziție: 1
Valoare implicită: Nimic
Acceptă intrarea în conductă: True
Acceptă caractere wildcard: False
-ExcludeDifferent

Indică faptul că acest cmdlet afișează numai caracteristicile obiectelor comparate care sunt egale. Diferențele dintre obiecte sunt eliminate.

Utilizați ExcludeDifferent cu IncludeEqual pentru a afișa numai liniile care se potrivesc între obiectele de referință și cele de diferență.

Dacă ExcludeDifferent este specificat fără IncludeEqual, nu există nici o ieșire.

Tip: SwitchParameter
Poziție: Numit
Valoare implicită: False
Acceptă intrarea în conductă: False
Acceptă caractere wildcard: False
-IncludeEqual

IncludeEqual afișează corespondențele dintre obiectele de referință și cele de diferență.

În mod implicit, rezultatul include, de asemenea, diferențele dintre obiectele de referință și cele de diferență.

Type: SwitchParameter
Position: Named
Default value: False
Acceptă intrări de tip pipeline: False
Acceptă caractere wildcard: False
-PassThru

Când utilizați parametrul PassThru, Compare-Object omite învelișul PSCustomObject din jurul obiectelor comparate și returnează obiectele diferite, neschimbate.

Tip: SwitchParameter
Poziție: Numit
Valoare implicită: False
Acceptă intrarea în conductă: False
Acceptă caractere wildcard: False
-Property

Specifică o matrice de proprietăți ale obiectelor de referință și de diferență care urmează să fie comparate.

Valoarea parametrului Property poate fi o nouă proprietate calculată. Proprietatea calculată poate fi un bloc de script sau un tabel hash. Perechile cheie-valoare valide sunt:

  • Expresie – <string> sau <script block>

Pentru mai multe informații, a se vedeaabout_Calculated_Properties.

Tip: Obiect
Poziție: Numit
Valoare implicită: Nimic
Acceptă intrarea în conductă: False
Acceptă caractere wildcard: False
-ReferenceObject

Specifică o matrice de obiecte utilizate ca referință pentru comparație.

Tip: PSObject
Poziție: 0
Valoare implicită: Nimic
Acceptă intrarea în conductă: False
Acceptă caractere wildcard: False
-SyncWindow

Specifică numărul de obiecte adiacente pe care Compare-Object le inspectează în timp ce caută o potrivire într-o colecție de obiecte. Compare-Object examinează obiectele adiacente atunci când nu găsește obiectulîn aceeași poziție într-o colecție. Valoarea implicită este ::MaxValue, ceea ce înseamnă căCompare-Object examinează întreaga colecție de obiecte.

Type: Int32
Position: Numit
Valoare implicită: ::MaxValue
Acceptă intrarea în conductă: False
Acceptă caractere wildcard: False

Intrări

PSObject

Puteți trimite un obiect în conductă la parametrul DifferenceObject.

Outputs

None

Dacă obiectul de referință și obiectul de diferență sunt identice, nu există nici o ieșire, cu excepția cazului în care folosiți parametrul IncludeEqual.

PSCustomObject

Dacă obiectele sunt diferite, Compare-Object înfășoară obiectele diferite într-un PSCustomObjectînveliș cu o proprietate SideIndicator pentru a face referire la diferențe.

Când folosiți parametrul PassThru, tipul obiectului nu se modifică, dar instanța obiectului returnat are adăugată o proprietate NoteProperty numită SideIndicator. SideIndicator arată cărui obiect de intrare aparține ieșirea.

Note

Când se utilizează parametrul PassThru, este posibil ca ieșirea afișată în consolă să nu includă proprietateaSideIndicator. Vizualizarea implicită a formatului implicit al pentru tipul de obiect ieșit prinCompare-Object nu include proprietatea SideIndicator. Pentru mai multe informații, consultațiExemplul 3 din acest articol.

  • about_Calculated_Properties
  • ForEach-Object
  • Group-Object
  • Measure-Object
  • Measure-Object
  • New-Object
  • Select-Object
  • Sort-Object
  • Tee-Object
  • Where-Object
  • Get-Process

Lasă un răspuns

Adresa ta de email nu va fi publicată.