Compartir a través de


Compare-Object

Compara dos conjuntos de objetos.

Sintaxis

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

Description

El cmdlet Compare-Object compara dos conjuntos de objetos. Un conjunto de objetos es el de referenciay 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 la diferencia objeto (). Si se usa el parámetro IncludeEqual , (==) indica que el valor está en ambos objetos.

Si el de referencia de o la diferencia de objetos son null (), 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, vea 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. es el objeto de referencia () y es la diferencia objeto (). 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 el sideIndicator de ().

$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, devuelve un tipo de PSCustomObject con las siguientes propiedades:

  • InputObject que se compara
  • La propiedad SideIndicator que muestra a qué objeto de entrada pertenece la salida.

Cuando se usa el parámetro PassThru, el Type de del objeto no se cambia, pero la instancia del objeto devuelto tiene un NoteProperty denominado SideIndicator. 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===

Al usar PassThru, se devuelve el tipo de objeto original (System.Boolean). Observe cómo la salida mostrada por el formato predeterminado para objetos System.Boolean no mostraba la propiedad sideIndicator de . Sin embargo, el objeto de System.Boolean devuelto tiene agregado NoteProperty.

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 del InputObject de 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 del ReferenceObject, a continuación, comparado.

En este ejemplo, estamos comparando una cadena con un objeto TimeSpan . En el primer caso, la cadena se convierte en un 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, el timeSpan de se convierte en una cadena para que el objeto sea diferente.

Parámetros

-CaseSensitive

Indica que las comparaciones deben distinguir mayúsculas de minúsculas.

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Culture

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

Tipo:String
Posición:Named
Valor predeterminado:None
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-DifferenceObject

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

Tipo:PSObject[]
Posición:1
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:True
Aceptar caracteres comodín: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 el de referencia de y diferencia objetos.

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

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-IncludeEqual

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

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

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-PassThru

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

Tipo:SwitchParameter
Posición:Named
Valor predeterminado:False
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

-Property

-ReferenceObject

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

Tipo:PSObject[]
Posición:0
Valor predeterminado:None
Requerido:True
Aceptar entrada de canalización:False
Aceptar caracteres comodín: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 menor precisión.

Tipo:Int32
Posición:Named
Valor predeterminado:[Int32]::MaxValue
Requerido:False
Aceptar entrada de canalización:False
Aceptar caracteres comodín:False

Entradas

PSObject

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

Salidas

None

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

PSCustomObject

Cuando los objetos son diferentes, este cmdlet ajusta los objetos diferentes en un contenedor de 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 ajustados en un PSCustomObject con la propiedad SideIndicator establecida en .

Cuando se usa el parámetro PassThru, el Type de del objeto no se cambia, pero la instancia del objeto devuelto tiene un NoteProperty denominado SideIndicator. 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 de . 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 ejemplo 3 en este artículo.