Comparar objetos con PowerShell (Guía paso a paso)

Es cierto, comparar archivos o contenido de archivos en Windows es algo que has estado haciendo a lo largo de los años. Pero, ¿no te cansa la vista mirar archivos y contenido en algún momento? Bueno, afortunadamente para ti, puedes comparar objetos con PowerShell de la manera que desees con el comando Compare-Object.

En este tutorial, aprenderás a comparar objetos con PowerShell, como archivos o contenido de archivos, personalizando la salida.

¡Evita el cansancio de los ojos y compara objetos de manera efectiva!

Prerrequisitos

Este tutorial será una demostración práctica, pero siempre y cuando tengas una PC con Windows y PowerShell, estás listo para comenzar. En este tutorial se utiliza la versión 5.1 de PowerShell.

Comparando el Contenido de Archivos

Imagina que tienes dos archivos diferentes con el mismo contenido. ¿Cómo sabrías si ambos archivos tienen el mismo contenido? Ejecutar el comando Get-Content puede ser la solución. El comando Get-Content recupera el contenido de un archivo desde una ubicación especificada.

Abre PowerShell y ejecuta los siguientes comandos para obtener el contenido (Get-Content) de los archivos especificados en variables ($file1 y $file2). Reemplaza la ruta a continuación con la ruta de los archivos que elijas comparar.

# Obtén el contenido de los archivos de texto en variables
$file1 = Get-Content C:\\Temp\\File1.txt
$file2 = Get-Content C:\\Temp\\File2.txt
Storing Text File Contents to PowerShell Variables

Ahora, ejecuta el siguiente comando Compare-Object para comparar el contenido de $file (-ReferenceObject) con $file2 (-DifferenceObject).

Por defecto, Compare-Object no muestra los valores que están presentes en ambas variables. Como solución, agrega el parámetro -IncludeEqual para mostrar los valores en la salida.

Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -IncludeEqual

En la salida a continuación, el indicador de lado (SideIndicator) indica si ambos archivos tienen el mismo contenido (por línea) o no:

SideIndicator Definition
== Indicates the content is present in both files ($file1 and $file2).
=> Indicates the content only exists in the -DifferenceObject file ($file2).
=> Indicates the content only exists in the -ReferenceObject file ($file1).
Comparing File Contents

Tal vez prefieras comparar las cadenas con distinción entre mayúsculas y minúsculas. Si es así, agrega el parámetro -CaseSensitive ya que el comando Compare-Object no distingue entre mayúsculas y minúsculas de forma predeterminada.

Ejecuta los siguientes comandos para comparar $file1 con $file2, tanto con como sin distinción entre mayúsculas y minúsculas.

# Comparando el contenido de los archivos con el parámetro -CaseSensitive
Compare-Object $file1 $file2 -CaseSensitive
# Comparando el contenido de los archivos sin el parámetro -CaseSensitive
Compare-Object $file1 $file2

Como puedes ver a continuación, sin el parámetro -CaseSensitive, el comando Compare-Object no muestra powershell en la salida.

Compare Objects wth PowerShell : Comparing File Contents with Case Sensitivity

Comparar cadenas también es similar a comparar el contenido de archivos, donde puedes especificar las cadenas o usar variables para representar las cadenas a comparar. Ten en cuenta que el comando Compare-Object compara cadenas de origen y no caracteres.

Comparar listas de archivos de diferentes ubicaciones

Ahora que sabes cómo comparar el contenido de archivos, ¿por qué no comparar archivos reales de diferentes ubicaciones? Comparar listas de archivos es útil cuando estás administrando dos servidores diferentes donde tienes la misma carpeta para un servicio que contiene los mismos archivos.

En esta ocasión, usarás el comando Get-ChildItem para obtener la lista de archivos de una carpeta y compararla con la lista de archivos de otra carpeta.

Ejecuta los siguientes comandos para obtener las listas de archivos de las carpetas C:\Temp\Folder1\ y C:\Temp\Folder2 y guarda las listas en las variables $Folder1List y $Folder2List.

# Captura la lista de nombres de archivo en variables
$Folder1List = Get-ChildItem C:\\Temp\\Folder1\\
$Folder2List = Get-ChildItem C:\\Temp\\Folder2\\
# Comparar las listas
Compare-Object $Folder1List $Folder2List -IncludeEqual

También puedes usar el parámetro -Recurse en el comando Get-ChildItem para obtener de forma recursiva una lista de archivos en subcarpetas.

Comparing Files in Different Folders

Comparar objetos con PowerShell por propiedades

Acabas de comparar archivos en diferentes ubicaciones, pero es posible que desees agregar otra opción para comparar archivos por propiedades. Y en esta demostración, compararás archivos por último horario de acceso.

Ejecuta los siguientes comandos para comparar archivos de diferentes carpetas ($Folder1 y $Folder2) por último horario de acceso.

# Obtener lista de archivos de las ubicaciones especificadas
$Folder1 = Get-ChildItem C:\\Temp\\Folder1\\ -Recurse
$Folder2 = Get-ChildItem C:\\Temp\\Folder2\\ -Recurse
# Comparar archivos por último horario de acceso junto con los nombres de archivo
Compare-Object $Folder1 $Folder2 -Property name,lastaccesstime
Listing Compared Files using the lastaccesstime Parameter

Comparar procesos y servicios

Las capacidades del comando Compare-Object no se limitan solo a comparar cadenas o contenido en archivos. También puedes comparar procesos, servicios, y así sucesivamente.

Tal vez quieras capturar los servicios entre dos servidores. Si es así, puedes almacenar los servicios en variables y compararlos.

Ejecuta los siguientes comandos para comparar servicios entre dos servidores diferentes ($server1 y $server2).

# Capturar la lista de servicios en variables
$server1 = Get-Service -ComputerName jumpbox
$server2 = Get-Service -ComputerName AD
# Comparar servicios en ambos servidores y ordenarlos según el nombre del servicio
Compare-Object $server1 $server2 -PassThru | sort name| select name,status,machinename
Comparing Services Between Two Servers

Si prefieres comparar procesos, los comandos a ejecutar son similares a los de comparar servicios. También puedes comparar procesos en la misma máquina o en dos servidores diferentes.

Ejecuta los siguientes comandos para capturar los procesos en ejecución de dos máquinas (Jumpbox y servidores AD) en variables y compararlos.

# Obtener la lista de procesos de servidores remotos en variables de PowerShell
$server1Process = Get-Process -ComputerName Jumpbox
$server2Process = Get-Process -ComputerName AD
# Comparar los procesos de dos servidores y listar los nombres de los procesos y el nombre del servidor correspondiente en la salida
Compare-Object $server1Process $server2Process -PassThru | sort name  |select name,machinename,sideindicator
Comparing Processes Between Two Servers

Identificación de actividades mediante la comparación de listas de procesos

El cmdlet Compare-Object también es útil en algunos escenarios de solución de problemas. ¿Cómo? Puedes capturar los procesos en ejecución actual en una variable y comenzar tu actividad. Luego capturas los procesos en ejecución en una nueva variable y los comparas con los nuevos procesos.

Ejecuta los siguientes comandos para identificar actividades comparando dos listas diferentes de procesos capturados.

# Captura los procesos antes de comenzar tu actividad.
$Initial_Process = Get-Process
# Abre el bloc de notas (tu actividad)
notepad
# Captura los procesos después de que tu actividad se complete.
$New_Process = Get-Process
# Comparación de procesos iniciales y nuevos
Compare-Object $Initial_Process $New_Process -PassThru | select processname,sideindicator
Identifying New Processes on Local PC

Comparación de usuarios entre diferentes grupos de Active Directory

Si estás administrando el mismo conjunto de usuarios desde diferentes grupos de AD, la comparación de la lista de usuarios con el comando Compare-Object te será útil. Haciendo esto, puedes estar atento si un usuario falta en alguno de los dos grupos de AD diferentes.

Ejecuta los siguientes comandos para comparar usuarios entre dos grupos de AD diferentes (staticvmusers y vdivmusers).

# Importar el módulo de Active Directory para ejecutar los comandos Get-ADGroup y Get-ADUser.
Import-Module ActiveDirectory
# Almacenar la lista de usuarios de diferentes grupos de AD en variables.
$FirstGroup = Get-ADGroup staticvmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
$SecondGroup = Get-ADGroup vdivmusers -Properties Member |Select-Object -ExpandProperty Member | Get-ADUser
# Ejecutar el cmdlet Compare-Object para comparar los usuarios en esos dos grupos de AD.
Compare-Object ($FirstGroup) ($SecondGroup) -Property 'SamAccountName' -IncludeEqual
Comparing Users in Two AD Groups

Conclusión

En este tutorial, has aprendido cómo comparar objetos con PowerShell de muchas maneras, desde el contenido de archivos hasta usuarios en grupos de AD. Te has dado cuenta de que el cmdlet Compare-Object es una solución rápida para comparar archivos, servicios, procesos, y más.

Has adquirido los conocimientos básicos para utilizar el cmdlet Compare-Object. Ahora, ¿por qué no aprovechar este conocimiento recién adquirido y aprender sobre poderosas comparaciones de arreglos en PowerShell?

Source:
https://adamtheautomator.com/compare-objects-with-powershell/