Compara dos conjuntos de objetos.
- Sintaxis
- Descripción
- Ejemplos
- Ejemplo 1 – Comparar el contenido de dos archivos de texto
- Ejemplo 2 – Comparar cada línea de contenido y excluir las diferencias
- Ejemplo 3 – Mostrar la diferencia al utilizar el parámetro PassThru
- Ejemplo 4 – Comparar dos objetos simples utilizando propiedades
- Ejemplo 5 – Comparar objetos complejos utilizando propiedades
- Ejemplo 6 – Comparación de objetos complejos que implementan IComparable
- Parámetros
- Inputs
- Salidas
- Notas
Sintaxis
Compare-Object <PSObject> <PSObject> >]
Descripción
El cmdlet Compare-Object
compara dos conjuntos de objetos. Un conjunto de objetos es la referencia, y el otro conjunto de objetos es la diferencia.
Compare-Object
comprueba 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
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 |
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 |
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 |
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 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 |
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 |
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 |
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 |
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-Object
envuelve los objetos diferentes en un PSCustomObject
wrapper 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