Compara două seturi de obiecte.
- Syntaxă
- Descriere
- Exemple
- Exemplu 1 – Compararea conținutului a două fișiere text
- Exemplu 2 – Compararea fiecărei linii de conținut și excluderea diferențelor
- Exemplu 3 – Afișarea diferenței atunci când se utilizează parametrul PassThru
- Exemplu 4 – Compararea a două obiecte simple utilizând proprietăți
- Exemplu 5 – Compararea obiectelor complexe utilizând proprietăți
- Exemplu 6 – Compararea obiectelor complexe care implementează IComparable
- Parameters
- Intrări
- Outputs
- Note
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-Object
verifică 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
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 |
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 |
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 |
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 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 |
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 |
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 |
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 |
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