Compara dois conjuntos de objectos.
- Syntax
- Descrição
- Exemplos
- Exemplo 1 – Compare o conteúdo de dois arquivos de texto
- Exemplo 2 – Compare cada linha de conteúdo e exclua as diferenças
- Exemplo 3 – Mostra a diferença quando usando o parâmetro PassThru
- Example 4 – Comparar dois objetos simples usando propriedades
- Example 5 – Comparar objetos complexos usando propriedades
- Exemplo 6 – Comparando objetos complexos que implementam o IComparable
- Parametros
- Entradas
- Entradas
- Notes
Syntax
Compare-Object <PSObject> <PSObject> >]
Descrição
The Compare-Object
cmdlet compara dois conjuntos de objectos. Um conjunto de objetos é a referência, e o outro conjunto de objetos é a diferença.
>Compare-Object
verifica os métodos disponíveis para comparar um objeto inteiro. Se não encontrar um método adequado, ele chama os métodos ToString() dos objetos de entrada e compara os stringresults. Você pode fornecer uma ou mais propriedades a serem usadas para comparação. Quando as propriedades são fornecidas, o cmdlet compara os valores dessas propriedades apenas.
O resultado da comparação indica se um valor de propriedade apareceu apenas no objeto de referência (<=
) ou apenas no objeto de diferença (=>
). Se o parâmetro IncludeEqual for usado, (==
) indica que o valor está em ambos os objetos.
Se os objetos de referência ou de diferença forem nulos ($null
), Compare-Object
gera erro aterminante.
Alguns exemplos usam splatting para reduzir o comprimento da linha das amostras de código. Para mais informações, veja sobre_Splatting.
Exemplos
Exemplo 1 – Compare o conteúdo de dois arquivos de texto
Este exemplo compara o conteúdo de dois arquivos de texto. O exemplo usa os dois arquivos de texto seguintes, com cada valor em uma linha separada.
-
Testfile1.txt
contém os valores: cão, esquilo e pássaro. -
Testfile2.txt
contém os valores: gato, pássaro e guaxinim.
A saída exibe apenas as linhas que são diferentes entre os arquivos. Testfile1.txt
é o objeto de referência (<=
) e Testfile2.txt
é o objeto de diferença (=>
). As linhas comcontente que aparecem em ambos os arquivos não são exibidas.
Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)InputObject SideIndicator----------- -------------cat =>racoon =>dog <=squirrel <=
Exemplo 2 – Compare cada linha de conteúdo e exclua as diferenças
Este exemplo usa o parâmetro ExcludeDifferent para comparar cada linha decontente em dois arquivos de texto.
As do PowerShell 7.1, ao usar o parâmetro ExcludeDifferent, IncludeEqual é inferido e a saída contém apenas as linhas contidas em ambos os arquivos, como mostrado pelo SideIndicator(==
).
$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject SideIndicator----------- -------------bird ==
Exemplo 3 – Mostra a diferença quando usando o parâmetro PassThru
Normalmente, Compare-Object
retorna um tipo PSCustomObject com as seguintes propriedades:
- O objeto InputObject sendo comparado
- A propriedade SideIndicator mostrando a qual objeto de input o output pertence
Quando você usa o parâmetro PassThru, o Tipo do objeto não é alterado mas a instância do objeto retornado tem um NoteProperty chamado SideIndicator adicionado. SideIndicator mostra a que objeto de entrada o output pertence.
Os exemplos seguintes mostram os diferentes tipos de output.
$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===
Ao usar o parâmetro PassThru, o tipo de objeto original (System.Boolean) é retornado. Note como a saída exibida pelo formato padrão para objetos System.Boolean não exibiu a propriedadeSideIndicator. Entretanto, o objeto System.Boolean retornado tem a propriedadeNoteProperty.
Example 4 – Comparar dois objetos simples usando propriedades
Neste exemplo, comparamos duas strings diferentes que têm o mesmo comprimento.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqualLength SideIndicator------ ------------- 3 ==
Example 5 – Comparar objetos complexos usando propriedades
Este exemplo mostra o comportamento ao comparar objetos complexos. Neste exemplo nós armazenamos dois objetos de processo diferentes para diferentes instâncias do PowerShell. Ambas as variáveis contêm processbjects com o mesmo nome. Quando os objetos são comparados sem especificar o parâmetro de propriedades, o cmdlet considera os objetos como iguais. Note que o valor do objetoInputObject é o mesmo que o resultado do método ToString(). Como a classe System.Diagnostics.Process não tem a interface IComparable, o cmdletconverte os objetos para strings e compara os resultados.
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 <=
Quando você especifica propriedades a serem comparadas, o cmdlet mostra as diferenças.
Exemplo 6 – Comparando objetos complexos que implementam o IComparable
Se o objeto implementa o IComparable, o cmdlet procura formas de comparar os objetos. Se os objetos são de tipos diferentes, o objeto Diferença é convertido para o tipo do objetoReferenceObject e então comparado.
Neste exemplo, estamos comparando uma string com um objeto TimeSpan. No primeiro caso, a string é convertida para um TimeSpan para que os objetos sejam iguais.
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 <=
No segundo caso, o TimeSpan é convertido para uma string para que o objeto seja diferente.
Parametros
Indica que as comparações devem ser sensíveis a maiúsculas e minúsculas.
Tipo: | SwitchParameter |
Posição: | Nome: |
Valor por defeito: | Falso |
Aceitar entrada de gasoduto: | Falso |
Aceitar caracteres wildcard: | Falso |
Especifica a cultura a usar para comparações.
Tipo: | Calça |
Posição: | Nomeado |
Valor por defeito: | Nenhum |
Aceitar entrada de tubagem: | Falso |
Aceitar caracteres wildcard: | Falso |
Especifica os objectos que são comparados com os objectos de referência.
Tipo: | PSObject |
Posição: | >1 |
Valor por defeito: | Nenhum |
Aceitar entrada do pipeline: | Verdade |
Aceitar caracteres wildcard: | Falso |
Indica que este cmdlet mostra apenas as características dos objectos comparados que são iguais. As diferenças entre os objetos são descartadas.
Use ExcludeDifferent with IncludeEqual para exibir apenas as linhas que correspondem entre os objetos de referência e os objetos de diferença.
Se ExcludeDifferent for especificado sem IncludeEqual, não há saída.
Type: | SwitchParameter |
Position: | Named |
Valor por defeito: | False |
Aceptar entrada do pipeline: | Falso |
Aceitar caracteres wildcard: | Falso |
IncluirIgual exibe as correspondências entre os objectos de referência e os objectos de diferença.
Por defeito, a saída também inclui as diferenças entre os objectos de referência e os objectos de diferença.
Type: | SwitchParameter |
Position: | Named |
Valor por defeito: | Falso |
Aceitar entrada da conduta: | Falso |
Aceitar caracteres wildcard: | Falso |
Quando você usa o parâmetro PassThru, Compare-Object
omite o PSCustomObject wrapperaround dos objetos comparados e retorna os diferentes objetos, inalterados.
Type: | SwitchParameter |
Position: | Named |
Valor por defeito: | False |
Aceptar entrada do pipeline: | Falso |
Aceitar caracteres wildcard: | Falso |
Especifica um conjunto de propriedades dos objectos de referência e de diferença a comparar.
O valor do parâmetro Propriedade pode ser uma nova propriedade calculada. A propriedade calculada pode ser um bloco de script ou uma tabela hash. Pares de valores chave válidos são:
- Expressão –
<string>
ou<script block>
Para mais informações, veja sobre as Propriedades_Calculadas.
Tipo: | Objecto: |
Posição: | Nome: |
Valor por defeito: | Nenhum |
Aceitar entrada do pipeline: | Falso |
Aceitar caracteres wildcard: | Falso |
Especifica um conjunto de objectos usados como referência para comparação.
Type: | PSObject |
Posição: | >0 |
Valor por defeito: | Nenhum |
Aceitar entrada do pipeline: | Falso |
Aceitar caracteres wildcard: | Falso |
Especifica o número de objectos adjacentes que Compare-Object
inspecciona enquanto procura uma correspondência numa colecção de objectos. Compare-Object
examina objetos adjacentes quando não encontra o objeto na mesma posição em uma coleção. O valor padrão é ::MaxValue
, o que significa queCompare-Object
examina toda a coleção de objetos.
Tipo: | Int32 |
Posição: | Nome |
Valor padrão: | ::Valor Máximo |
Aceitar entrada do pipeline: | Falso |
Aceitar caracteres wildcard: | Falso |
Entradas
SpObjecto
Pode enviar um objecto pelo pipeline para o parâmetro DifferenceObject.
Entradas
Nenhum
Se o objeto de referência e o objeto de diferença forem os mesmos, não há output, sem usar o parâmetro IncludeEqual.
PSCustomObject
Se os objectos são diferentes, Compare-Object
envolve os diferentes objectos num PSCustomObject
wrapper com uma propriedade SideIndicator para referenciar as diferenças.
Quando utiliza o parâmetro PassThru, o Tipo do objecto não é alterado mas a instância do objecto retornado tem um NoteProperty chamado SideIndicator adicionado. SideIndicator mostra a que objeto de entrada a saída pertence.
Notes
Ao usar o parâmetro PassThru, a saída exibida no console pode não incluir a propriedadeSideIndicator. A vista de formato padrão da saída para o tipo de objeto porCompare-Object
não inclui a propriedade SideIndicator. Para mais informações vejaExemplo 3 neste artigo.
- sobre_Propriedades_Calculadas
- ParaEach-Object
- Group-Object
- Measure-Object
- New-Objeto
- Select-Object
- Sort-Object
- Tee-Object
- Where-Object
- Get-Process
>