Compare-Object
Compara dois conjuntos de objetos.
Sintaxe
Default (Default)
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 se há métodos disponíveis para comparar um objeto inteiro. Se ele não encontrar um método adequado, ele chamará o ToString() métodos dos objetos de entrada e comparará 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 no objeto de referência ==) indicará que o valor está em ambos os objetos.
Se a referência ou a diferença objetos forem nulos ($null), Compare-Object 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 arquivos 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.txtcontém os valores: cachorro, esquilo e pássaro. -
Testfile2.txtconté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é a diferença objeto (=>). Linhas com conteúdo 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 – 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 é inferido 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 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 NotePropertyadicionado.
Exemplo 4 – Comparar dois objetos simples usando propriedades
Neste exemplo, comparamos duas cadeias de caracteres diferentes que têm o mesmo comprimento.
Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -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 método ToString(). Como a classe System.Diagnostics.Process 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 as 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 tipos diferentes, o objeto Difference será convertido no tipo do ReferenceObject, em seguida, comparado.
Neste exemplo, estamos comparando uma cadeia de caracteres a 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 do parâmetro
| Tipo: | SwitchParameter |
| Valor padrão: | False |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | False |
-Culture
Especifica a cultura a ser usada para comparações.
Propriedades do parâmetro
| Tipo: | String |
| Valor padrão: | None |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | False |
-DifferenceObject
Especifica os objetos que são comparados com a referência objetos.
Propriedades do parâmetro
| Tipo: | PSObject[] |
| Valor padrão: | None |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | 1 |
| Obrigatório: | True |
| Valor do pipeline: | True |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | 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
Se ExcludeDifferent for especificado sem IncludeEqual, não haverá saída.
Propriedades do parâmetro
| Tipo: | SwitchParameter |
| Valor padrão: | False |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | False |
-IncludeEqual
Por padrão, a saída também inclui as diferenças entre os de referência
Propriedades do parâmetro
| Tipo: | SwitchParameter |
| Valor padrão: | False |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | False |
-PassThru
Quando você usa o parâmetro
Propriedades do parâmetro
| Tipo: | SwitchParameter |
| Valor padrão: | False |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | False |
-Property
Especifica uma matriz de propriedades do de referência e diferença objetos a serem comparados.
O valor do parâmetro da Propriedade
- Expressão –
<string>ou<script block>
Para obter mais informações, consulte about_Calculated_Properties.
Propriedades do parâmetro
| Tipo: | Object[] |
| Valor padrão: | None |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | False |
-ReferenceObject
Especifica uma matriz de objetos usada como referência para comparação.
Propriedades do parâmetro
| Tipo: | PSObject[] |
| Valor padrão: | None |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | 0 |
| Obrigatório: | True |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | 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 grandes coleções, 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 do parâmetro
| Tipo: | Int32 |
| Valor padrão: | [Int32]::MaxValue |
| Dá suporte a curingas: | False |
| DontShow: | False |
Conjuntos de parâmetros
(All)
| Cargo: | Named |
| Obrigatório: | False |
| Valor do pipeline: | False |
| Valor do pipeline pelo nome da propriedade: | False |
| Valor dos argumentos restantes: | 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
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 referenciar as 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 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.
Observações
O PowerShell inclui os seguintes aliases para Compare-Object:
- Windows:
comparediff
Ao usar o parâmetro PassThru, a saída exibida no console pode não incluir a propriedade SideIndicator. O modo de exibição de formato padrão para a saída do tipo de objeto por Compare-Object não inclui a propriedade SideIndicator. Para obter mais informações, consulte Exemplo 3 neste artigo.