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 ==
) indica que el valor está en ambos objetos.
Si el de referencia de
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.
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
$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,
-
InputObject que se compara - La propiedad
SideIndicator que muestra a qué objeto de entrada pertenece la salida.
Cuando se usa el parámetro
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
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
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
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
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
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
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
Especifica una matriz de propiedades del de referencia de
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, vea 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 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
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
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
Cuando se usa el parámetro
Notas
PowerShell incluye los siguientes alias para Compare-Object
:
- Windows:
compare
diff
Al usar el parámetro Compare-Object
no incluye la propiedad SideIndicator. Para obtener más información, vea ejemplo 3 en este artículo.