Compare-Object

Compara dos conjuntos de objetos.

Syntax

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

Description

El Compare-Object cmdlet compara dos conjuntos de objetos. Un conjunto de objetos es la referencia y el otro conjunto de objetos es la diferencia.

Compare-Object comprueba si hay métodos disponibles para comparar un objeto completo. Si no encuentra un método adecuado, llama a los métodos ToString() de los objetos de entrada y compara los resultados de la cadena. Puede proporcionar una o varias propiedades que se usarán para la comparación. Cuando se proporcionan propiedades, el cmdlet compara solo los valores de esas propiedades.

El resultado de la comparación indica si un valor de propiedad solo apareció en el objeto de referencia (<=) o solo en el objeto de diferencia (=>). Si se usa el parámetro IncludeEqual , (==) indica que el valor está en ambos objetos.

Si la referencia o los objetos de diferencia son null ($null), Compare-Object genera un error de terminación.

Algunos ejemplos usan la expansión para reducir la longitud de línea de los ejemplos de código. Para obtener más información, consulte about_Splatting.

Ejemplos

Ejemplo 1: Comparación del contenido de dos archivos de texto

En este ejemplo se compara el contenido de dos archivos de texto. En el ejemplo se usan los dos archivos de texto siguientes, con cada valor en una línea independiente.

  • Testfile1.txt contiene los valores: perro, ardilla y pájaro.
  • Testfile2.txt contiene los valores: gato, pájaro y racoon.

La salida muestra solo las líneas que son diferentes entre los archivos. Testfile1.txt es el objeto de referencia (<=) y Testfile2.txtes el objeto de diferencia (=>). No se muestran líneas con contenido que aparecen en ambos archivos.

Compare-Object -ReferenceObject (Get-Content -Path C:\Test\Testfile1.txt) -DifferenceObject (Get-Content -Path C:\Test\Testfile2.txt)

InputObject SideIndicator
----------- -------------
cat         =>
racoon      =>
dog         <=
squirrel    <=

Ejemplo 2: Comparar cada línea de contenido y excluir las diferencias

En este ejemplo se usa el parámetro ExcludeDifferent para comparar cada línea de contenido en dos archivos de texto.

A partir de PowerShell 7.1, cuando se usa el parámetro ExcludeDifferent , IncludeEqual se deduce y la salida solo contiene líneas contenidas en ambos archivos, como se muestra en 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        ==

Ejemplo 3: Mostrar la diferencia al usar el parámetro PassThru

Normalmente, Compare-Object devuelve un tipo PSCustomObject con las siguientes propiedades:

  • InputObject que se va a comparar
  • Propiedad SideIndicator que muestra a qué objeto de entrada pertenece la salida.

Cuando se usa el parámetro PassThru , el tipo del objeto no cambia, pero la instancia del objeto devuelto tiene una propiedad NoteProperty denominada SideIndicator agregada. SideIndicator muestra a qué objeto de entrada pertenece la salida.

En los ejemplos siguientes se muestran los distintos tipos de salida.

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

Cuando se usa PassThru, se devuelve el tipo de objeto original (System.Boolean). Observe cómo la salida mostrada por el formato predeterminado para los objetos System.Boolean no mostraba la propiedad SideIndicator . Sin embargo, el objeto System.Boolean devuelto tiene la propiedad NoteProperty agregada.

Ejemplo 4: Comparación de dos objetos simples mediante propiedades

En este ejemplo, se comparan dos cadenas diferentes que tienen la misma longitud.

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqual

Length SideIndicator
------ -------------
     3 ==

Ejemplo 5: Comparación de objetos complejos mediante propiedades

En este ejemplo se muestra el comportamiento al comparar objetos complejos. En este ejemplo se almacenan dos objetos de proceso diferentes para instancias diferentes de PowerShell. Ambas variables contienen objetos de proceso con el mismo nombre. Cuando los objetos se comparan sin especificar el parámetro Property , el cmdlet considera que los objetos son iguales. Observe que el valor de InputObject es el mismo que el resultado del método ToString(). Dado que la clase System.Diagnostics.Process no tiene la interfaz IComparable , el cmdlet convierte los objetos en cadenas y, a continuación, compara los 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 <=

Al especificar las propiedades que se van a comparar, el cmdlet muestra las diferencias.

Ejemplo 6: Comparación de objetos complejos que implementan IComparable

Si el objeto implementa IComparable, el cmdlet busca formas de comparar los objetos. Si los objetos son tipos diferentes, el objeto Difference se convierte en el tipo de ReferenceObject y, a continuación, se compara.

En este ejemplo, estamos comparando una cadena con un objeto TimeSpan . En el primer caso, la cadena se convierte en timeSpan para que los objetos sean iguales.

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

En el segundo caso, TimeSpan se convierte en una cadena para que el objeto sea diferente.

Parámetros

-CaseSensitive

Indica que las comparaciones deben distinguir entre mayúsculas y minúsculas.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Culture

Especifica la referencia cultural que se va a usar en las comparaciones.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DifferenceObject

Especifica los objetos que se comparan con los objetos de referencia .

Type:PSObject[]
Position:1
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-ExcludeDifferent

Indica que este cmdlet muestra solo las características de los objetos comparados que son iguales. Las diferencias entre los objetos se descartan.

Use ExcludeDifferent con IncludeEqual para mostrar solo las líneas que coinciden entre los objetos de referencia y diferencia .

Si se especifica ExcludeDifferent sin IncludeEqual, no hay ninguna salida.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-IncludeEqual

IncludeEqual muestra las coincidencias entre los objetos de referencia y diferencia .

De forma predeterminada, la salida también incluye las diferencias entre los objetos de referencia y diferencia .

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

Al usar el parámetro PassThru , Compare-Object omite el contenedor PSCustomObject alrededor de los objetos comparados y devuelve los objetos diferentes, sin cambios.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Property

Especifica una matriz de propiedades de los objetos de referencia y diferencia que se van a comparar.

El valor del parámetro Property puede ser una nueva propiedad calculada. La propiedad calculada puede ser un bloque de script o una tabla hash. Los pares clave-valor válidos son:

  • Expresión: <string> o <script block>

Para obtener más información, consulte about_Calculated_Properties.

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ReferenceObject

Especifica una matriz de objetos usados como referencia para la comparación.

Type:PSObject[]
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-SyncWindow

Especifica el número de objetos adyacentes que Compare-Object inspecciona mientras busca una coincidencia en una colección de objetos . Compare-Object examina los objetos adyacentes cuando no encuentra el objeto en la misma posición de una colección. El valor predeterminado es [Int32]::MaxValue, lo que significa que Compare-Object examina toda la colección de objetos.

Al trabajar con colecciones grandes, es posible que el valor predeterminado no sea eficaz, pero es preciso. Especificar un valor más pequeño para SyncWindow puede aumentar el rendimiento, pero podría tener una precisión menor.

Type:Int32
Position:Named
Default value:[Int32]::MaxValue
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Entradas

PSObject

Puede enviar un objeto a la canalización al parámetro DifferenceObject .

Salidas

None

De forma predeterminada, este cmdlet no devuelve ninguna salida cuando ReferenceObject y DifferenceObject son los mismos.

PSCustomObject

Cuando los objetos son diferentes, este cmdlet ajusta los objetos diferentes en un contenedor PSCustomObject con una propiedad SideIndicator para hacer referencia a las diferencias.

Cuando se usa el parámetro IncludeEqual y los objetos son los mismos, el cmdlet devuelve los objetos encapsulados en un PSCustomObject con la propiedad SideIndicator establecida ==en .

Cuando se usa el parámetro PassThru , el tipo del objeto no cambia, pero la instancia del objeto devuelto tiene una propiedad NoteProperty denominada SideIndicator agregada. SideIndicator muestra a qué objeto de entrada pertenece la salida.

Notas

PowerShell incluye los siguientes alias para Compare-Object:

  • Windows:
    • compare
    • diff

Al usar el parámetro PassThru , es posible que la salida mostrada en la consola no incluya la propiedad SideIndicator . La vista de formato predeterminada para la salida del tipo de objeto por Compare-Object no incluye la propiedad SideIndicator . Para obtener más información, vea El ejemplo 3 de este artículo.