Compare-Object

Módulo: Microsoft.PowerShell.Utility

Compara dos conjuntos de objetos.

Sintaxis

Compare-Object <PSObject> <PSObject> >] 

Descripción

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

Compare-Objectcomprueba los 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 las cadenas. Puede proporcionar una o más propiedades que se utilizarán para la comparación. Cuando se proporcionan propiedades, el cmdlet compara sólo los valores de esas propiedades.

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

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

Algunos ejemplos utilizan splatting para reducir la longitud de las líneas de los ejemplos de código. Para más información, consulteabout_Splatting.

Ejemplos

Ejemplo 1 – Comparar el contenido de dos archivos de texto

Este ejemplo compara el contenido de dos archivos de texto. El ejemplo utiliza los siguientes dos archivos de texto, con cada valor en una línea separada.

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

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

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

Este ejemplo utiliza el parámetro ExcludeDifferent para comparar cada línea de contenido en dos archivos de texto.

A partir de PowerShell 7.1, cuando se utiliza el parámetro ExcludeDifferent, se infiere IncludeEqual y la salida sólo contiene líneas contenidas en ambos archivos, como muestra el SideIndicator(==).

$objects = @{ ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt) DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)}Compare-Object @objects -ExcludeDifferentInputObject SideIndicator----------- -------------bird ==

Ejemplo 3 – Mostrar la diferencia al utilizar el parámetro PassThru

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

  • El InputObject que se está comparando
  • La propiedad SideIndicator que muestra a qué objeto de entrada pertenece la salida

Cuando se utiliza el parámetro PassThru, el Type del objeto no se modifica pero la instancia del objeto devuelto tiene una NoteProperty añadida llamada SideIndicator. SideIndicatormuestra a qué objeto de entrada pertenece la salida.

Los siguientes ejemplos muestran los diferentes tipos de salida.

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

Cuando se utiliza PassThru, se devuelve el tipo de objeto original (System.Boolean). Observe cómo la salida mostrada por el formato por defecto para los objetos System.Boolean no mostraba la propiedadSideIndicator. Sin embargo, el objeto System.Boolean devuelto tiene la propiedadNoteProperty.

Ejemplo 4 – Comparar dos objetos simples utilizando propiedades

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

Compare-Object -ReferenceObject 'abc' -DifferenceObject 'xyz' -Property Length -IncludeEqualLength SideIndicator------ ------------- 3 ==

Ejemplo 5 – Comparar objetos complejos utilizando propiedades

Este ejemplo muestra el comportamiento al comparar objetos complejos. En este ejemplo almacenamos dos objetos de proceso diferentes para distintas instancias de PowerShell. Ambas variables contienen objetos de proceso con el mismo nombre. Cuando se comparan los objetos sin especificar el parámetro Property, el cmdlet considera que los objetos son iguales. Observe que el valor de theInputObject es el mismo que el resultado del método ToString(). Como la claseSystem.Diagnostics.Process no tiene la interfaz IComparable, el cmdletconvierte los objetos en cadenas y luego 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 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 <=

Cuando se especifican las propiedades 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 losobjetos son de tipos diferentes, el objeto Difference se convierte al tipo delReferenceObject y luego se compara.

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

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

En el segundo caso, el TimeSpan se convierte en una cadena por lo que los objetos son diferentes.

Parámetros

-Sensible a mayúsculas y minúsculas

Indica que las comparaciones deben ser sensibles a las mayúsculas y minúsculas.

Tipo: Parámetros de conmutación
Posición: Nombre
Valor por defecto: Falso
Acepta la entrada de la tubería: False
Acepta caracteres comodín: False
Cultura

Especifica la cultura a utilizar para las comparaciones.

Tipo: Cadena
Posición: Nombre
Valor por defecto: Ninguna
Acepta la entrada de la tubería: Falso
Acepta caracteres comodín: Falso
Objeto de diferencia

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

Tipo: PSObject
Posición: 1
Valor por defecto: Ninguna
Acepta la entrada de la tubería: Verdadero
Aceptar caracteres comodín: Falso
ExcluirDiferente

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

Use ExcludeDifferent con IncludeEqual para mostrar sólo las líneas que coinciden entre los objetos de diferencia y de diferencia.

Si se especifica ExcludeDifferent sin IncludeEqual, no hay salida.

Tipo: SwitchParameter
Position: Named
Valor por defecto: False
Acepta la entrada de la tubería: False
Aceptar caracteres comodín: False
IncludeEqual

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

Por defecto, la salida también incluye las diferencias entre los objetos de referencia y de diferencia.

Tipo: SwitchParameter
Posición: Nombre
Valor por defecto: Falso
Aceptar entrada de tuberías: Falso
Aceptar caracteres comodín: False
-PassThru

Cuando se utiliza el parámetro PassThru, Compare-Object omite la envoltura PSCustomObjectalrededor de los objetos comparados y devuelve los objetos diferentes, sin cambios.

Tipo: SwitchParameter
Posición: Nombre
Valor por defecto: False
Acepta la entrada de la tubería: False
Acepta caracteres comodín: False
Propiedades

Especifica una matriz de propiedades de los objetos referencia y diferencia 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 más información, consulteacerca dePropiedades_calculadas.

Tipo: Objeto
Posición: Nombre
Valor por defecto: Ninguna
Acepta la entrada de la tubería: Falso
Acepta caracteres comodín: Falso
Objeto de referencia

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

Tipo: PSObject
Posición: 0
Valor por defecto: Ninguna
Acepta la entrada de la tubería: Falso
Acepta caracteres comodín: Falso
-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 en una colección. El valor por defecto es ::MaxValue, lo que significa que Compare-Object examina toda la colección de objetos.

Tipo: Int32
Posición: Nombre
Valor por defecto: ::MaxValue
Acepta la entrada de la tubería: False
Acepta caracteres comodín: False

Inputs

PSObject

Puede enviar un objeto por la tubería al parámetro DifferenceObject.

Salidas

Ninguna

Si el objeto de referencia y el objeto de diferencia son iguales, no hay salida, a menos que utilice el parámetro IncludeEqual.

PSCustomObject

Si los objetos son diferentes, Compare-Objectenvuelve los objetos diferentes en un PSCustomObjectwrapper con una propiedad SideIndicator para hacer referencia a las diferencias.

Cuando se utiliza el parámetro PassThru, el Type del objeto no cambia pero la instancia del objeto devuelto tiene una NoteProperty añadida llamada SideIndicator. SideIndicatormuestra a qué objeto de entrada pertenece la salida.

Notas

Cuando se utiliza el parámetro PassThru, la salida mostrada en la consola puede no incluir la propiedadSideIndicator. La vista de formato por defecto del para la salida del tipo de objeto porCompare-Object no incluye la propiedad SideIndicator. Para más información consulte elEjemplo 3 de este artículo.

  • sobre_propiedades_calculadas
  • ParaCadaObjeto
  • Grupo-Objeto
  • Medida-Objeto
  • Nuevo-Object
  • Select-Object
  • Sort-Object
  • Tee-Object
  • Where-Object
  • Get-Process

Deja una respuesta

Tu dirección de correo electrónico no será publicada.