Compare-Object
Compara dos conjuntos de objetos.
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
[-SyncWindow <Int32>]
[-Property <Object[]>]
[-ExcludeDifferent]
[-IncludeEqual]
[-PassThru]
[-Culture <String>]
[-CaseSensitive]
[<CommonParameters>]
El cmdlet Compare-Object
compara dos conjuntos de objetos. Uno conjunto de objetos es el de referencia y el otro es el de 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 la referencia o la diferencia de objetos son nulos ($null
), Compare-Object
genera un error de terminación.
Algunos ejemplos usan la expansión para reducir la longitud de las líneas en los ejemplos de código. Para obtener más información, consulte about_Splatting.
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 <=
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, se deduce IncludeEqual y la salida solo contiene líneas contenidas en ambos archivos, como se muestra en el SideIndicator (==
).
$objects = @{
ReferenceObject = (Get-Content -Path C:\Test\Testfile1.txt)
DifferenceObject = (Get-Content -Path C:\Test\Testfile2.txt)
}
Compare-Object @objects -ExcludeDifferent
InputObject SideIndicator
----------- -------------
bird ==
Normalmente,
- El InputObject que se compara
- La propiedad SideIndicator que muestra a qué objeto de entrada pertenece la salida.
Cuando usas el parámetro PassThru, el Tipo del objeto no se cambia, pero la instancia del objeto devuelto tiene un añadido NoteProperty con el nombre SideIndicator. El 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 que muestra el formato predeterminado para objetos System.Boolean no mostraba la propiedad SideIndicator. Sin embargo, el objeto de System.Boolean devuelto tiene agregado NoteProperty.
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 ==
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.
Si el objeto implementa IComparable, el cmdlet busca formas de comparar los objetos. Si los objetos son de tipos diferentes, el objeto Difference se convierte al tipo del ReferenceObject y luego se compara.
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 se convierte en una cadena, por lo que los objetos son diferentes.
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 |
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 |
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 |
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 objeto de referencia y el objeto de 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 muestra las coincidencias entre los objetos de referencia y los objetos de diferencia.
De forma predeterminada, la salida también incluye las diferencias entre el objeto de referencia y el objeto de diferencia .
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
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 |
Especifica una matriz de propiedades de los objetos de referencia y de 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 |
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 |
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 |
Puede enviar un objeto a través de la canalización al parámetro DifferenceObject.
None
De forma predeterminada, este cmdlet no devuelve ninguna salida cuando el ReferenceObject de
Cuando los objetos son distintos, este cmdlet encapsula los objetos diferentes en un contenedor de PSCustomObject con una propiedad SideIndicator para referenciar las diferencias.
Cuando se utiliza el parámetro IncludeEqual y los objetos son los mismos, el cmdlet devuelve los objetos encapsulados en un PSCustomObject con la propiedad SideIndicator establecida en ==
.
Cuando usas el parámetro PassThru, el Tipo del objeto no se cambia, pero la instancia del objeto devuelto tiene un añadido NoteProperty con el nombre SideIndicator. El SideIndicator muestra a qué objeto de entrada pertenece la salida.
PowerShell incluye los siguientes alias para Compare-Object
:
- Windows:
compare
diff
Al utilizar 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 ejemplo 3 en este artículo.
Comentarios de PowerShell
PowerShell es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios: