Partilhar via


Compare-Object

Compara dois conjuntos de objetos.

Sintaxe

Default (Predefinição)

Compare-Object
    [-ReferenceObject] <PSObject[]>
    [-DifferenceObject] <PSObject[]>
    [-SyncWindow <Int32>]
    [-Property <Object[]>]
    [-ExcludeDifferent]
    [-IncludeEqual]
    [-PassThru]
    [-Culture <String>]
    [-CaseSensitive]
    [<CommonParameters>]

Description

O cmdlet Compare-Object compara dois conjuntos de objetos. Um conjunto de objetos é a referência , e o outro conjunto de objetos é a diferença.

Compare-Object verifica os métodos disponíveis de comparação de um objeto inteiro. Se não conseguir encontrar um método adequado, ele chama os ToString() métodos dos objetos de entrada e compara os resultados da cadeia de caracteres. Você pode fornecer uma ou mais propriedades a serem usadas para comparação. Quando as propriedades são fornecidas, o cmdlet compara apenas os valores dessas propriedades.

O resultado da comparação indica se um valor de propriedade apareceu apenas na referência objeto (<=) ou apenas na diferença objeto (=>). Se o parâmetro IncludeEqual for usado, (==) indica que o valor está em ambos os objetos.

Se o de referência ou a diferença objetos forem nulos (), gerará um erro de encerramento.

Alguns exemplos usam splatting para reduzir o comprimento da linha dos exemplos de código. Para obter mais informações, consulte about_Splatting.

Exemplos

Exemplo 1 - Comparar o conteúdo de dois ficheiros de texto

Este exemplo compara o conteúdo de dois arquivos de texto. O exemplo usa os dois arquivos de texto a seguir, 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 racoon.

A saída exibe apenas as linhas que são diferentes entre os arquivos. As linhas com conteúdo que aparecem em ambos os arquivos não são exibidas.

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

Para este exemplo, a saída mostra as seguintes informações

  • cat e racoon são encontrados no arquivo de objeto de diferença, mas ausentes do arquivo de objeto de referência
  • dog e squirrel são encontrados no arquivo de objeto de referência, mas ausentes do arquivo de objeto de diferença

Exemplo 2 - Comparar cada linha de conteúdo e excluir as diferenças

Este exemplo usa o parâmetro ExcludeDifferent para comparar cada linha de conteúdo em dois arquivos de texto.

A partir do PowerShell 7.1, ao usar o parâmetro ExcludeDifferent, IncludeEqual é inferida e a saída contém apenas linhas contidas em ambos os arquivos, conforme mostrado pelo 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        ==

Exemplo 3 - Mostrar a diferença ao usar o parâmetro PassThru

Normalmente, Compare-Object retorna um tipo de PSCustomObject com as seguintes propriedades:

  • O InputObject sendo comparado
  • A propriedade SideIndicator mostrando a qual objeto de entrada a saída pertence

Quando você usa o parâmetro PassThru, o Tipo de do objeto não é alterado, mas a instância do objeto retornado tem um NoteProperty adicionado chamado SideIndicator. SideIndicator mostra a qual objeto de entrada a saída pertence.

Os exemplos a seguir mostram os diferentes tipos de saída.

$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===

Ao usar PassThru, o tipo de objeto original (System.Boolean) é retornado. Observe como a saída exibida pelo formato padrão para objetos System.Boolean não exibiu a propriedade SideIndicator. No entanto, o objeto System.Boolean retornado tem o adicionado NoteProperty.

Exemplo 4 - Comparar dois objetos simples usando propriedades

Neste exemplo, comparamos duas cadeias de caracteres diferentes que têm o mesmo comprimento.

$objects = @{
  ReferenceObject = 'abc'
  DifferenceObject = 'xyz'
  Property = 'Length'
}
Compare-Object @objects -IncludeEqual
Length SideIndicator
------ -------------
     3 ==

Exemplo 5 - Comparando objetos complexos usando propriedades

Este exemplo mostra o comportamento ao comparar objetos complexos. Neste exemplo, armazenamos dois objetos de processo diferentes para instâncias diferentes do PowerShell. Ambas as variáveis contêm objetos de processo com o mesmo nome. Quando os objetos são comparados sem especificar o parâmetro Property , o cmdlet considera os objetos iguais. Observe que o valor do InputObject é o mesmo que o resultado do ToString() método. Como a classe System.Diagnostics.Process do não tem a interface IComparable, o cmdlet converte os objetos em cadeias de caracteres 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 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 <=

Quando você especifica propriedades a serem comparadas, o cmdlet mostra as diferenças.

Exemplo 6 - Comparando objetos complexos que implementam IComparable

Se o objeto implementar IComparable , o cmdlet procurará maneiras de comparar os objetos. Se os objetos forem de tipos diferentes, o objeto Difference será convertido para o tipo do ReferenceObject então comparado.

Neste exemplo, estamos comparando uma cadeia de caracteres com um objeto TimeSpan. No primeiro caso, a cadeia de caracteres é convertida em um TimeSpan para que os objetos sejam iguais.

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       <=

No segundo caso, o TimeSpan é convertido em uma cadeia de caracteres para que o objeto seja diferente.

Parâmetros

-CaseSensitive

Indica que as comparações devem diferenciar maiúsculas de minúsculas.

Propriedades dos parâmetros

Tipo:SwitchParameter
Default value:False
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-Culture

Especifica a cultura a ser usada para comparações.

Propriedades dos parâmetros

Tipo:String
Default value:None
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-DifferenceObject

Especifica os objetos que são comparados com a referência objetos.

Propriedades dos parâmetros

Tipo:

PSObject[]

Default value:None
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:1
Obrigatório:True
Valor do pipeline:True
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-ExcludeDifferent

Indica que esse cmdlet exibe apenas as características de objetos comparados que são iguais. As diferenças entre os objetos são descartadas.

Use ExcludeDifferent com IncludeEqual para exibir apenas as linhas que correspondem entre o de referência e diferença objetos.

Se ExcludeDifferent for especificado sem IncludeEqual , não haverá saída.

Propriedades dos parâmetros

Tipo:SwitchParameter
Default value:False
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-IncludeEqual

IncludeEqual exibe as correspondências entre o de referência e diferença objetos.

Por padrão, a saída também inclui as diferenças entre o de referência e diferença objetos.

Propriedades dos parâmetros

Tipo:SwitchParameter
Default value:False
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-PassThru

Quando você usa o parâmetro PassThru, omite o wrapper PSCustomObject em torno dos objetos comparados e retorna os objetos diferentes, inalterados.

Propriedades dos parâmetros

Tipo:SwitchParameter
Default value:False
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-Property

Especifica uma matriz de propriedades do de referência e diferença objetos a serem comparados.

O valor do parâmetro Property pode ser uma nova propriedade calculada. A propriedade calculada pode ser um bloco de script ou uma tabela de hash. Os pares chave-valor válidos são:

  • Expressão - <string> ou <script block>

Para mais informações, veja sobre_Propriedades_Calculadas.

Propriedades dos parâmetros

Tipo:

Object[]

Default value:None
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-ReferenceObject

Especifica uma matriz de objetos usados como referência para comparação.

Propriedades dos parâmetros

Tipo:

PSObject[]

Default value:None
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:0
Obrigatório:True
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

-SyncWindow

Especifica o número de objetos adjacentes que Compare-Object inspeciona ao procurar uma correspondência em uma coleção de objetos. Compare-Object examina objetos adjacentes quando não encontra o objeto na mesma posição em uma coleção. O valor padrão é [int32]::MaxValue, o que significa que Compare-Object examina toda a coleção de objetos.

Ao trabalhar com coleções grandes, o valor padrão pode não ser eficiente, mas é preciso. Especificar um valor menor para SyncWindow pode aumentar o desempenho, mas pode ter menor precisão.

Propriedades dos parâmetros

Tipo:Int32
Default value:[int32]::MaxValue
Suporta carateres universais:False
NãoMostrar:False

Conjuntos de parâmetros

(All)
Position:Named
Obrigatório:False
Valor do pipeline:False
Valor do pipeline por nome de propriedade:False
Valor dos restantes argumentos:False

CommonParameters

Este cmdlet suporta os parâmetros comuns: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction e -WarningVariable. Para obter mais informações, consulte about_CommonParameters.

Entradas

PSObject

Você pode enviar um objeto pelo pipeline para o parâmetro DifferenceObject.

Saídas

None

Por padrão, esse cmdlet não retorna nenhuma saída quando o ReferenceObject e o DifferenceObject são os mesmos.

PSCustomObject

Quando os objetos são diferentes, esse cmdlet encapsula os objetos diferentes em um wrapper de PSCustomObject com uma propriedade SideIndicator para fazer referência às diferenças.

Quando você usa o parâmetro IncludeEqual e os objetos são os mesmos, o cmdlet retorna os objetos encapsulados em um PSCustomObject com a propriedade SideIndicator definida como ==.

Quando você usa o parâmetro PassThru, o Tipo de do objeto não é alterado, mas a instância do objeto retornado tem um NoteProperty adicionado chamado SideIndicator. SideIndicator mostra a qual objeto de entrada a saída pertence.

Notas

O PowerShell inclui os seguintes aliases para Compare-Object:

  • Windows:
    • compare
    • diff

Ao usar o parâmetro PassThru, a saída exibida no console pode não incluir a propriedade SideIndicator. A exibição de formato padrão para a saída de tipo de objeto por Compare-Object não inclui a propriedade SideIndicator. Para obter mais informações, consulte Exemplo 3 neste artigo.