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 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.txt
es 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 usan los parámetros IncludeEqual y ExcludeDifferent para comparar cada línea de contenido en dos archivos de texto.
Dado que el comando usa el parámetro ExcludeDifferent , 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 -IncludeEqual -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.
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 en 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 los objetos de referencia .
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 los objetos de referencia y diferencia .
Si se especifica ExcludeDifferent 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 los objetos de referencia y diferencia .
De forma predeterminada, la salida también incluye las diferencias entre los objetos de referencia y diferencia .
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | 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.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | 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.
Tipo: | Object[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-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 precisión menor.
Tipo: | Int32 |
Posición: | Named |
Valor predeterminado: | [Int32]::MaxValue |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
Entradas
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.
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 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
Windows PowerShell incluye los siguientes alias para Compare-Object
:
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.